40 lines
1.4 KiB
Haxe
40 lines
1.4 KiB
Haxe
package funkin.backend.utils;
|
|
|
|
import flixel.sound.FlxSound;
|
|
import lime.media.AudioBuffer;
|
|
|
|
// Thank you yosh :DDD -lunar
|
|
// (https://github.com/FNF-CNE-Devs/YoshiCrafterEngine/blob/main/source/WaveformSprite.hx)
|
|
class AudioAnalyzer {
|
|
public var buffer:AudioBuffer;
|
|
var __peakByte:Float = 0;
|
|
var __timeMulti:Float = 0;
|
|
|
|
public function new(sound:FlxSound) {
|
|
@:privateAccess buffer = sound._sound.__buffer;
|
|
|
|
__peakByte = Math.pow(2, buffer.bitsPerSample-1)-1;
|
|
|
|
__timeMulti = 1 / (1 / buffer.sampleRate);
|
|
__timeMulti *= buffer.bitsPerSample;
|
|
__timeMulti -= __timeMulti % buffer.bitsPerSample;
|
|
}
|
|
|
|
public function analyze(startPos:Float, endPos:Float):Float {
|
|
var bytesStartPos:Int = Math.floor(startPos * __timeMulti / 4000 / buffer.bitsPerSample) * buffer.bitsPerSample;
|
|
var bytesEndPos:Int = Math.floor(endPos * __timeMulti / 4000 / buffer.bitsPerSample) * buffer.bitsPerSample;
|
|
|
|
bytesStartPos -= bytesStartPos % buffer.bitsPerSample;
|
|
bytesEndPos -= bytesEndPos % buffer.bitsPerSample;
|
|
|
|
var maxByte:Int = 0;
|
|
for(i in 0...Math.floor((bytesEndPos - bytesStartPos) / buffer.bitsPerSample)) {
|
|
var byte:Int = buffer.data.buffer.get(bytesStartPos + (i * buffer.bitsPerSample))
|
|
| (buffer.data.buffer.get(bytesStartPos + (i * buffer.bitsPerSample) + 1) << 8);
|
|
if (byte > 256 * 128) byte -= 256 * 256;
|
|
if (maxByte < byte) maxByte = byte;
|
|
}
|
|
|
|
return maxByte/__peakByte;
|
|
}
|
|
} |