Uses 11894K of libraries. Click here for Pure Java version (20559L/135K).
| 1 | sclass ContinuousOscillators_TestAudioRestoration_v2 {
 | 
| 2 | S audioURL = "https://mouth.gazelle.rocks/beaHTML/15/5502%2Frecognize+-+61351880347bd84b28c7f42d779cde94.mp3"; | 
| 3 | |
| 4 | short[] inputSamples; | 
| 5 | double inputSampleRate = 48000; | 
| 6 | |
| 7 | settable bool separateFrequencies; | 
| 8 | settable bool cumulative; | 
| 9 | settable bool subtractive; | 
| 10 | settable bool separateRealAndImag; | 
| 11 | settable bool playRestored; | 
| 12 | settable bool showImage; | 
| 13 | settable bool printAllIntensities; | 
| 14 | bool useInputSampleRate = true; | 
| 15 | double silence = 0.2; | 
| 16 | double minFreq = 0, maxFreq = 48000; | 
| 17 | int useEveryNthOscillator = 1; | 
| 18 | |
| 19 | short[] resampled; | 
| 20 | new L<double[]> audioOutput; | 
| 21 | File wavOut; | 
| 22 | |
| 23 | new ContinuousOscillators_v2 co; | 
| 24 | |
| 25 |   void loadAudioURL {
 | 
| 26 | File mp3 = loadBinaryPageOnce(audioURL); | 
| 27 | loadMP3(mp3); | 
| 28 | } | 
| 29 | |
| 30 |   void loadMP3(File mp3) {
 | 
| 31 | printFileInfo(+mp3); | 
| 32 | File wav = mp3ToWAVUnlessExists(mp3, replaceExtension(mp3, ".mp3", ".wav")); | 
| 33 | loadWAV(wav); | 
| 34 | } | 
| 35 | |
| 36 |   void loadWAV(File wav) {
 | 
| 37 | //playWAV(wav); | 
| 38 | printFileInfo(+wav); | 
| 39 | wavOut = appendToBaseFileName(wav, ".restored"); | 
| 40 | |
| 41 | temp WAVDecoder decoder = new(wav); | 
| 42 | print(sampleRate := decoder.sampleRate); | 
| 43 | int n = decoder.totalValues(); | 
| 44 | inputSamples = decodeWAVToMonoSamples(decoder, n); | 
| 45 | inputSampleRate = decoder.sampleRate; | 
| 46 | } | 
| 47 | |
| 48 | // assumes soundSource is using the default inputSampleRate | 
| 49 |   void setAudio(double seconds, VF1<double[]> soundSource) {
 | 
| 50 | inputSamples = concatShortArrays(soundSourceToShortArrays(seconds, soundSource, 1)); | 
| 51 | print(inputSamples := sfu(takeFirst(10, inputSamples)); | 
| 52 | } | 
| 53 | |
| 54 |   run {
 | 
| 55 | if (useInputSampleRate) co.sampleRate = inputSampleRate; | 
| 56 | resampled = convertSampleRate_shortArray_simple(inputSampleRate, co.sampleRate, inputSamples); | 
| 57 | print(samples := l(resampled)); | 
| 58 | |
| 59 | co.setAudio(new StaticAudioSample(ll(resampled), 1, co.sampleRate)); | 
| 60 | |
| 61 |     if (subtractive) co.onEscalating(o -> {
 | 
| 62 |       print("Escalating " + o);
 | 
| 63 | var data = co.subtractedAudio.toDoubleArray(); | 
| 64 | audioOutput.add(data); | 
| 65 |       print("Got samples: " + l(data));
 | 
| 66 | }); | 
| 67 | |
| 68 | // START CALCULATION | 
| 69 | co.stepTo(co.audio.bounds()); | 
| 70 | |
| 71 | print(coverageByFreq := co.coverageByFreq()); | 
| 72 | |
| 73 | restoreAudio(); | 
| 74 | double[] audio = concatDoubleArrays(audioOutput); | 
| 75 | double[] audioNorm = normalizeDoubles(audio, 32767); | 
| 76 | |
| 77 |     if (wavOut != null) {
 | 
| 78 | shortArrayToMonoWAVE(doubleToShortArray_iround(audioNorm), wavOut, co.sampleRate); | 
| 79 | printFileInfo(+wavOut); | 
| 80 | if (playRestored) playWAV(wavOut); | 
| 81 | } | 
| 82 | |
| 83 | print(audioNorm := sfu(takeFirst(10, audioNorm)); | 
| 84 | |
| 85 | double pixelsPerSecond = 100; | 
| 86 | if (showImage) | 
| 87 | dm_showPixelatedImage(co.image(co.audio.bounds(), pixelsPerSecond)); | 
| 88 | } | 
| 89 | |
| 90 |   void restoreAudio {
 | 
| 91 | L<ContinuousOscillators_v2.Oscillator> oscillators = new L; | 
| 92 | //double ratio = 2; // octave | 
| 93 | int nOscillators = l(co.oscillators); | 
| 94 | var lOsc = asList(co.oscillators); | 
| 95 | |
| 96 |     for i to nOscillators: {
 | 
| 97 | if ((i % useEveryNthOscillator) == 0) | 
| 98 | oscillators.add(lOsc.get(i)); | 
| 99 | } | 
| 100 | |
| 101 | oscillators = filter(oscillators, o -> between(o.frequency()!, minFreq, maxFreq)); | 
| 102 | |
| 103 |     print("Using " + nFrequencies(oscillators) + ": " + map(oscillators, o -> formatDouble(o.frequency()!, 1));
 | 
| 104 | |
| 105 |     if (separateFrequencies) {
 | 
| 106 | wavOut = appendToBaseFileName(wavOut, ".separate"); | 
| 107 | double[] cum = null; | 
| 108 | |
| 109 |       for (o : oscillators) {
 | 
| 110 | if (printAllIntensities) pnl(map(o.intensities, (k, v) -> | 
| 111 | o.frequency() + " " + formatDouble(k, 1) + " = " + renderComplexWithAngle(div(v.first(), l(k)*32767)))); | 
| 112 | //co.toAudio_shouldPrint = (i, n) -> i < 30 || i >= n-10; | 
| 113 |         for (xx : separateRealAndImag ? ll(1, 2) : ll(0)) {
 | 
| 114 | co.realOnly = (xx & 1) != 0; | 
| 115 | co.imagOnly = (xx & 2) != 0; | 
| 116 | double[] newAudio = co.toAudio(ifloor(co.audio.bounds()), ll(o)); | 
| 117 |           /*if (subtractive) {
 | 
| 118 | audioOutput.add(co.subtractedAudio.toDoubleArray()); | 
| 119 |           } else*/ {
 | 
| 120 | if (cumulative) cum = newAudio = doubleAdd(cum, newAudio); | 
| 121 | audioOutput.add(newAudio); | 
| 122 | audioOutput.add(repDouble(iround(co.sampleRate*silence), 0)); | 
| 123 | } | 
| 124 | |
| 125 | co.toAudio_shouldPrint = null; | 
| 126 | co.realOnly = co.imagOnly = false; | 
| 127 | } | 
| 128 | } | 
| 129 | } | 
| 130 | |
| 131 | audioOutput.add(co.toAudio(ifloor(co.audio.bounds()), oscillators)); | 
| 132 | } | 
| 133 | } | 
Began life as a copy of #1033253
download show line numbers debug dex old transpilations
Travelled to 3 computer(s): bhatertpkbcr, mowyntqkapby, mqqgnosmbjvj
No comments. add comment
| Snippet ID: | #1033273 | 
| Snippet name: | ContinuousOscillators_TestAudioRestoration_v2 | 
| Eternal ID of this version: | #1033273/16 | 
| Text MD5: | 46f245a9b45cd191fb4d20f1b01a71ff | 
| Transpilation MD5: | d68b0626a7fbbd6ba251539274254082 | 
| Author: | stefan | 
| Category: | javax / speech | 
| Type: | JavaX fragment (include) | 
| Public (visible to everyone): | Yes | 
| Archived (hidden from active list): | No | 
| Created/modified: | 2021-10-18 08:50:13 | 
| Source code size: | 4515 bytes / 133 lines | 
| Pitched / IR pitched: | No / No | 
| Views / Downloads: | 388 / 562 | 
| Version history: | 15 change(s) | 
| Referenced in: | [show references] |