標準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

前へ
次へ
ホームページトップへ戻る