JSyn,警报器声音使用振荡器馈送/受控/ inputInto /菊花链由另一个振荡器和一个常数...并产生多个声音

时间:2013-06-14 03:26:04

标签: java audio jsyn

我一直在尝试按照这里的示例,但它不起作用,我找不到任何其他来源: [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。

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

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

这是我的代码,其中包含2个synthesizers和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();

有多少人知道并使用JSynmeta-oscillators怎么样?

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

2 个答案:

答案 0 :(得分: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中,您很少需要添加单元,因为输入端口将自动对任何连接的输入求和。

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

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

答案 1 :(得分: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. 一个包络振荡器应该有一个幅度,这需要按照改变频率的顺序,以便听到它的效果。