1

我一直在尝试按照此处的示例进行操作,但它不起作用,并且我无法找到任何其他来源:[ http://www.softsynth.com/jsyn/tutorial/osc_control.php ][1]

据我所知,我完全遵循了这个示例代码片段(除了我发现该网页更新AddUnit后的Add某个时间):

[...] 使频率在更有用范围内的中心频率附近略微波动。我们可以通过使用 AddUnit 将振荡器的输出添加到我们可以设置的常数值来做到这一点。我们还可以将第一个振荡器的幅度减小到较小的范围内。

AddUnit  freqAdder  = new AddUnit();
sineOsc1.output.connect( freqAdder.inputA );     // pass through adder
freqAdder.output.connect( sineOsc2.frequency );  // control second oscillator freq
freqAdder.inputB.set( 500.0 );   // add constant that will center us at 500 Hz
sineOsc1.amplitude.set( 100.0 ); // reduce offset to +/- 100 Hz

因此 sineOsc2 的频率将是 sineOsc1.output 加上 inputB。

任何人都可以看到我的代码有什么问题(如下)?我已经有一个简单的振荡器声音工作。我只是听不到第二个更复杂的声音,它应该像警笛一样。

这可能是我对警笛声音的编码有问题,或者可能只是我的生成两个声音的编码有问题。(Synthesizers需要 2 吗?我已经用 1 和 2 试过了Synthesizers。)(需要 2 lineOuts 吗?其他网络资源说“不”。)

这是我的带有 2synthesizers和 1 输出的代码:

(引号中的注释来自其他示例代码。我只了解这些注释的含义。)

import com.jsyn.JSyn;
import com.jsyn.Synthesizer;
import com.jsyn.unitgen.Add;
import com.jsyn.unitgen.LineOut;
import com.jsyn.unitgen.SineOscillator;

[...]

    com.jsyn.Synthesizer synthPCMSonification = JSyn.createSynthesizer();
    com.jsyn.Synthesizer synthPCMAlarm = JSyn.createSynthesizer();
                                // "an instance of Synthesizer"
    com.jsyn.unitgen.SineOscillator oscData = new SineOscillator();
    SineOscillator oscAlarmWaverEnvelope = new SineOscillator();
    SineOscillator oscAlarmComplete = new SineOscillator();
                                // "a unit"
    com.jsyn.unitgen.LineOut oscsLineOut = new LineOut();
                                // "a unit"

[...]

    // "start synthesis engine"
    synthPCMSonification.start();
    synthPCMAlarm.start();

    // "build unit generators"
    synthPCMSonification.add(oscData);
    //synthPCM.add(oscAlarmWaverEnvelope); //TODO:  Figure out if need line
    synthPCMAlarm.add(oscAlarmComplete);

    synthPCMSonification.add(oscsLineOut);
    synthPCMAlarm.add(oscsLineOut);

    oscData.frequency.set(LOWEST_FREQUENCY_C);
    oscData.amplitude.set(volSonification);

    //create a frequency adder for a siren-like alarm
    com.jsyn.unitgen.Add oscAlarmFreqAdder = new Add(); //used to be AddUnit

    //set the alarm centre frequency
    alarmCentreFreq = (LOWEST_FREQUENCY_C
                       * Math.pow(2, OCTAVES_SPANNED_C + 1));
                       //This formula centres the alarm one octave
                       //above the threshold's sonification freqency
    alarmWaverFreq = alarmCentreFreq / 10;
                     //This sets the waver at one tenth of the centre freq
                     //Unfortunately, the waver appears to need to be the
                     //same amount above and below the centre
                     //(linear, vice perceptually-linear (exponential))
    System.out.println(alarmCentreFreq + "-Hz alarm centre frequency");
    oscAlarmFreqAdder.inputB.set(alarmCentreFreq);

    //set the alarm waver envelope
            //(alarm will range between centre-waver and centre+waver)
    oscAlarmWaverEnvelope.frequency.set(alarmCentreFreq / 10);

    //"pass through adder" (??)
oscAlarmWaverEnvelope.output.connect(oscAlarmFreqAdder.inputA);
//(entered this with by starting to type, then hitting [Ctrl]+[Space]!)

//"control the 2nd oscillator frequency" (?)
oscAlarmFreqAdder.output.connect(oscAlarmComplete.frequency);

    //set alarm volume
    oscAlarmComplete.amplitude.set(volAlarm);

    // "connect unit generators"
    // connect oscillator to both channels of stereo player
    oscAlarmComplete.output.connect(0, oscsLineOut.input, 0);
    oscAlarmComplete.output.connect(0, oscsLineOut.input, 1);

    // "startUnitGenerators"
    // "start execution of units.  JSyn 'pulls' data so the only unit
    // you have to start() is the last one, in this case our LineOut"
    oscsLineOut.start();

有多少人知道和使用JSyn?怎么样meta-oscillators

如果您曾经将不同的JSyn部分连接在一起,或者甚至只是让它一次输出多个声音,那么您比我知道的更多...

4

2 回答 2

1

这里有很多可以改进的地方。

1)您创建了两个合成器:

com.jsyn.Synthesizer synthPCMSonification = JSyn.createSynthesizer();
com.jsyn.Synthesizer synthPCMAlarm = JSyn.createSynthesizer();

仅当您以非实时或不同的采样率运行某些合成时才需要这样做。我强烈建议只使用一个合成器。跨合成器连接单元或在两个合成器上运行相同的单元会导致问题。我怀疑这是主要错误。

您可以在一个合成器中拥有多个 LineOut 单元。或者您可以通过将多个设备连接到 LineOut 来自动混音。

2) 我建议从一个连接到 LineOut 的振荡器开始。在你让它发出声音之后,添加调制。

3)您可以使用优化的 PowerOfTwo 单元获得指数频率(音高)调制。

http://www.softsynth.com/jsyn/docs/javadocs/com/jsyn/unitgen/PowerOfTwo.html

将 LFO 连接到 PowerOfTwo 设备。然后使用乘法单元来缩放中心频率。从 +1.0 到 -1.0 的 LFO 会将频率上下缩放一个八度。

4) 本教程使用旧的 JSyn API。我需要更新它。请注意,在新的 JSyn API 中,您很少需要 Add 单元,因为输入端口会自动对任何连接的输入求和。

5) StackOverflow 很棒,但您可以通过注册 JSyn 邮件列表获得 600 多人的 JSyn 社区的支持。

http://www.softsynth.com/jsyn/support/index.php

于 2013-06-14T16:54:50.503 回答
0

(注意:我真的很想把这个添加到@philburk 给出的答案中,因为他的回答肯定有帮助,但是我将这个添加到他的答案中的请求被拒绝了,所以我必须把它作为一个单独的答案给出。我被撕裂了不过,我是否应该将“接受”移到这个答案,即使这是实际的修复。)


可以通过添加(或在频率线的情况下更改为)以下代码行来修复问题中的代码:

synthPCM.add(oscAlarmWaverEnvelope) //(this is the line I already suspected I needed)

oscAlarmWaverEnvelope.frequency.set(4.0);
oscAlarmWaverEnvelope.amplitude.set(alarmCentreFreq / 10);

...意义:

  1. 振荡器仍然需要连接到合成器,即使它不会被直接听到(示例代码中缺少这样的一行,可能是因为示例代码假设一个人有一些之前教程中的示例代码) .
  2. 包络振荡器应设置为非常低的频率,以便听到其效果。
  3. 包络振荡器应该被赋予一个幅度,并且这需要在被改变的频率的数量级上才能被听到它的效果。
于 2013-06-17T03:12:16.853 回答