文字を音楽にする

まずは、テキスト音楽「サクラ」を使って自動生成した「Uta and Koto」を聴いてみましょう。自動生成の元ネタに使ったのは西行の有名な和歌です。

十三絃(箏)という楽器は、名前からも分かるように13本の糸が張られています。この13本の糸を様々に調弦して演奏するのですが、「平調子」という調弦方法では次のような音階に調弦します。

こういう音階になっているので、箏という楽器は適当に弾いてもどこか風雅な響きに聴こえます。この「適当に」という部分をプログラムでコード化するには乱数(1から13までの数字)を作って、その数字の場所の糸を弾くというようにするのが一番簡単な方法なのですが、例えば、文字(コードで表せば数字)を糸の数(13)で割った余りの数を糸の番号だと考えても13種類の数字(0から12)を作ることができます。つまり、和歌のような意味のある文字列を使って、乱数を使った場合と同じように音楽を自動生成することができるのです。文字コードの数値に音楽的な意味があるわけでもないので、乱数を使っても同じだと思うのですが、文字を音楽にして楽しんでみるというのも趣があるかもしれません。

ということで、日本語でプログラミングができる「なでしこ」なら、こんなコードを作れば、和歌から音楽を自動生成できます。

音階=区切(『"レ/"ソ/"ラ/"シ♭/レ/ミ♭/ソ/ラ/シ♭/`レ/`ミ♭/`ソ/`ラ』,"/")
和歌="春風の 花を散らすと 見る夢は さめても胸の さわぐなりけり"

楽譜="Tempo=60 音色(Koto) "
文字=文字列分解(和歌)
(和歌の文字数)回
 糸番号=ASC(文字[回数-1])%13; 楽譜=楽譜&音階[糸番号]&" "

表示(楽譜); MML演奏(楽譜)

なでしこ
https://nadesi.com/
ゼロからはじめてみる日本語プログラミング「なでしこ」
https://news.mynavi.jp/series/nadeshiko

テキスト音楽「サクラ」の場合は、こんな感じのコードになります。

Array Scale =
({o5d},{o4g},{o4a},{o4b-},{o5d},{o5e-},{o5g},{o5a},{o5b-},{o6d},{o6e-},{o6g},{o6a})
Array UTA =
("春","風","の","花","を","散","ら","す","と","見","る","夢","は","さ","め","て","も","胸","の","さ","わ","ぐ","な","り","け","り")

Int NN Int OTO

#GAKUFU="Tempo=60 音色(Koto) "
For(Int i=0; i<SizeOf(UTA); i++){
 NN=ASC(UTA(i))-ASC(UTA(i))/100*100
 OTO=NN-(NN/13*13); #GAKUFU=#GAKUFU+Scale(OTO)+" "
}

Print(#GAKUFU); Play(#GAKUFU) 

テキスト音楽「サクラ」
https://sakuramml.com/
解説
https://sakuramml.com/doc/

サクラの実行画面。macでもWine環境があれば動作します。

MIDIデータで保存して「MuseScore」で楽譜にしてみました。

MuseScore
https://musescore.org/ja

この「文字を音楽にする」という遊び心で作ったのが、アルバム「咲楽」に収録した「Uta and Koto」です。

// Uta and Koto

System.RandomSeed=(2012-23)
Array UTA =
("は","る","か","ぜ","の",
"は","な","を","ち","ら","す","と",
"み","る","ゆ","め","は",
"さ","め","て","も","む","ね","の",
"さ","わ","ぐ","な","り","け","り")
Array KOE =
({o5g},{o5a},{o6c},{o6d},{o6e-},{o6g},{o6a},{o7c},{o7d})
Array SOU =
({'o5do4g'},{o5d},{o4g},{o4a},{o4b-},{o5d},{o5e-},{o5g},{o5a},{o5b-},{o6d},{o6e-},{o6g},{o6a})

#ARP="l(64)"
For(Int i=13; i>=2; i--){
 #ARP=#ARP+SOU(i)
}

Int NN Int OTO_1 Int OTO_2
Tempo(64)
#N1="v.Random(40) q(100) M(20) "
#N2="v.Random(40) q(100) M(00) "

For(Int i=0; i<SizeOf(UTA); i++){
 NN=ASC(UTA(i))-ASC(UTA(i))/100*100
 OTO_1=NN-(NN/SizeOf(KOE)*SizeOf(KOE))
 OTO_2=NN-(NN/SizeOf(SOU)*SizeOf(SOU))
 #N1=#N1+"l("+RandomSelect(1,2)+")"+KOE(OTO_1)+ " "
 #N2=#N2+"l("+RandomSelect(2,1)+")"+SOU(OTO_2)+ " "
}

TR(1) @(55)  TrackName="Voice" P(64+24) REV(40) CHO(04) r2 #N1
TR(2) @(108) TrackName="Koto"  P(64-24) REV(40) CHO(10) #N2 r1r1 #ARP 

歌声の合成には、HMM(Hidden Markov Model)を採用したボーカルシンセサイザー「Sinsy」を使いました。
Sinsy
http://www.sinsy.jp/


この記事が気に入ったらサポートをしてみませんか?