1

私はここの例に従おうとしましたが、うまくいきませんでした。他のソースを見つけることができませんでした: [ http://www.softsynth.com/jsyn/tutorial/osc_control.php ][1]

私が知る限り、私はこのサンプル コード スニペットに正確に従いました (ただし、その Web ページが更新されてから、いつか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 番目のより複雑な音が聞こえません。

サイレン音のコーディングの問題かもしれませんし、2 つの音を生成するコーディングの問題かもしれません。(2 つSynthesizers必要ですか? 1 と 2 で試しましたSynthesizers。) (2 つの lineOuts は必要ですか? 他の Web ソースは「いいえ」と言っています。)

synthesizers2と 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) 2 つのシンセサイザーを作成しました。

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

これは、非リアルタイムまたは異なるサンプル レートで合成を実行している場合にのみ必要です。シンセサイザーを 1 つだけ使用することを強くお勧めします。シンセサイザー間でユニットを接続したり、両方のシンセサイザーで同じユニットを実行したりすると、問題が発生します。それが主なエラーだと思います。

1 つのシンセで複数の LineOut ユニットを使用できます。または、複数のユニットを LineOut に接続して、自動的にミックスすることもできます。

2) LineOut に接続された 1 つのオシレーターから始めることをお勧めします。音が出るようになったら、変調を加えます。

3) 最適化された PowerOfTwo ユニットを使用して、指数周波数 (ピッチ) 変調を得ることができます。

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

LFO を PowerOfTwo ユニットに接続します。次に、乗算ユニットを使用して中心周波数をスケーリングします。+1.0 から -1.0 までの LFO は、周波数を 1 オクターブ上下にスケールします。

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 に答える