2017年5月26日金曜日

ベースマシンの音出し動画


BaseMachine(SVF DCF) → TS-OD1 → PT2399-Echo
RhythmMachine

MiniMixerでMixしてAudio I/F経由で録音してみた。Over Driveをかけているので音はダーティな感じになっています。

メモ:


一応、RhythmMachineとBaseMachineはsyncさせているが、ツッコミ気味な感じがしないでもない(^q^;

TS-OD1はバイパスが欲しい。

Filter Envelopeは使いづらいのでもうちょっと考えてみる。

シーケンサーは32Stepぐらい欲しいとこだが、いっそのことMIDIで長いパターンの再生やPOTの動きを記録できるようにしてみる?

2017年5月23日火曜日

ベースマシン フィルターにエンベロープを掛けてみる。

ファームウェアを改修してFilterのCutoffにエンベロープを掛けられるようにしてみた。

構想段階では、まずはエンベロープはVCAにかけて音量を変化させることだけを考えていて、フィルターの変調は「できたらやってみる」という努力目標にしていた。

アナログ的に値を設定するPOT×8パネルの中でエンベロープの初期音量を設定する「Level」ツマミはあまり使わないので、これをフィルターにエンベロープをかける量を調整する用途で使ってみることにしてみた。


ほんとは、VCAにかけるエンベロープとVCFにかけるエンベロープを分けて2系統にできればいいんだが、Nucleo F401のI/O pinが足りなくてこれ以上はかんたんに入力デバイスを増やせない。

スイッチでエンベロープをかける対象を選択するという方法も、エンベロープを設定するデバイスが「可変抵抗」なのでなかなかむずかしい。モードを切り替えると、現在のPOTの位置が別のエンベロープの値に反映されてしまう。

これはMIDI入力デバイスでもよくあり、高価なMIDI入力機器はスライドボリュームにモーターが仕込まれていてシーケンサーから送った値でツマミの位置を力ずくで変更するようになっている。さらにタッチ・センスも仕込まれていて人が触っているかどうか判別して、ツマミの位置制御の入力/出力を切り替えるようにもなっている。

さすがに今回はそこまでやるつもりはないので、できる範囲で(ファームウェアもあまりいじらない方向で)考えることにした。

エンベロープは1波形しか使えないので、VCAのエンベロープを浅くかけるか、深くかけるかを「FLT MOD」ツマミで調節するだけ。

↓シーケンサーのプログラムの一部

void updateTicks(int ticks)
{
    uint16_t level = EnvelopeGenerator.update(sequences[SequenceSender.getStep()].isTie());
    
    // Amp
    uint16_t ampLevel = level;
    if (sequences[SequenceSender.getStep()].isNoteOn())
    {
        ampLevel = ampLevel >> 1;
        if (sequences[SequenceSender.getStep()].isAccent())
        {
            ampLevel = ampLevel * (1.0f + ((float)UIController.getAccentLevel()) / 128.0f);
        }
    }
    else
    {
        ampLevel = 0;
    }
    AmpController.outDca(ampLevel);
    
    // Oscillator
    OscController.setFrequency10(SequenceSender.getFrequency10());
    OscController.outDco();
    
    // Filter Env Mod
    uint16_t cutoff16 = FilterController.getCutoff();
    uint8_t resonance = FilterController.getResonance();
    uint8_t mod = FilterController.getModLevel();
    float modCoeff = (float)mod / (float)(cutoff16 << 1);
    cutoff16 = cutoff16 * (1.0f + ((float)level / 0x8000) * modCoeff);
    if (cutoff16 > 255) {
        cutoff16 = 255;
    }
    FilterController.outDcf(cutoff16, resonance);
    
    if (ticks == 0)
    {
        EnvelopeGenerator.init(envelope);
        playingStep = SequenceSender.getStep();
        UIController.setPlayingStep(playingStep);
    }
}

シーケンサーの本体で1msごとにシンセ(DCO, DCF, DCA)に値を送っている部分。

BaseMachineのファームウェアは最初はArduino Unoでやっていたので基本的に16bit整数演算にしていたが、Nucleo F401はCortex-M4でFPU付きなのでFilterにエンベロープをかけるあたりは単精度浮動小数点演算で妥協した。

もう少し考えれば整数演算に落とし込めると思うが、なんと言ってもめんどくさい(@@;

Cortex-M4もM0とくらべて高いわけでもないし、次にシーケンサーを作るとしたらCortex-M4の浮動小数点数演算でどこまでできるかという話になるかもしれません。

mbed repository:
https://developer.mbed.org/users/ryood/code/BaseMachine/ revision:29

メモ:


DCAのエンベロープはDACのMCP4922で受けて電流値に変換し、OTAのNJM13700をDCAとして使っているので、自然と(あ、いやLPFを一回かましているのでわざとです)アナログチックな波形になっているが、今回はDigital POTのAD8403でデジタル的に受けているので、エンベロープ波形もデジタル的だと思う。過激なので面白いと言えば面白いですが。

演算で対数カーブにするのもコンセプトとずれるし、アナログ素子を通してなんとかならないかなあ。

今日はもう疲れたので次こそは音出し動画をつくります。

やったことを書き留めておかないと1週間後には何をやってたか忘れてしまいますゆえ。

2017年5月20日土曜日

OverDrive TS-OD1でけた


いつも使ってるデジカメが故障して写らなくなったのでiPadで撮影してみたが、被写界深度が浅いのか手ブレなのかちょっとボケ気味です。

今回もひとまず、プラケースに収めた。

回路図

C5、C6は0.33uFで実験していたが、0.22uFを仕入れて試してみると0.22uFの方がToneの効きが良かった。

オリジナルでOPAMP周りに0.1uF程度のデカップリングコンデンサが入っていなかったので、TS-OD1も入れていない。

基板図

部品面

抵抗がキンピが多いのは、ほとんどキンピしかストックしていないからで、深い意味はないです。

アルミ電解は出力のACカップリング用の10uFだけオーディオ用のものにした。0.22uF、1uFはTDKのMKTにした。

ハンダ面

メモ:


ベースマシンにかけると、TubeScreamerタイプの対称ダイオードの方が効きがいい。

ベースマシンのSVF DCFのレゾナンスとPT2399 DelayとOverDriveが合わさると、思ってもみない音の変化がある。

リズムマシンにも掛けたいからもう一個ぐらいいずれ作るかも。