オールドスクール、ハードコア、AY-3-8912。 シリアル入力を備えたIron Chiptune





AY-3-8910(YM2149F)音楽コプロセッサーを搭載したSpectrum 128Kクローンがありませんでした。 48Kには拡張キーボードとひどい電源があり、1〜2時間の作業後に内部が過熱していました。 これから、私は覚えています。 シムシティの海の真ん中にある家々は、他の面白い工芸品を形成しました。 しかし、これらの記憶は関係ありません。 tronix286 マテリアルに触発されて、私はレトロな教育のギャップを埋め、伝説的な(そして同時に、簡単に採掘できて安価な)チップで何かをリベットすることにしました。



さまざまな工芸を研究する過程で、アイデアは次のように形成されました。シリアル(UART)入力を備えたモジュールを作成する必要があります。 最小限のコストで任意のデバイスに既に接続できるため、+ 146をチップーに追加できます。 その過程で、AVRのプログラミングやフォトレジストを使用したプリント回路基板の製造など、いくつかの追加スキルを習得することも決定されました。



結果をすぐに説明します。モジュールの開発とスクレイピング、サイドスキルの強化、レーキの組み立て、楽しみ、拡大、深化が可能です。



シンセサイザー



AY-3-8910は大型の美しい40脚DIPチップです。 必要なものに加えて、普通の人(Covoxの地獄のようなアナログを収集しようとしない人)が音声を出力するために使用されない、さらに2つの8ビットポートがあります。 AY-3-8912も同様に美しいものですが、すでにDIP28にある1つの「余分な」ポートが奪われております。 そして、一般的にパラレルポート(DIP24)のないAY-3-8913があります。 そして、これは単なる一般計測器/マイクロチップです。 ヤマハはさらに多くのバリエーションをリベットしました:YM2149F(クロック分周器を備えたアナログAY-3-8910)からYMZ284(DIP16、チャンネルの1つの混合出力)まで。 Wikiでチップの詳細をご覧ください



運営管理



データのダウンロードには8ビットのパラレルポートが使用されます。 さらに、3本の制御線(1本はBC2で、プラスの電源に接続されています)。 ロジックは次のとおりです。



1.初期状態はBC1 = 0、BDIR = 0です。

2.ポートAYのレッグにレジスタアドレスを設定します。

3. BC1 = 1、BDIR = 1。 ダウンロードアドレス。 ラインの切り替え間の遅延は50 nsを超えないようにする必要があります。そのため、たとえばPORTC | = 0b00110000;のように、脚の遅いジャーク(Arduino DigitalWriteなど)は適切ではありません。

4. BC1 = 0、BDIR = 0。

5.ポートAYのレッグにレジスタ値を設定します。

6. BC1 = 0、BDIR = 1。 ローディング値。



シーケンスを14回繰り返します(目的のレジスタごとに)。 そして、このすべて-1秒あたり50回。 音楽を入手します。



特定の鉄の選択



私の場合、次のとおりです。

1. AY-3-8912-安かった。

2. Atmega8A(DIP28)-利用可能な、十分な結論。

3. 4 MHz水晶発振器-AYクロッキング用。

4.カウンターK555IE5-AYをクロッキングするための分周器として。

5. 16 MHzのクォーツ-Atmega8A用。

6. PCに接続するには-FT232RのUSB UART。







この場合、料金は正確に離婚します。 デバッグおよびより思慮深い研究の過程で、次の考えが生じました。



1. YM2149Fを使用する場合、カウンターは必要ありません。 このチップには、2分周器が組み込まれています。

2.クォーツもAtmegaには必要ないようです-すべては内部の8 MHzオシレーターからうまく機能します。

3.理論的には、ハードウェアタイマーとAtmegaカウンターを深く掘り下げると、AYの水晶発振器を完全に取り除くことができます。 しかし! この場合、2 MHzでのみAYをクロックできます。 しかし、良い方法では、Speccyで行われているように、1.7(多桁)MHzでクロックできる必要があります。 DIPパッドに4 MHzの水晶発振器があるので、後で3.5(多桁)MHzに置き換えることができます。



サウンド出力はtronix286からコピーされ、少数の抵抗と2つのコンデンサがあります。



ソフトウェア



インスピレーションのために、この(下の)実装が研究れました。 「ソース-UART-Atmega-AY」リンクの一般的な原理について説明していますが、この場合の「mega」でのArduinoローダーの使用は、私にはまったく不要なようです。 まあ、C#で書かれたPC上のプログラムは、私は好きではありませんでした。 Sharpeは、ここArduinoと同じくらい「必要」です。 YM形式は、 ここにレイアウトされています



Atmegaファームウェア



ソースコードと16進数はgithubで入手できます(資料の最後にあるリンク)。主な機能について説明します。



valToPort-ポートBの半分とCの半分で構成される「ポート」に8ビット値を書き込む。したがって、繁殖する方が便利でした。

sendToAY -8ビット値をAYレジスタに書き込みます。 ここでは、「管理」項目で説明されているロジックが実装されています。

セットアップ -ポートとUARTの初期化。

main-「16バイトの取得-AYへの書き込み」ループ。



PCデモ







PySerialを使用してPython 3で記述されています。 ファームウェアと同様に、githubにあります。 1.ymファイル(非圧縮!)を取得し、現在のディレクトリから解析して、COM6にプッシュします。 興味を引くために、この例はOS Xでテストされており、そのまま使用でき、ポートの名前を変更するだけです。 Linuxでも同じようにうまく機能すると思います。 「ラズベリー」に。



AYでレジスタダンプを発行することには微妙な違いがあります。 YM形式は、データを「すべてのレジスタ値0、すべてのレジスタ値1 ...」の形式で保存します。 これは、さらに圧縮するという点で非常に正しいです。 私は非圧縮のYMを使用しており、「レジスタ0、レジスタ1 ...」というバイトのパケットを配布する必要があります。 PCの場合、タスクは額で解決されました。必要な順序でファイルからデータを大きな配列に読み取り、それをコントローラーに連続的に渡します。 少量のメモリを搭載したチップに基づいて「ヘッドユニット」を作成する必要がある場合、いくつかのバッファを考案する必要があります。



合計



再生を開始する前に、「mega」とAYをリセットすることをお勧めします。 コントローラーバッファーに何かがあると、新しいデータを送信するときに、ストリーム全体がシフトし、音が本当に悲痛になるからです。 モジュールにはリセットピンがありますが、デモでは使用されません。 放電は、「地面」にある水晶発振器のケーシングにワイヤを押し込むことにより実行されます。



キャッチされていないバグもあります。 これは、おそらく「Windows 10-Python 3-UART」の領域のどこかに隠れています。 定期的に、更新レートは50 Hzから20(オシロスコープ)に低下します。 この現象でシステムは検出されず、グリッチは別のコンピューターで再生されませんでした。 キャッチした場合、UPDを実行します。



将来、モジュールは開発中のクラフトにボルトで固定され、比較的近い将来、これに関する記事が作成されます。 さて、あなたは「ラズベリー」を拾おうとするべきです。 実験の余地があります。



githubのソース、ボードレイアウト(SL6)、モジュール回路(Eagle)。



UPD1。 AYEmulを使用してYMに変換できます。

UPD2。 Modland.comアーカイブをダウンロードするには、.torrentを使用します。 たくさんあります。

UPD3。 ProjectAY 。 AYにはたくさんの音楽があります。 公開時点では、サイトは嘘をついていました。



今、すべてが多かれ少なかれ文化的です



UPD4。 2015年3月18日、Atmegaコードとデモを再編集しました(pythonium)。 ロジックは次のとおりです。Atmegaはホストからのデータを要求し、リングバッファーを満たします(512バイト)。その後、半分が失われると、さらに要求します(つまり、要求ポイント256および512(0))。 ホストは256バイトのパケットで要求に応答し、Atmegaは割り込みハンドラーを介してそれらを消費します。 すべてが洗練されているわけではありませんが、元のバージョンよりもはるかに安定しています。



UPD5。 ラズベリーを試してみました。 それはほとんど箱から出して動作します。

0.シリアルポートのコンソールを無効にします(最後に/ etc / inittabなど)。

1. comPort = "/ dev / ttyAMA0"(シリアルポート)

2. regState = bytes([registerDump [currentPos + currByte]])(したがって、serial.writeは正常に動作します)



All Articles