2019-06-19

マイコンを使わないアナログ式電子オルゴールを作った

皆さんこんにちは。 今回は、私が1年がかりで作った「アナログ式電子オルゴール」の紹介をしたいと思います。

    動作風景

    ※音量小さいです。

    元ネタはピアノロール

    私が中学生の頃、クラシックなミッキーマウスのアニメーションを見るのが好きだったのですが、そこにピアノロール が出ていました。これは、ピアノの演奏情報を時系列的に記録した紙媒体であり、穴が空いているところに対応する鍵盤が自動的に押される仕組みのようです。

    これをもとに、幅 40 mm の紙テープで演奏データを記録することにしました。 本家のピアノロールは、鍵盤1つずつに1ライン使うため非常に幅の広い紙テープが必要になります。 そこで、音階(ドレミファソラシドと#)を4ビット、オクターブを3ビット、ノートオン/オフを1ビットの合計8ビットで表現しています。

    回路図

    画像形式と .CE3 形式で配布します。 .CE3 を BSch3V で開けば高解像で確認できるためおすすめします。 なお、パスコンなどのノイズ対策や電源の振動対策を行っておらず、自己責任にてお願いいたします。

    電源

    15VのACアダプタからレールスプリッタで±7.5V電源を生成、プッシュプルで大電流対応。 その他、NJM4580DDオペアンプの動作電圧を作ったり、デジタル用+5Vを三端子レギュレータで作っています。

    紙テープ巻取回路

    紙テープを一定の速度で巻き取ります。 モーターの速度をフィードバックで制御していますが、なんと速度センサーもまたモーター。 紙テープにローラーを当ててモーターの軸を回し、微弱な起電圧を300倍に増幅します。 そして、半固定抵抗によって定めた基準電圧とコンパレータによって比較し、 紙テープを巻き取るモーターをON/OFFします。 モーターは激しいノイズ源になりそうなので、3V 電池を使って電源を隔離しています。

    紙テープ読取回路

    黒を1、白を0のデジタル信号として、8ビット幅の紙テープをフォトリフレクタで読み取ります。 1ビットはノートオン信号として、これがHiのときに残りの7ビットを読み取るようにします。

    音階デコーダ

    音階信号(ドレミファソラシドと半音)からオクターブ4の周波数信号を生成します。 音階に対応する周波数は半固定抵抗で調整する必要があります。 また、周波数出力 Vfreq4 はインピーダンスありの負電圧となります(オクターブデコーダとの兼ね合いのため)。

    オクターブデコーダ

    オクターブ4の周波数信号をもとに、オクターブ 0〜7 に変調します。 オクターブ0は実質 0V を出力することになります。 こちらも、各オクターブごとに半固定抵抗で周波数の調整が必要です。

    エンベロープ回路

    音量を変化させて減衰を表現します。 単純なコンデンサの充電放電と、分圧回路ですね。 なお、コンデンサの急放電によるストレスは無視。

    ノコギリ波VCO&VCA

    周波数と音量を電圧として入力するとノコギリ波が生成されます。 周波数については入力電圧との線形性が成り立ちますが、振幅(音量)についてはJ-FETの特性の影響を受けます。

    3Dモデル

    紙テープ読取装置の 3D モデルです。 3D プリンタで印刷し、接着剤で組み立てれば出来上がります。 なお、.stl 形式と .rsdoc 形式で配布しますが、DesignSpark Mechanical で .rsdoc を開けば印刷用に部品が分割されていますのでおすすめします。

    モーター用ロール

    幅40mmの紙テープを130モーターとギアボックスで巻き取ります。

    手巻き用ロール

    こちらは手巻き用のノブがついています。

    ベース

    手前から順に、ギアボックス、速度センサー、紙テープの土台です。

    ヘッド

    格子1つにフォトリフレクタLBR-127HLDが2つ入ります。 格子を4つ用意したので、8ビット分の並列データ読み込みができます。

    モーターホルダー

    FA-130RAモーターを固定します。

    その他

    市販のパーツの紹介です。

    この記事の執筆者

    hato6502

    hata  

    中学生の頃に 6502 という CPU からプログラミングの世界に入りました。 C/C++ で1から作ることも好きですが、最近は変化の激しい IT 業界をみて Web 系にシフトしつつあります。