標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第560回]
●電子オルガンプログラム(音階データ)の説明
前回は電子オルガンプログラムの説明の途中で時間がなくなってしまいました。
肝心のサウンドテーブルの説明ができませんでしたので、本日はそこのところの説明をいたします。
本日もちょっと時間がありませんから、それだけで終わってしまいそうです。
前回もお見せした電子オルガンプログラムのサウンドテーブルです。
それだけではその数値がどこから出てきたのかさっぱりわからんではないか、と言われてしまいそうですので、後ろにコメントを追加いたしました。
; ; SOUND TABLE 803F 7F SNDTBL:DB 7F;so4 [0] 392Hz 2551/2=1275 7F(=127) 8040 77 DB 77;so#4 [1] 416Hz 2404/2=1202 77(=119) 8041 71 DB 71;ra4 [2] 440Hz 2273/2=1136 71(=113) 8042 6A DB 6A;ra#4 [3] 466Hz 2146/2=1073 6A(=106) 8043 5F DB 5F;do5 [4] 523Hz 1912/2=956 5F(=95) 8044 59 DB 59;do#5 [5] 555Hz 1802/2=901 59(=89) 8045 54 DB 54;re5 [6] 587Hz 1704/2=852 54(=84) 8046 4F DB 4F;re#5 [7] 622Hz 1608/2=804 4F(=79) 8047 47 DB 47;fa5 [8] 699Hz 1431/2=715 47(=71) 8048 43 DB 43;fa#5 [9] 741Hz 1350/2=675 43(=67) 8049 3F DB 3F;so5 [A] 784Hz 1276/2=638 3F(=63) 804A 3B DB 3B;so#5 [B] 831Hz 1203/2=602 3B(=59) 804B 35 DB 35;ra#5 [C] 933Hz 1072/2=536 35(=53) 804C 32 DB 32;si5 [D] 988Hz 1012/2=506 32(=50) 804D 2F DB 2F;do6 [E] 1047Hz 955/2=477 2F(=47) 804E 2C DB 2C;do#6 [F] 1110Hz 901/2=450 2C(=44) 804F 25 DB 25;mi6 [RUN] 1319Hz 768/2=379 25(=37) 8050 27 DB 27;re#6 [RET(CONT)] 1245Hz 803/2=402 27(=39) 8051 2A DB 2A;re6 [ADRSSET] 1175Hz 851/2=425 2A(=42) 8052 4B DB 4B;mi5 [RD DEC] 659Hz 1517/2=758 4B(=75) 8053 38 DB 38;ra5 [RD INC] 880Hz 1136/2=568 38(=56) 8054 64 DB 64;si4 [WR INC] 494Hz 2024/2=1012 64(=100) 8055 23 DB 23;fa6 [STORE(I/O)] 1397Hz 716/2=358 23(=35) 8056 21 DB 21;fa#6 [LOAD(REG)] 1481Hz 675/2=337 21(=33)
ちょうどすぐ上にあって見易いですから、一番下のデータで説明をいたします。
一番下のデータはキーコードの17に対応しています。
[LOAD]キーです。このキーはTK80では[LOAD]ですがND80ZVでは[REG]キーになります。
テーブルデータはキーコードの順に並んでいます。
音階はオクターブ6のファ#です。
fa#6とコメントしています。
ファ#6の音の周波数は1481Hzです。
この周波数は多少あやしいです。
#のついた音の周波数の正確なデータが見つかりませんでしたので、前後の音の周波数から算出しました。
周波数データの次に書いてある数値は、周期をμsecで示したものです。
1/1481で秒単位の周期が求まります。それに106を掛けたものです。
675μsecです。
それを2で割っています。
1周期の1/2の時間です。
HパルスまたはLバルスの長さになります。
337μsecです。
その後ろには、わかりやすいように、このアドレスのデータを再記しています。
16進数の21です。()の中はその値を10進数に直したものです。
前回、HパルスまたはLパルスの長さは、このテーブルの値に10μsecを掛けたものです、と説明しました。
()の中の数33に10を掛けると、330になります。
音の周波数から算出したHまたはLの長さ337μsecに近い値になっています。
じつはテーブルの値は、音の周波数から求めたHまたはLの長さを10で割って、小数点以下を切り捨てにして求めたものです。
値によってはさらに1をマイナスしているものもあります。
もともとこのテーブルはMYCPU80のサンプルプログラムを作ったときのもので、MYCPU80はCPUクロックが2MHzでしたので、HまたはLのパルスを切り換えて出力するためのOUT命令やそのほかの計算に含まれない命令でだいたい10μsecかかりましたので、そのような補正をしていたものです。
しかしND80ZVはCPUクロックが6MHzですから、10μsecもの時間は余分にはかかりません。
そういうことからすれば、ここで−1しているのはかえって不正確な値になってしまっている、とも言えますから、本当は、−1しない値に直したほうがよかったかもしれません。
しかし、まあ、たかだか10μsecの違いですから、どちらにしても、似たようなものですから、MYCPU80のときのデータのまま、ということにいたします。
2010.7.22upload
前へ
次へ
ホームページトップへ戻る