PWMDAC_Synthライブラリに波形テーブルを組み込みました

PWMDAC_Synth ライブラリを更新しました。

シンセサイザーでよく使う正弦波、矩形波、三角波、のこぎり波を、組み込みで用意しました。
これらの波形については呼び出し側で PROGMEM 配列を定義する必要がなくなくなりました。

これに伴い、CAmiDion2号機、3号機、派生した普通のMIDIキーボードのArduinoスケッチも更新しました。

すでにCAmiDion の作業部屋に格納してあるのでダウンロード可能です。

PWMDAC_Synthライブラリに波形テーブルを組み込みました” への3件のコメント

  1. PWMDAC_Synth を使わせていただきました。
    素晴らしい! の一言に尽きます。
    arduino1chipでアナログシンセもどきを作りたく、ネットを探していたところCAmiDionに巡り会い感激しております。また、その発音ライブラリを公開された事に感謝いたします。
    現時点では、6音ポリフォニックで確実に音を出せるライブラリは恐らく無いと思います。
    更なる御活躍を期待しております。

    大変恐縮ですが質問をさせていただきたく、よろしくお願い致します。
    私はarduino初心者で、C,C++は理解できておりません。
    CAmiDionのスケッチとライブラリの例を参考に、MIDI経由で鳴るシンセサイザーを作ろうとしておりますが、EGのパラメータの渡し方が判らず、苦労しております。
    PROGMEM EnvelopeParam ADSR_patterns[] = { { 0x1800, 7, 0xFFFF, 3 },のそれぞれの値を変えればADSRの値が変わる事は確認出来たのですが、arduinoのアナログ入力でADSRをボリュームコントロールするにはどの様にすれば良いのでしょうか?

    • 回路図にあるArduinoのA0(アナログ入力0)ピンのところにオクターブ調整VR(可変抵抗器)がありますが、まずはこれと同じような回路を他のアナログ入力ピンに必要な数だけ(例:ADSRそれぞれ調整するなら4個)接続し、VRを回しながらanalogRead(アナログピン番号) の戻り値で 0~1023 の範囲の値のどれが返ってくるかをチェックします。

      この値に応じてエンベロープパラメータを変えるようにすればよいわけです。このときの値変換には Arduino の map() 関数が便利です。

      エンベロープパラメータを設定するには、PWMDAC_Synth.h で定義されている EnvelopeParam 型の構造体(下記)を使います。

      typedef struct _EnvelopeParam {
      unsigned int attack_speed;
      byte decay_time;
      unsigned int sustain_level;
      byte release_time;
      } EnvelopeParam;

      この構造体の型で

      EnvelopeParam env_param;

      のように変数を作って env_param.attack_speed = 値 のように個別のメンバーを設定し、一定時間ごとにVRの変化を検出して PWM_SYNTH.setEnvelope(env_param) でセットします。
      これでVRでコントロールできるようになります。

      MIDIチャンネル(1~16)単位で別々に PWM_SYNTH.setEnvelope(チャンネル値,env_param) のようにセットすることも可能です。

  2. kamide様
    早速、ご教授いただきまして、ありがとうございました。

    アナログ入力の値をmap関数で適当な範囲の値に変換して、
    EnvelopeParam 型の構造体を別途、定義して、各パラメータを各メンバーに代入して
    setEnvelope(env_param) でセットすれば良いのですね。
    やってみます。
    これで、ADSRを個別にコントロール出来るようになり、また一歩前進です。

    現在、MIDI音源として試作しており、波形の選択、レンジの選択(64’~2’迄オクターブ毎)をアナログ入力で変更できるようにしました。またLCDに波形名、レンジ、EGのパターン番号を表示して、外付けのVCFに繋いで音出ししています。一つのVCFに全部の音を送り込むやり方は過去にコルグがPOLY-800が採用してたのですが、音作りに少し不満が残りますね。

    もし、PWMDAC_Synthライブラリにフィルター機能(LPFとレゾナンス)を盛り込んでいただけたら・・・なんて贅沢な想いも出てしましました。と同時にCPUの処理能力の限界もあるだろうなぁとも思います。
                                                  あきぼん

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です