Полифонический звук с огибающими с 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. В противном случае он будет издавать шум. Я пытался много раз и обнаружил, что проблема может заключаться в двух осцилляторах. Удалите один осциллятор и повторите попытку.