Генератор звукового сигнала

Мне нужен простенький генератор на 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()
}

но это не совсем то, что нужно. Нужно "бесконечное" воспроизведение с возможностью регулировки...


Ответы (0 шт):