Полифонический звук с огибающими с JSyn звучит плохо

Я использовал примеры JSyn PlayChords и PlaySegmentedEnvelope (оба примера легко найти), чтобы создать простой полифонический звук. Этот фрагмент кода

        synth = JSyn.createSynthesizer();
        synth.add(osc1 = new SineOscillator());
        synth.add(osc2 = new SineOscillator());
        synth.add(envelopePlayer1 = new VariableRateMonoReader());
        synth.add(envelopePlayer2 = new VariableRateMonoReader());
        double[] pairs = {0.1, 1.0, 0.5, 1.0, 0.7, 0.3, 0.8, 0.0};
        envelope = new SegmentedEnvelope(pairs);
        synth.add(lineOut = new LineOut());
        envelopePlayer1.output.connect(osc1.amplitude);
        envelopePlayer2.output.connect(osc2.amplitude);
        osc1.output.connect(0, lineOut.input, 0);
        osc1.output.connect(0, lineOut.input, 1);
        osc2.output.connect(0, lineOut.input, 0);
        osc2.output.connect(0, lineOut.input, 1);
        synth.start();
        lineOut.start();
        osc1.frequency.set(440.0);
        envelopePlayer1.dataQueue.queue(envelope);
        osc2.frequency.set(660.0);
        envelopePlayer2.dataQueue.queue(envelope); // attack
        synth.sleepFor(2.0);
        synth.stop();

играет пятую часть, как и ожидалось. Однако также слышен очень мешающий шум. Как это можно улучшить, чтобы играть только пятым?

2 ответа

Синусоидальные волны складываются LineOut.

Аудиооборудование может обрабатывать звук только в диапазоне от -1,0 до +1,0. Все, что выше 1.0, будет обрезаться и звучать плохо. Если вы смешаете две синусоидальные волны с амплитудой 1,0, они могут в сумме получить 2,0.

Попробуйте установить амплитуду огибающих равной 0,4.

envelopePlayer1.amplitude.set(0.4);
envelopePlayer2.amplitude.set(0.4);

Или вы можете использовать микшер для управления громкостью отдельных голосов.

Встречался тоже, создал синусопер и подключился к VariableRateMonoReader. Тогда амплитуда может быть максимум 0,5. В противном случае он будет издавать шум. Я пытался много раз и обнаружил, что проблема может заключаться в двух осцилляторах. Удалите один осциллятор и повторите попытку.

Другие вопросы по тегам