Blackadderは分数コードとして捉えると上が Aug なので緊張度が高い.
このあたりの仕組みは最初のエントリーで触れた. tokidoki.hatenablog.jp
同様なことは dim でも言えるのだけど,これらchromatic 12音を等分割するコードは一般に多数の文脈での解釈が可能だ.
dim や Aug はコード同士の乗り換え・乗り継ぎのためのハブのような役割をする.
更にその Aug のルートに対してこれまた12音を等分割する IV# の音を添える.
だから自ずと Blackadderは多義的解釈ができてしまう,したがって代理和音として様々に使われうるのだろうと想像はするものの,どれだけの可能性があるのかまだ検討していない.
REM [疑似母音フォルマント シミュレータ]REM Ver. 2017/12/23REM 参考:REM BASIC 元ネタ:http://hp.vector.co.jp/authors/VA008683/ExtProg.htmREM testwave.bas 十進BASICによる音声ファイル生成プログラム REM chr$関数の引数として全ての1バイト整数が許される様に、オプションメニューのREM 「互換性」「動作」で「文字列処理の単位」を「バイト」に設定して実行することREM フォルマント:https://qiita.com/rild/items/339c5c36f4c1ad8d4325OPTION CHARACTER BYTE
DECLAREFUNCTION formant
INPUT PROMPT "母音とその高さの列をどうぞ.(「あい↑う↑↑え↓お」は a3i7u9e0o2 など)":vw$LET vwlen=LEN(vw$)
LET d=0.3 !継続時間(秒)
LET f0=220 !正弦波周波数(Hz)
LET db=-10 !生成波形の最大値(±32767を0dBとする)
LET fs=44100 !標本化周波数(Hz)
LET bps=fs*4 !1秒当りのデータ量(ステレオ16ビット量子化)
LET dsize=d*vwlen*fs*4 !オーディオデータサイズ
LET fsize=dsize+36 !ファイルサイズ(先頭8Bを除く)
LET fmtsize=16 !フォーマットサイズ
LET channel=2^17+1 !ステレオPCMデータの指定
LET reso=2^20+4 !16ビットの指定
LET a=10^(db/20)
OPEN#6 : NAME"test.wav" !ファイルを開き、この名前のファイルが
ERASE#6 !既に存在していた場合には上書きを指定
LET t0=TIME
PRINT#6 : "RIFF"; !以下、wavファイルのヘッダーを作成
CALL out4(fsize) !
PRINT#6 : "WAVEfmt "; !
CALL out4(fmtsize) !
CALL out4(channel) !
CALL out4(fs) !
CALL out4(bps) !
CALL out4(reso) !
PRINT#6 : "data"; !
CALL out4(dsize) !ここまでがヘッダー用の出力
LET al=a*32767 !左チャネル係数
LET ar=a*65535 !右チャネル係数
LET k0=f0/fs*PI*2 !引数の刻み
LET audio$="" !オーディオデータバッファを初期化
FOR vw=0 TO vwlen/2-1LET count=0 !カウンタをリセット
LET vow$=vw$(vw*2+1:vw*2+1)
LET ht=VAL(vw$(vw*2+2:vw*2+2))
PRINT vow$,ht
FOR i=1 TO d*fs
LET vsin=formant(vow$,k0*(1+ht/20))
LET lch=INT(vsin*al+0.5)
IF lch<0THENLET lch=lch+65536 !負の数は補数表現
LET rch=INT(vsin*ar+0.5)
IF rch<0THENLET rch=rch+65536 !負の数は補数表現
LET audio$=audio$&CHR$(MOD(lch,256))&CHR$(INT(lch/256))&CHR$(MOD(rch,256))&CHR$(INT(rch/256))
LET count=count+1IF count=64THEN !バッファデータが所定の長さ(64サンプル256Bがほぼ最適)に達したら
PRINT#6 : audio$; !データをファイルに出力して
LET audio$="" !バッファを初期化し
LET count=0 !カウンタをリセット
ENDIFNEXT i
PRINT#6 : audio$; !バッファに残ったデータを出力して
NEXT vw
CLOSE#6 !ファイルを閉じる
PRINT"elapsed time = ";TIME-t0;"seconds"
PLAYSOUND "test.wav"SUB out4(i4) !4バイト整数の出力(little endian)
LET j4=i4
FOR m=0 TO 3PRINT#6 : CHR$(MOD(j4,256));
LET j4=INT(j4/256)
NEXT m
ENDSUBFUNCTION formant(v$,k)
SELECTCASE v$CASE"a"LET formant=0.19*SIN(i*k*4)+0.09*SIN(i*k*2)+0.08*SIN(i*k*3)+0.08*SIN(i*k*5)+0.07*SIN(i*k*1)+0.07*SIN(i*k*6)
CASE"i"LET formant=0.19*SIN(i*k)+0.09*SIN(i*k*2)+0.08*SIN(i*k*11)+0.08*SIN(i*k*13)+0.07*SIN(i*k*12)
CASE"u"LET formant=0.19*SIN(i*k)+0.09*SIN(i*k*6)+0.08*SIN(i*k*2)+0.08*SIN(i*k*5)+0.08*SIN(i*k*4)
CASE"e"LET formant=0.19*SIN(i*k)+0.09*SIN(i*k*2)+0.08*SIN(i*k*3)+0.08*SIN(i*k*11)+0.07*SIN(i*k*4)
CASE"o"LET formant=0.19*SIN(i*k*4)+0.09*SIN(i*k*2)+0.08*SIN(i*k)+0.08*SIN(i*k*3)
CASEELSELET formant=SIN(i*k)
ENDSELECTENDFUNCTIONEND