Генератор звукового сигнала
Мне нужен простенький генератор на Jetpack Compose. Речь идет о звуковом генераторе сигнала. Который воспроизводит звуковую волну в форме синуса, при чем частоту надо задавать в ручную. Т.е. как я вижу это: поле в котором отображается текущая частота, поле ввода частоты уставки и кнопка старт-стоп, при нажатии на которую начинается воспроизводится звук заданной частоты. Пока что я нашла это:
@Composable
fun ToneGenerator() {
val frequency = 1000.0
val duration = 3
val sampleRate = 44100
val numSamples = duration * sampleRate
val sample = DoubleArray(numSamples)
val generatedSnd = ByteArray(2 * numSamples)
//Используйте новый поток, так как это может занять некоторое время.
val handler = Handler()
val thread = Thread {
// заполняем массив
for (i in 0 until numSamples) {
sample[i] = sin(2 * Math.PI * i / (sampleRate / frequency))
}
// преобразование в 16-битный звуковой массив PCM предполагает,
// что буфер семпла нормализован
var idx = 0
for (dVal in sample) {
// масштабируем до максимальной амплитуды
val `val` = (dVal * 32767).toInt().toShort()
// в 16-битном формате WAV PCM первый байт — это младший байт
generatedSnd[idx++] = (`val`.toInt() and 0x00ff).toByte()
generatedSnd[idx++] = (`val`.toInt() and 0xff00 ushr 8).toByte()
}
handler.post {
val audioTrack = AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,
AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, numSamples,
AudioTrack.MODE_STATIC
)
audioTrack.write(generatedSnd, 0, generatedSnd.size)
audioTrack.play()
}
}
thread.start()
}
но это не совсем то, что нужно. Нужно "бесконечное" воспроизведение с возможностью регулировки...