SSブログ
English Version

Z80GalCompactの制作(その5)AMラジオで音楽演奏 [Z80]

 twitter の タイムラインでマイコンから発生する電波を利用してラジオから音楽を流す動画を見かけました。
 学生時代に Z80 マイコンを作り同様なことをやってみたことがありますが、直ぐに1ビットのデジタル出力を使って演奏する方式に移行して二重奏等をやって遊んでいました。

 余りにも懐かし過ぎるので最近開発した Z80 マイコン(Z80GalCompact)を使ってラジオ演奏をやってみました。

 基本はループ処理の周期によってシングルトーンの音を生成するのですが、最初は綺麗な音が中々出ませんでした。色々やってみると AMラジオ側の受信周波数によって聞こえ方が結構違うことに気が付き、良く聞こえる受信周波数にするとそれなりの音が出るようになりました。
 また、演奏音をなるべく綺麗にするために
  1. 雑音低減のために演奏中はタイマ割込みを禁止する
  2. 頻繁に通る分岐処理部分では両方の処理のステート数を合わせる
  3. 音程と長さは1バイト処理にしてトーンジェネレータ以外の処理時間を短くする
等の対策を施すことでそれなりに聞こえるようになりました。今回使用した Z80GalCompact は 20MHz 動作なので上記の第 3 項を実現するために結構な数の NOP 命令をトーンジェネレータ処理部に入れています。

 トーンジェネレータ処理のループ部が合計で 108 ステートとなり、クロック 20MHz の情報と合わせて音程パラメータを計算した結果が下表になります。
 Loop times のカラムがシングルトーンを生成するためのループ回数(=音程パラメータ)で上記のように 1 バイト処理なので Hex カラムが 2 桁以下のデータ部分が使用できる音階になります。

音階パラメータ表


 楽曲としては著作権が消滅しているドイツ民謡で広くなじみのある「かえるの合唱」のデータを使用しました。ネット上にあるこのページ等を参照させて頂きました。
 更に今回は無謀にもラジオを用いた自動演奏による二重奏にチャレンジしてみました。アセンブラで組んだソースが下記になります。

ラジオ演奏 カエルの合唱(Z80 アセンブラ)
;++++++++++++++++++++++++++++++++++++++++ ; play music by AM-radio ; Ver 0.01 2022/07/28 by skyriver ;++++++++++++++++++++++++++++++++++++++++ 0080 LENG EQU 80H ; tone length parameter 0010 WAVREP EQU 16 ; wave repeat times ; note definition($:means #) 00FA N_F0$ EQU 0FAH 00EC N_G0 EQU 0ECH 00DF N_G$0 EQU 0DFH 00D2 N_A1 EQU 0D2H 00C7 N_A$1 EQU 0C7H 00BB N_B1 EQU 0BBH 00B1 N_C1 EQU 0B1H 00A7 N_C$1 EQU 0A7H 009E N_D1 EQU 09EH 0095 N_D$1 EQU 095H 008C N_E1 EQU 08CH 0085 N_F1 EQU 085H 007D N_F$1 EQU 07DH 0076 N_G1 EQU 076H 006F N_G$1 EQU 06FH 0069 N_A2 EQU 069H 0063 N_A$2 EQU 063H 005E N_B2 EQU 05EH 0058 N_C2 EQU 058H 0054 N_C$2 EQU 054H 004F N_D2 EQU 04FH 004A N_D$2 EQU 04AH 0046 N_E2 EQU 046H 0042 N_F2 EQU 042H 003F N_F$2 EQU 03FH 003B N_G2 EQU 03BH 0038 N_G$2 EQU 038H 0035 N_A3 EQU 035H 0032 N_A$3 EQU 032H 002F N_B3 EQU 02FH 002C N_C3 EQU 02CH 002A N_C$3 EQU 02AH 0027 N_D3 EQU 027H 0025 N_D$3 EQU 025H 0023 N_E3 EQU 023H 0021 N_F3 EQU 021H 0000' ASEG ORG 0100H 0100 21 0000 START: LD HL,0 ; wait until serial buffer empty 0103 2B ST00: DEC HL 0104 7C LD A,H 0105 B5 OR L 0106 C2 0103 JP NZ,ST00 0109 F3 DI 010A 21 0150 LD HL,DATA 010D 7E LOOP: LD A,(HL) 010E B7 OR A 010F CA 014E JP Z,EXIT 0112 57 LD D,A 0113 23 INC HL 0114 5E LD E,(HL) 0115 23 INC HL 0116 E5 PUSH HL 0117 0E 80 LD C,LENG ; length 0119 AF XOR A ; clear length sub counter 011A 2E 10 TONE00: LD L,WAVREP ; wave repeat times 011C 42 TONE01: LD B,D ; set tone para 011D 3D TONE02: DEC A ; 4(4) 011E C2 0128 JP NZ,TONE03 ; 10(14) 0121 0D DEC C ; 4 0122 CA 014A JP Z,NEXT ; 10(14) 0125 C3 012E JP TONE04 ; 10(24) 0128 00 00 00 00 TONE03: DB 0,0,0,0 ; 16(30) NOP x 4 012C 00 00 DB 0,0 ; 8(38) 012E 00 00 TONE04: DB 0,0 ; 8(46) 0130 00 00 00 00 DB 0,0,0,0 ; 16(62) 0134 00 00 00 00 DB 0,0,0,0 ; 16(78) 0138 00 00 00 00 DB 0,0,0,0 ; 16(94) 013C 05 DEC B ; 4(98) 013D C2 011D JP NZ,TONE02 ; 10(108) loop:108 * para 0140 2D DEC L 0141 C2 011C JP NZ,TONE01 0144 62 LD H,D 0145 53 LD D,E 0146 5C LD E,H 0147 C3 011A JP TONE00 014A E1 NEXT: POP HL 014B C3 010D JP LOOP 014E FB EXIT: EI 014F C9 RET 0150 DATA: 0150 B1 B1 DB N_C1, N_C1 ; single 0152 B1 B1 DB N_C1, N_C1 0154 9E 9E DB N_D1, N_D1 0156 9E 9E DB N_D1, N_D1 0158 8C 8C DB N_E1, N_E1 015A 8C 8C DB N_E1, N_E1 015C 85 85 DB N_F1, N_F1 015E 85 85 DB N_F1, N_F1 0160 8C 8C DB N_E1, N_E1 0162 8C 8C DB N_E1, N_E1 0164 9E 9E DB N_D1, N_D1 0166 9E 9E DB N_D1, N_D1 0168 B1 B1 DB N_C1, N_C1 016A B1 B1 DB N_C1, N_C1 016C 01 01 DB 1, 1 016E 01 01 DB 1, 1 0170 8C 8C DB N_E1, N_E1 0172 8C 8C DB N_E1, N_E1 0174 85 85 DB N_F1, N_F1 0176 85 85 DB N_F1, N_F1 0178 76 76 DB N_G1, N_G1 017A 76 76 DB N_G1, N_G1 017C 69 69 DB N_A2, N_A2 017E 69 69 DB N_A2, N_A2 0180 76 76 DB N_G1, N_G1 0182 76 76 DB N_G1, N_G1 0184 85 85 DB N_F1, N_F1 0186 85 85 DB N_F1, N_F1 0188 8C 8C DB N_E1, N_E1 018A 8C 8C DB N_E1, N_E1 018C 01 01 DB 1, 1 018E 01 01 DB 1, 1 0190 B1 B1 DB N_C1, N_C1 0192 B1 B1 DB N_C1, N_C1 0194 01 01 DB 1, 1 0196 01 01 DB 1, 1 0198 B1 B1 DB N_C1, N_C1 019A B1 B1 DB N_C1, N_C1 019C 01 01 DB 1, 1 019E 01 01 DB 1, 1 01A0 B1 B1 DB N_C1, N_C1 01A2 B1 B1 DB N_C1, N_C1 01A4 01 01 DB 1, 1 01A6 01 01 DB 1, 1 01A8 B1 B1 DB N_C1, N_C1 01AA B1 B1 DB N_C1, N_C1 01AC 01 01 DB 1, 1 01AE 01 01 DB 1, 1 01B0 B1 B1 DB N_C1, N_C1 01B2 01 01 DB 1, 1 01B4 9E 9E DB N_D1, N_D1 01B6 01 01 DB 1, 1 01B8 8C 8C DB N_E1, N_E1 01BA 01 01 DB 1, 1 01BC 85 85 DB N_F1, N_F1 01BE 01 01 DB 1, 1 01C0 8C 8C DB N_E1, N_E1 01C2 8C 8C DB N_E1, N_E1 01C4 9E 9E DB N_D1, N_D1 01C6 9E 9E DB N_D1, N_D1 01C8 B1 B1 DB N_C1, N_C1 01CA B1 B1 DB N_C1, N_C1 01CC 01 01 DB 1, 1 01CE 01 01 DB 1, 1 01D0 B1 B1 DB N_C1, N_C1 ; duo 01D2 B1 B1 DB N_C1, N_C1 01D4 9E 9E DB N_D1, N_D1 01D6 9E 9E DB N_D1, N_D1 01D8 8C 8C DB N_E1, N_E1 01DA 8C 8C DB N_E1, N_E1 01DC 85 85 DB N_F1, N_F1 01DE 85 85 DB N_F1, N_F1 01E0 8C 8C DB N_E1, N_E1 01E2 8C 8C DB N_E1, N_E1 01E4 9E 9E DB N_D1, N_D1 01E6 9E 9E DB N_D1, N_D1 01E8 B1 B1 DB N_C1, N_C1 01EA B1 B1 DB N_C1, N_C1 01EC 01 01 DB 1, 1 01EE 01 01 DB 1, 1 01F0 8C B1 DB N_E1, N_C1 01F2 8C B1 DB N_E1, N_C1 01F4 85 9E DB N_F1, N_D1 01F6 85 9E DB N_F1, N_D1 01F8 76 8C DB N_G1, N_E1 01FA 76 8C DB N_G1, N_E1 01FC 69 85 DB N_A2, N_F1 01FE 69 85 DB N_A2, N_F1 0200 76 8C DB N_G1, N_E1 0202 76 8C DB N_G1, N_E1 0204 85 9E DB N_F1, N_D1 0206 85 9E DB N_F1, N_D1 0208 8C B1 DB N_E1, N_C1 020A 8C B1 DB N_E1, N_C1 020C 01 01 DB 1, 1 020E 01 01 DB 1, 1 0210 B1 8C DB N_C1, N_E1 0212 B1 8C DB N_C1, N_E1 0214 01 85 DB 1, N_F1 0216 01 85 DB 1, N_F1 0218 B1 76 DB N_C1, N_G1 021A B1 76 DB N_C1, N_G1 021C 01 69 DB 1, N_A2 021E 01 69 DB 1, N_A2 0220 B1 76 DB N_C1, N_G1 0222 B1 76 DB N_C1, N_G1 0224 01 85 DB 1, N_F1 0226 01 85 DB 1, N_F1 0228 B1 8C DB N_C1, N_E1 022A B1 8C DB N_C1, N_E1 022C 01 01 DB 1, 1 022E 01 01 DB 1, 1 0230 B1 B1 DB N_C1, N_C1 0232 01 B1 DB 1, N_C1 0234 9E 01 DB N_D1, 1 0236 01 01 DB 1, 1 0238 8C B1 DB N_E1, N_C1 023A 01 B1 DB 1, N_C1 023C 85 01 DB N_F1, 1 023E 01 01 DB 1, 1 0240 8C B1 DB N_E1, N_C1 0242 8C B1 DB N_E1, N_C1 0244 9E 01 DB N_D1, 1 0246 9E 01 DB N_D1, 1 0248 B1 B1 DB N_C1, N_C1 024A B1 B1 DB N_C1, N_C1 024C 01 01 DB 1, 1 024E 01 01 DB 1, 1 0250 B1 B1 DB N_C1, N_C1 0252 01 01 DB 1, 1 0254 9E 9E DB N_D1, N_D1 0256 01 01 DB 1, 1 0258 8C 8C DB N_E1, N_E1 025A 01 01 DB 1, 1 025C 85 85 DB N_F1, N_F1 025E 01 01 DB 1, 1 0260 8C 8C DB N_E1, N_E1 0262 8C 8C DB N_E1, N_E1 0264 9E 9E DB N_D1, N_D1 0266 9E 9E DB N_D1, N_D1 0268 B1 B1 DB N_C1, N_C1 026A B1 B1 DB N_C1, N_C1 026C 01 01 DB 1, 1 026E 01 01 DB 1, 1 0270 00 DB 0 ; end of data END


 流石に完全な二重奏とまではいきませんが「かえるの合唱」の輪唱がそれなりに聞こえるようになりました^^


★追記 2022/7/28
 twitter に投稿した動画付きのメッセージを貼っておきます。




★追記 2022/08/15
 twitterにアップした動画はラジオのパネルに天井の照明が写り込んで見辛かったので動画を取り直して説明コメントも付けてYoutubeにアップしました。




[TOP] [ 前へ ] 連載記事 [ 次へ ]

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。