FC2ブログ
としえのへたえ - TOSHiÉtti GRAFFitti
6和音出るワンチップ音源作った
こんばんは、デジタルとしえです。

あるものを作りたいなーーーーという構想がありまして、そのためには音源が必要なのです。PSG音源のICなんかも買ってはみたのですが、音を出すためにはコマンドを送らないとダメで、めんどくさいわけです。

わたしとしては、ドとミとソのスイッチをONにしたら、ドとミとソがすぐに鳴って欲しいわけです。いちいち、分周率をチャンネルごとにセットしてからドン☆とトリガして音を出すみたいなのはやってらんないのです。

ないものは仕方がないので、自分で作ります。今回は久々にマイコンを使います。

【仕様】
・6チャンネル用意する
・各チャンネルには固定した音程を割り振る
・6チャンネルに対応したピンをLレベルにするとその音が鳴る(負論理)
・複数のピンをLレベルにすると和音になる
・波形はデューティー比50%の矩形波
・エンベロープはかけない
・ビブラートもかけない
・ノイズも付加しない


これを2個作って12チャンネルにすれば、1オクターブの12セミトーンがカバーできます。(15個作れば理論上は90音出せるので、88鍵盤をカバーできます。しかし、クロックの都合で高い音の精度が出ないので実際にはムリです。)

というわけで、回路図ドン☆

としえ音源の回路図

真ん中のPIC16F84A(U2)が今回の要となるマイコンです。上の抵抗たち(R9~R16)はラダー型の4ビットD/Aコンバータになっています。とりあえず今回は、鍵盤代わりにDIPスイッチ(SW1)を繋いでいます。クロック周波数は手持ちの水晶(X1)の都合で12MHzにしました。C3とC4の容量はイイカゲンです。

基板部品面 基板ハンダ面

これマイコンですから、これだけじゃ動きません。ファームウェアが必要です。今回の開発環境はMPLABを使い、アセンブリ言語でコーディングしました。

【アルゴリズム】
(1) 6チャンネル分のカウンタ(CNT0~CNT6)、カウンタ(OCT0~OCT6)を用意する
(2) 出力信号レベルを計算するためのカウンタ(OUT)を用意する
(3) 各カウンタCNTxに(とりあえず)値1をセット、OUTはクリア
(4) 各カウンタCNTxをデクリメント
(5) CNTxが0になったら、CNTxに分周率をセットし、OCTxをインクリメント
(6) PORTBをスキャンし、Lレベルのピンを探す
(7) Lレベルのピンnを発見したら、OCTnのLSBをチェック
(8) LSBがHレベルならOUTをインクリメント
(9) PORTBの第0~5ビットをチェックし終えるまで(6)~(8)を繰り返し
(10) OUTの値(値域0~6)をPORTAの第0~3ビットに出力(←実は3ビットで足りるが)
(11) (4)へ戻る


PIC16F84Aはクロック周波数(今回は12MHz)の1/4の周波数が1サイクルになります。よって、1サイクルあたり1/3000000秒です。上のアルゴリズムの(4)~(11)のループ1周で84サイクルあります。また、波形のデューティー比を50%にするため、波形を2分周しています。

よって、周波数fの音を出すためには、分周率Nを

N = round(3000000 / (84 * 2 * f))

とすればよいことがわかります。

音階平均律[Hz]分周率設計値[Hz]実測値[Hz]
C130.8137130.3130.3
Cis=Des138.6129138.4138.4
D146.8121147.6147.6
Dis=Es155.6115155.3155.3
E164.8108165.3165.3
F174.6102175.1175.0
Fis=Ges185.097184.1184.1
G196.091196.2196.2
Gis=As207.786207.6207.6
A220.081220.5220.4
Ais=B233.177231.9231.9
H246.972248.0248.0

んで、土曜日に秋葉原の秋月電子通商さんで買った下の機械でPICにファームを書き込みます。そして、基板にPICを挿してテスト。

PICにファームを書き込む機械

実測値は設計値にほぼ一致しました。すばらしい! ただし、比較的低い周波数を分周していますので、どうしても(設計値自体が)誤差を含んでしまいます。Dの音が約+8.8セント、Ais (B)の音が約-8.7セントずれています。音痴のわたしにはまったく無縁の話ですが♪

ほんとは、1個めのチップに {C, C#, D, D#, E, F} の6音を、2個めのチップに {F#, G, G#, A, A#, H} の6音を割り当てるつもりなのですが、とりあえずデモ用に {C, D, E, F, G, A} (ドレミファソラ)の6音が出るようにしてチップを焼きました。

[MP3] 音を出してみた♪

単音でも、和音でも、全部同時に鳴らしても、一応大丈夫そうです♪

[ASM] ファームウェアのソースコード

じゃ、寝るわ☆

(ソースコードの説明は追記にございます。)
続きを読む - Postscript
お楽しみいただけたら押してちょ ↑↑↑↑↑
にほんブログ村 イラストブログ 絵日記へ
電気・電子」の前後記事

テーマ:オーディオ | ジャンル:趣味・実用

[2011/02/07 03:01] | 電気・電子 | Trackbacks(0) | Comments(8)
| ホーム |

カレ俊 カノ俊 ブログ としえのへたえ - TOSHiÉtti GRAFFitti

としえのへたえ
著者紹介 Profile

ひろしまとしえ

ハンドル: ひろしまとしえ
Handle: Toshiétti
職業: 主婦・求職者・エンジニア
出身: 静岡県御殿場市
住所: 東京都
所属: AKB1048
   (エーケービー トーシーエイト)
年齢: 自称 21歳
FC2のトリップ: #MNmjYmiU

YouTube: チャンネル
Twitter: @Toshietti

【廣島家のウェブサイト】
 廣島研究所
 http://www.hrsm.net/
 製作記事へのショートカット集です

T and T
三崎港にて

【好きな場所】
 海!
【クリエイティブ系趣味】
 お裁縫、電子工作、激辛料理、
 デジタルヘタ絵、写真
【アウトドア系趣味】
 星見、海外旅行、崖鑑賞
【スポーツ系趣味】
 スキューバダイビング(過去形)、
 テニス(大過去形)、
 アイススケート(超大過去形)

【としえの訪問地】
国内: 全47都道府県
国外: 33ヶ国+7地域くらい
北限: Longyearbyen (北緯78°)
南限: Puerto Iguazú (南緯25°)
東限: 納沙布岬 (東経145°)
西限: Honolulu (西経157°)

カテゴリー
Categories

カレンダー Calendar

01 | 2011/02 | 03
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 - - - - -

コメント Comments

リンク
Favorite Sites

メールフォーム
Mail Form

お名前 your name:
メール e-mail:
件名 subject:
本文 message:

新着 Latest Articles

月別アーカイブ
Monthly Archives

ご案内 Notes

コメントとトラバは、ひろしまとしえの承認後に表示されます。即時性なくてごめんなさい。不承認のときもごめんなさい。間違って投稿された場合は、続けて修正版または削除指示等のコメを再投稿いただければ、それらしくファジィに対応いたします。

鍵コメは投稿できなくしてありますのでメールフォームをご利用ください。

検索 Text Search

RSSs

ランキングサイト
Ranking Sites

ご訪問者数 Visitors

QR Code

QR

携帯電話からはいま一つご覧いただけません。