create every day - 福野泰介の一日一創

IchigoJam x YMF825でつくる、4オペレータFM音源音色エディタ

2017/09/02 23:55:00
#IchigoJam #sound #maker 

FM音源モジュール「YMF825Board」をフルに活かす4オペレータFM音源音色エディタを作ってみました。(準備と接続方法マシン語で高速化

音色は、ベースの高さ(BO)、音の揺れ(LFO)、アルゴリズム(ALG)の3つに、17種類のパラメータをもつ4オペレータ(68パラメータ)を加えた全71パラメータで決定します。

これらパラメータに0〜70のIDをふり、ひとつひとつ値を変更すると鳴る、シンプルな音色エディタのできあがり。デフォルトとしてシンプルな矩形波で初期化しています(80行)。

1 'FM INIT 10 OUT1,0:WAIT1:OUT4,1:OUT1,1 20 A=#700:POKEA,80,35,27,2,91,28,27,4,0,34,26,98,1,33,201,3,0,34,8,66,0,208,4,50,154,97,2,50,154,97,73,8,246,209,8,34,26,98,112,71 30 S=#728:POKES,80,35,27,2,91,28,27,4,128,33,0,34,8,66,0,208,4,50,154,97,2,50,154,97,73,8,246,209,112,71 40 LET[0],#1D01,#020E,-1,#0001,#0100,#1AA3,-1,#1A00,-30,#0204,-1,#0204,-1,#0200,#197C,#1B3F,#1400,#0301,#08F6,-21,#0800,#09FB,#0A00,#01740,#1800,0 50 FORJ=0TO99:N=[J]:IF !N J=99:GOTO70 60 IF N<0 WAIT -N ELSE U=USR(A,N) 70 NEXT 80 FORI=0TO70:[I]=0:NEXT:[20]=5:[25]=15:[35]=6 90 LRUN FILE()+1 SAVE0 NEW 1 'FM EDITOR 4OP 10 CLS:?"BO 3 0:";[0]:?"LFO 3 1:";[1]:?"ALG 7 2:";[2] 20 L="SR 15XOF 1KSR 1RR 15DR 15AR 15SL 15TL 63KSL 3DAM 3EAM 1DVB 3EVB 1MUL15DT 7WS 31FB 7" 30 FORI=0TO16:LC0,4+I:?STR$(L+I*5,5):NEXT 40 FORJ=0TO3:LC7+J*6,3:?"OP";J+1:FORI=0TO16:LC6+J*6,4+I:?DEC$(3+J*17+I,2);":";[3+J*17+I]:NEXT:NEXT 50 INPUT"ID :",I 60 INPUT"VAL:",[I] 70 GSB@SETTONE:GSB@PLAY 80 GOTO 10 100 @SETTONE 110 POKE#8A8,7,#81,[0],[1]<<6+[2] 120 FORJ=0TO3:P=3+J*17 130 POKE#8AC+J*7,[P]<<4+[P+1]<<3+[P+2],[P+3]<<4+[P+4],[P+5]<<4+[P+6],[P+7]<<2+[P+8],[P+9]<<5+[P+10]<<4+[P+11]<<1+[P+12],[P+13]<<4+[P+14],[P+15]<<3+[P+16] 140 NEXT 150 U=USR(A,#08F6):WAIT1:U=USR(A,#0800) 160 OUT4,0:FORK=0TO35:U=USR(S,PEEK(#8A8+K)):NEXT:OUT4,1 160 RTN 200 @PLAY 210 T=#1465 220 U=USR(A,#0B00):U=USR(A,#0F00):U=USR(A,#0C54):U=USR(A,#0D00+T>>8):U=USR(A,#0E00+T&#FF):U=USR(A,#0F40) 230 RTN SAVE1 LRUN0

IchigoJamの2ファイルを使います。1つは初期化、もう1つが音色エディタ本体。いい音ができたら、「FM音源キーボード」で鳴らしてみましょう!

音色エディタの画面づくりで、文字列コマンド(STR$)を使った容量削減テクニック。

10 CLS:?"BO 3 0:";[0]:?"LFO 3 1:";[1]:?"ALG 7 2:";[2] 20 L="SR 15XOF 1KSR 1RR 15DR 15AR 15SL 15TL 63KSL 3DAM 3EAM 1DVB 3EVB 1MUL15DT 7WS 31FB 7" 30 FORI=0TO16:LC0,4+I:?STR$(L+I*5,5):NEXT 40 FORJ=0TO3:LC7+J*6,3:?"OP";J+1:FORI=0TO16:LC6+J*6,4+I:?DEC$(3+J*17+I,2);":";[3+J*17+I]:NEXT:NEXT

音色エディタプログラムからの抜粋(RUN on IchigoJam web
変数Lに保存した文字列ポインタを使って「STR$(L+I*5,5)」として5文字ずつ取り出して表示しています。


SR 15 とあるのは0-15の値で指定するという意味です。
いろんな音作りにチャレンジしてみましょう。

ALG: アルゴリズム(ALG0はALG5で、ALG1はALG2で代用できるので実質6種類)

(ymf825board manual / Tone Parameterより)

WS: 発振器の波の形(0:正弦波、6:矩形波、16:三角波、26:のこぎり波、他全29種類)

(ymf825board manual / Tone Parameterより)

AR: アタックレート、立ち上がりの速さ 15で最速、0で立ち上がらない(鳴らない)
DR: ディケイレート、立ち上がり後の減衰の速さ 15で最速、0で減衰しない
SL: サステインレベル、ディケイ後の音量 15で消える、0で減衰しない
SR: サステインレート、ディケイ後の減衰の速さ 15で最速、0で減衰しない
RR: リリースレート、キーオフ後の減衰の速さ 15で最速、0で減衰しない(鳴り続ける)

FB: フィードバック、自分自身をモジュレート(オペレータ1と、オペレータ3のアルゴリズム2と5のみ)
YMF825のFM音源のパラメータのマニュアル」を見ながら、いろいろいじってみましょう。

おまけ、音色書込み用のデータから71コのパラメータ配列に戻すプログラム

1 'FM-TONE REV CONVERT 100 B=#8AA 110 V=PEEK(B):[0]=V&3 120 V=PEEK(B+1):[1]=V>>6:[2]=V&7 130 FOR I=0 TO 3 140 B=#8AA+2+I*7:P=3+I*17 150 V=PEEK(B):[P]=V>>4:[P+1]=V>>3&1:[P+2]=V&1 160 V=PEEK(B+1):[P+3]=V>>4:[P+4]=V&15 170 V=PEEK(B+2):[P+5]=V>>4:[P+6]=V&15 180 V=PEEK(B+3):[P+7]=V>>2:[P+8]=V&3 190 V=PEEK(B+4):[P+9]=V>>5:[P+10]=V>>4&1:[P+11]=V>>1&3:[P+12]=V&1 200 V=PEEK(B+5):[P+13]=V>>4:[P+14]=V&7 210 V=PEEK(B+6):[P+15]=V>>3:[P+16]=V&7 220 NEXT

C言語などへ移植する場合は、演算子の優先順位が異なるので注意!
ルールメイカーになろう! 1+2x3=? 演算子優先順位仕様変更の言い訳

links
- YMF825Board紹介
- YMF825BoardとIchigoJamの接続方法
- YMF825用マシン語高速ドライバとキーボード

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / high-res profile image