昔作ったリズムマシンの問題点と今回の改善ポイント
以前リズムマシンを作った時に発生した音源の問題点として3つ挙げられます。
スネア、ハイハット、シンバルの音が全部同じ
ハイハット、シンバルのパートにはコイルとコンデンサで構成されたパンドパスフィルタが付いていました。
当時コイルを付けると音が出なくなったと書いていたのですが、つい最近100mHのコイルを100μHと間違えていたことに気づきました。
フィルタが付いていないとスネア、ハイハット、シンバルが全てホワイトノイズになってしまいますが、フィルタを付けると特有の音に変わります。
フィルタなし フィルタあり
フィルタなし フィルタあり
MIDIの信号ノイズが音源回路に混入する
当時はPICが処理をするときのノイズだと思い、パスコンを付けたのですが結局改善していませんでした。
PICを取り外してもノイズが出るのでフォトカプラではないかと思いいろいろ調べていると、
フォトカプラは回路的に分離されていても静電容量での結合がある事がルネサスの技術解説のページ「汎用フォトカプラ特有のノイズ」に詳しく記載されていました。
TLP552には静電シールドが内蔵されていないため、入力側の電流制限抵抗を大きいものに変更してノイズを低減させることにしました。あまり大きい抵抗にすると入力側が発光しなくなるので2.5kΩくらいが限界です。
下のサンプルでは冒頭でのギギーという音やアクティブセンシングの音がかなり大きく入っていますが、変更後はかなり低減されていることが分かります。
220Ω 2kΩ
220Ω 2kΩ
MIDIの処理プログラムにバグがあり、稀に停止することがあった。
どこが悪いのかを探すのが面倒で放ったらかしにしていました。せっかく作ったリズムマシンを使わなくなった最大の原因になっていました。
新しいハードウエア
新しい回路で大きく変更された部分は以下の項目です。
パーカッションのトリガーパルスはアクティブHigh、ノイズジェネレータにはその筋に定評のある2SC828を使っています。
- 追加のパーカッションとしてロータムとハイタムを追加しました。回路はクラベスと同じ構成で時定数部品のみが変更されています。
- 従来の改造で追加したバスドラムのディケイとアタック、クラベスのディケイのボリュームはそのまま引き継ぎました。
- ベロシティに反応する回路を削除した代わりに、各パートの音量を調整するボリュームを付けました。
- シンバルの音を強制的にミュートさせる回路を追加し、オープンとクローズのハイハットが演出できるようになりました。
- バスドラム、クラベス、タムのトリガー部分は、ダイオードのリミッタがうまく働かなかったため510Ωの抵抗に置き換えています。回路変更はUnivox Sound Master SM-8 Rhythm 1を参考にしました。
パーカッションのトリガーパルスはアクティブHigh、ノイズジェネレータにはその筋に定評のある2SC828を使っています。
ソフトウエア
ソースリスト Ver.0.06
MIDIの解析プログラムはMidiTalkのプログラムを流用しているため、わずか2日で完成しています。
プログラム中で特にポイントなのが、パーカッションをトリガーするパルス幅生成のためのタイマー割り込みです。 トリガーパルスの幅が短すぎると発音する音量が小さくなり、逆に大きすぎると連打に対する反応が悪くなります。 トリガーパルスをONした後は、0.1msのタイマー割り込みを40回カウントしてからパルスをOFFにするようにしています。 タイマーのプリスケーラで分周比を高くするとカウントのばらつきが大きくなるので、MIDIの受信(0.32ms)に影響を与えない範囲で小さくするよう工夫しました。
MIDIの解析プログラムはMidiTalkのプログラムを流用しているため、わずか2日で完成しています。
プログラム中で特にポイントなのが、パーカッションをトリガーするパルス幅生成のためのタイマー割り込みです。 トリガーパルスの幅が短すぎると発音する音量が小さくなり、逆に大きすぎると連打に対する反応が悪くなります。 トリガーパルスをONした後は、0.1msのタイマー割り込みを40回カウントしてからパルスをOFFにするようにしています。 タイマーのプリスケーラで分周比を高くするとカウントのばらつきが大きくなるので、MIDIの受信(0.32ms)に影響を与えない範囲で小さくするよう工夫しました。
MIDIインプリメンテーション
FW Ver.0.03 | 受信 | 備考 | |
ベーシックチャンネル | 電源ON時 | 1-16 | 自由に定義できる。 リセット・電源オフで初期に戻る。 |
設定可能 | 1-16 | ||
モード | 電源ON時 | モード3 | SysExで複数のチャンネルを受信できる設定が可能なので、モードの概念が無い。 |
メッセージ | × | ||
代用 | × | ||
ノートナンバー | 0-127 | SysExでパーカッションを自由なノートにアサインできる。 | |
ベロシティ | ノートオン | 1-127 | SysExでハイハットのベロシティが奇数か偶数かによってシンバルをミュートさせる。 |
ノートオフ | × | ||
アフタータッチ | × | ||
ピッチベンド | × | ||
コントロールチェンジ | 7 | ○ | メインボリュームMSB、0の時トリガー動作を行わない。 |
11 | ○ | エクスプレッションMSB、0の時トリガー動作を行わない。 | |
64 | ○ | ホールド1 0-63の時シンバルのミュート用パルスを送出する。 | |
プログラムチェンジ | 124-127 | EEPROMからノートアサインのプリセットを呼び出す。 | |
エクスクルーシブ | ○ | メーカーIDは7Dh、デバイスIDは00h | |
コモンメッセージ | × | ||
リアルタイム | × | ||
その他 | アクティブセンシング | × | |
システムリセット | × |
エクスクルーシブメッセージ
リセット | 電源投入時と同じリセットを実行する。 |
受信チャンネル定義 | 受信するチャンネルにフラグを立てる。フラグなので複数のチャンネルも受信できる。 |
ノートアサイン | 0~127のノートにパーカッションを割り当てる。レイヤーはできない。 |
シンバルカットの動作 | シンバルに続くハイハットが来たとき、シンバルを強制的にミュートするかどうかを選択。HHのベロシティの偶数・奇数の条件でカットを行うか、強制的にカットするかが選べる。 |
他社音源のリセット受信フラグ | GM1オン/オフ・GM2オン・GSリセット・88モードセット・XGオンを受信した時にリセットを実行する。 |
ノートアサインをクリア | 全てのノートのアサインをクリアする。 |
ノートアサインを保存 | 現在のノートアサインをプログラムチェンジの124~127に保存する。 |