Libraryless. Click here for Pure Java version (11595L/70K).
sclass PianoSampler2 > SlidingWindow { macro dprint { if (debug) printVars } bool debug; bool printFactor; gettable L<Frequency> frequencies; Double fixedFactor; *(int *channels, double *sampleRate, IQuerySound *sound, int *start, int *length) { init(); } *() { init(); } void init { frequencies = pianoFrequencies88(); } long haarFeaturesChecked; // one channel L<Complex> measureWindow() { ret measureWindow(bounds()); } L<Complex> measureWindow(DoubleRange timeRange, Cl<Freq> frequencies default frequencies()) { int channel = 0; moveToCenter(iround(timeRange.center())); ret map(frequencies(), f -> { var interval = f.interval()*sampleRate; int period1 = iceil(doubleRatio(timeRange.start, interval)); int period2 = ifloor(doubleRatio(timeRange.end, interval))-1; if (period2 <= period1) ret complex(0); int periods = period2-period1; SumOfVibrations sum = new(this, channel, period1*interval, f!, periods); haarFeaturesChecked += periods*2; ret sum.complexSum(); }); } Frequency lowestFrequency() { ret first(frequencies); } Frequency highestFrequency() { ret last(frequencies); } int minWindowSizeForBase() { ret iceil(sampleRate*lowestFrequency().interval()); } void makeWindow(DoubleRange r) { start = ifloor(r.start); length = iceil(r.end())-start; grab(); } void makeWindowAround(double t, double size) { double start = max(0, t-size)/2; makeWindow(DoubleRange(start, start+size)); } S stats() { ret renderVars(+haarFeaturesChecked); } IIntegralImage imageColumn(L<Complex> intensities) { int n = l(intensities); double[] col = new[n]; for y to n: col[n-y-1] = abs(intensities.get(y)); double factor = fixedFactor != null ? fixedFactor : normalizationFactor(col, 255); if (printFactor) printVars(+factor, log := log10(factor)); double[] col2 = doubleMul(col, factor); ret bwIntegralImageFromFunction(1, n, (x, y) -> ifloor(col2[y])); } void loadSound(IQuerySound sound, int channels) { this.sound = sound; this.channels = channels; } }
Began life as a copy of #1032970
download show line numbers debug dex old transpilations
Travelled to 3 computer(s): bhatertpkbcr, ekrmjmnbrukm, mqqgnosmbjvj
No comments. add comment
Snippet ID: | #1033037 |
Snippet name: | PianoSampler2 [much simpler, seems to produce a nice image] |
Eternal ID of this version: | #1033037/21 |
Text MD5: | 4792046791d8d3021c0ef31921f8db2f |
Transpilation MD5: | 1eb0ff1bb7d5dcbf3ae4b40c699a3a7e |
Author: | stefan |
Category: | javax / audio analysis |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2021-10-12 15:22:43 |
Source code size: | 2281 bytes / 77 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 206 / 362 |
Version history: | 20 change(s) |
Referenced in: | #1034167 - Standard Classes + Interfaces (LIVE, continuation of #1003674) |