「なでしこ」で百人一首music その9
「なでしこ」で百人一首musicシリーズも、だんだん佳境に入ってきた。
今日は、言葉を音に換えるアルゴリズムに使っているデータ項目や、ソフトシンセを演奏させるための楽器の名前など、プログラムで使っているほとんどの変数を、
プログラムの実行時に指定できるようにしてみる。
「
なでしこ」には、こんな時に便利な命令がある。「項目記入」という命令だ。
項目記入
http://nadesi.com/doc/cmd/doc.cgi?mode=cmd&id=2406
この「項目記入」命令を使って、1度に下記のようなパラメータを設定できるようにしてみる。
音程・・・・変換する音階を/で区切ってMML形式で指定
和歌1・・・・素材になる文字列 1
和歌2・・・・素材になる文字列 2
楽器1・・・・和歌1を演奏させる楽器の名前
楽器2・・・・和歌2を演奏させる楽器の名前
位置1・・・・和歌1を演奏させる楽器のパンの位置
位置2・・・・和歌2を演奏させる楽器のパンの位置
速度・・・・演奏速度
各パラメータには、初期値を設定してあるので、このままでも演奏できるのだが、色々と中身を変えてやってみて欲しい。
楽器の名前の指定は注意が必要だ。ここを参照して間違わないように指定してください。
GMレベルの楽器定義
http://oto.chu.jp/doc/command/index2.htm#cmd17//百人一首music_9母艦のタイトル="百人一首 de MUSIC"入力項目=「音程=ミ/"ラ/"シ/ド/ミ/ファ/ラ/シ/`ド/`ミ/`ファ/`ラ/`シ和歌1=秋の田の 仮庵の伊庵の 苫をあらみ わが衣出は 露に濡れつつ和歌2=春過ぎて 夏来にけらし 白砂の 衣ほすてふ 天の香具山楽器1=Koto楽器2=Koto位置1=0位置2=127速度=60」入力内容=項目記入(入力項目)音階=区切(入力内容@音程 "/")和歌[1]=入力内容@和歌1; 楽器[1]=入力内容@楽器1; 位置[1]=入力内容@位置1和歌[2]=入力内容@和歌2; 楽器[2]=入力内容@楽器2; 位置[2]=入力内容@位置2楽譜[0]="Tempo={入力内容@速度}"2 回 音色=楽器[回数]; パン=位置[回数] "歌{回数} = "&和歌[回数]を表示 歌音="" 歌音変換(和歌[回数],歌音); 楽譜[回数]="TR({回数}) 音色({音色}) P({パン}) REV(100)"&歌音ここまで表示(楽譜); 表示("マウスをクリックすると演奏します")母艦をクリックした時は 楽譜をMML演奏●歌音変換({参照渡し}和歌,{参照渡し}歌音) 文字=和歌を文字列分解したもの 和歌の文字数 回 弦番号=ASC(文字[回数-1])%配列要素数(音階) もし(文字[回数-1]=" ")ならば 音符="r4" 違えば、もし(文字[回数-1]>"ん")ならば 音符=音階[弦番号]&"2" 違えば 音符=音階[弦番号]&"4" ここまで 歌音=歌音&音符//ここまでこれぐらいのパラメータが可変にできれば、パラメータの設定次第で無限に音楽を生成できる。
「なでしこ」で百人一首music その8
昨日は、読み込むテキストファイルの名前をプログラムの中に書いていたのだが、今日は、このファイル名を「ファイルを開く」ダイアログを使ってやってみる。
「
なでしこ」で、ファイル選択ダイアログを表示するのはものすごく簡単で、「
ファイル選択」という命令を記述すれば良い。
ファイル選択
http://nadesi.com/doc/cmd/doc.cgi?mode=cmd&id=452//百人一首music_8音階=区切(『"ミ/"ラ/"シ/ド/ミ/ファ/ラ/シ/`ド/`ミ/`ファ/`ラ/`シ』 "/")楽譜[0]="Tempo=60"文書名=ファイル選択; 表示(文書名); 文書=読む(文書名)歌音=""; 歌音変換(文書,歌音); 楽譜[1]=歌音; 楽譜を表示表示("マウスをクリックすると演奏します")母艦をクリックした時は 楽譜をMML演奏●歌音変換({参照渡し}和歌,{参照渡し}歌音) 文字=和歌を文字列分解したもの 和歌の文字数 回 弦番号=ASC(文字[回数-1])%13 もし(文字[回数-1]=" ")ならば 音符="r4" 違えば、もし(文字[回数-1]>"ん")ならば 音符=音階[弦番号]&"2" 違えば 音符=音階[弦番号]&"4" ここまで 歌音=歌音&音符//ここまでテキストファイルなど、表示するファイルの種類を拡張子で限定したい場合は、ファイル選択コマンドに、下の例のようにパラメータを設定すればよい。
ファイル選択("テキスト|*.txt|なでしこ|*.nako|全て|*.*")
「なでしこ」で百人一首music その7
今日は、「文字を素材に音を作る」プログラムの「文字」のところを、テキストファイルから読み込むことをやってみる。
「
なでしこ」で、テキストファイルを読み込むのはとても簡単で、ファイル名を指定して、
読む命令を実行すれば良い。
読む
http://nadesi.com/doc/cmd/doc.cgi?mode=cmd&id=502読み込むファイルは、テキストファイルなら何でもいいのだが、昨日のプログラムを、百人一首music_6.nako という名前でデスクトップ保存し、これを読み込んでみた。
//百人一首music_7音階=区切(『"ミ/"ラ/"シ/ド/ミ/ファ/ラ/シ/`ド/`ミ/`ファ/`ラ/`シ』 "/")楽譜[0]="Tempo=60"文書=読む("{デスクトップ}百人一首music_6.nako")歌音=""; 歌音変換(文書,歌音); 楽譜[1]=歌音; 楽譜を表示表示("マウスをクリックすると演奏します")母艦をクリックした時は 楽譜をMML演奏●歌音変換({参照渡し}和歌,{参照渡し}歌音) 文字=和歌を文字列分解したもの 和歌の文字数 回 弦番号=ASC(文字[回数-1])%13 もし(文字[回数-1]=" ")ならば 音符="r4" 違えば、もし(文字[回数-1]>"ん")ならば 音符=音階[弦番号]&"2" 違えば 音符=音階[弦番号]&"4" ここまで 歌音=歌音&音符//ここまでこれで、どんなテキストファイルでも音にして楽しむことができるようになる。ちょっと長いテキストファイルでも全然OKだ。
「
『文字を素材に音を作るプログラム』を素材に音を作るプログラム」なんて、なんか面白いですよねー。
「なでしこ」で百人一首music その6
今日は、昨日までの「文字を素材に音を作る」プログラムをさらに発展させてみる。
一つは入力できる歌の数を可変にして、歌の数をいくつにするか指定できるようにする。
もう一つは、マウスをクリックした時に、MMLを演奏させるようにする。これは、いわゆる
イベントドリブンの処理になるわけで、これでプログラムがぐっとWindowsアプリケーションっぽくなる。
//百人一首music_6
音階=区切(『"ミ/"ラ/"シ/ド/ミ/ファ/ラ/シ/`ド/`ミ/`ファ/`ラ/`シ』 "/")
楽譜[0]="Tempo=60"
歌数=尋ねる("歌の数を入力してください")
歌数 回
和歌[回数]=尋ねる("歌{回数}を入力してください")
歌音=""
回数で条件分岐
1ならば PAN=000
2ならば PAN=127
違えば PAN=127/2
歌音変換(和歌[回数],歌音); 楽譜[回数]="TR({回数}) 音色(Koto) P({PAN})"&歌音
"歌{回数} = "&和歌[回数]を表示
ここまで
表示("マウスをクリックすると演奏します")
母艦をクリックした時は
楽譜を表示; 楽譜をMML演奏
●歌音変換({参照渡し}和歌,{参照渡し}歌音)
文字=和歌を文字列分解したもの
和歌の文字数 回
弦番号=ASC(文字[回数-1])%13
もし(文字[回数-1]=" ")ならば
音符="r4"
違えば、もし(文字[回数-1]>"ん")ならば
音符=音階[弦番号]&"2"
違えば
音符=音階[弦番号]&"4"
ここまで
歌音=歌音&音符
//ここまで
マウスクリックでMMLを演奏することにしたので、これで何度でも好きなだけ画面をクリックして演奏を楽しむことができるようになった。
「なでしこ」で百人一首music その5
「文字を素材に音を作る」プログラム、昨日までは文字をプログラムの中で定義していたのだが、今日はこの
文字をパソコンのキーボードから入力できるようにしてみる。
「
なでしこ」でキーボードから文字列を入力するには、「
尋ねる」という命令を使う。
尋ねる
http://nadesi.com/doc/cmd/doc.cgi?mode=cmd&id=451昨日と同じように、文字列の種類を2種類にして、2回のループのなかで和歌[回数]の配列の中に、入力された文字列を格納するようにしている。
//百人一首music_5音階=区切(『"ミ/"ラ/"シ/ド/ミ/ファ/ラ/シ/`ド/`ミ/`ファ/`ラ/`シ』 "/")楽譜[0]="Tempo=60"2 回 和歌[回数]=尋ねる("歌{回数}を入力してください") "歌{回数} = "&和歌[回数]を表示 歌音="" 回数で条件分岐 1ならば PAN=000 2ならば PAN=127 違えば PAN=127/2 歌音変換(和歌[回数],歌音); 楽譜[回数]="TR({回数}) 音色(Koto) P({PAN})"&歌音ここまで楽譜を表示; 楽譜をMML演奏●歌音変換({参照渡し}和歌,{参照渡し}歌音) 文字=和歌を文字列分解したもの 和歌の文字数 回 弦番号=ASC(文字[回数-1])%13 もし(文字[回数-1]=" ")ならば 音符="r4" 違えば、もし(文字[回数-1]>"ん")ならば 音符=音階[弦番号]&"2" 違えば 音符=音階[弦番号]&"4" ここまで 歌音=歌音&音符//ここまで文字列として、いままでは「百人一首」を使ってみたが、文字であれば実は何でも良い。漢字やかなが混じっていれば、音譜の長さが文字の種類によって変化する。半角文字の場合は今のアルゴリズムでは全て4部音符になる。
「なでしこ」で百人一首music その4
「文字を素材に音を作る」部分を関数にしてみたので、プログラムがだいぶすっきりしてきたし、拡張もやりやすくなってきた。
そこで今日は、2つの和歌を定義して、これを素材に琴の二重奏をするプログラムを作ってみる。
和歌を定義している変数と楽譜(MML)を定義している変数を配列にして、2回ループさせてある。
もうひとつ、ループの中で、「(条件式)で条件分岐」という命令を使っている。これは、複数の選択肢の中から条件に合うものだけを実行する(select case 文に相当する)という命令だ。
条件分岐
http://nadesi.com/doc/cmd/doc.cgi?mode=cmd&id=210//百人一首music_4音階=区切(『"ミ/"ラ/"シ/ド/ミ/ファ/ラ/シ/`ド/`ミ/`ファ/`ラ/`シ』 "/")和歌[1]="秋の田の 仮庵の伊庵の 苫をあらみ わが衣出は 露に濡れつつ"和歌[2]="春過ぎて 夏来にけらし 白砂の 衣ほすてふ 天の香具山"楽譜[0]="Tempo=60"2 回 歌音="" 回数で条件分岐 1ならば PAN=000+20 2ならば PAN=127-20 歌音変換(和歌[回数],歌音); 楽譜[回数]="TR({回数}) 音色(Koto) P({PAN})"&歌音 "歌{回数} = "&和歌[回数]を表示ここまで楽譜を表示; 楽譜をMML演奏●歌音変換({参照渡し}和歌,{参照渡し}歌音) 文字=和歌を文字列分解したもの 和歌の文字数 回 弦番号=ASC(文字[回数-1])%13 もし(文字[回数-1]=" ")ならば 音符="r4" 違えば、もし(文字[回数-1]>"ん")ならば 音符=音階[弦番号]&"2" 違えば 音符=音階[弦番号]&"4" ここまで 歌音=歌音&音符//ここまでこれは、なかなか面白いです。和歌の部分を色々変更して楽しんでみましょう。
「なでしこ」で百人一首music その3
「
なでしこ」を使って「文字を素材に音を作る」プログラミングの試みも、次第にプログラムの形ができてきた。
今日は、「文字を音に変える」アルゴリズム部分を、歌音変換()という
関数として定義してみる。変換前の文字列と返還後のMMLを引数にしてみた。
●歌音変換({参照渡し}和歌,{参照渡し}歌音)
和歌・・・・MMLに変換する文字列
歌音・・・・変換されたMML文字列
引数の前に書いてある{参照渡し}というのは、関数の外で定義されている変数を関数内で直接利用する場合に指定する。
//百人一首music_3音階=区切(『"ミ/"ラ/"シ/ド/ミ/ファ/ラ/シ/`ド/`ミ/`ファ/`ラ/`シ』 "/")和歌="秋の田の 仮庵の伊庵の 苫をあらみ わが衣出は 露に濡れつつ"歌音=""; 歌音変換(和歌,歌音)楽譜="Tempo=60 音色(Koto) "&歌音和歌を表示; 楽譜を表示楽譜をMML演奏●歌音変換({参照渡し}和歌,{参照渡し}歌音) 文字=和歌を文字列分解したもの 和歌の文字数 回 弦番号=ASC(文字[回数-1])%13 もし(文字[回数-1]=" ")ならば 音符="r4" 違えば、もし(文字[回数-1]>"ん")ならば 音符=音階[弦番号]&"2" 違えば 音符=音階[弦番号]&"4" ここまで 歌音=歌音&音符//ここまで関数を使うことで、プログラムもだいぶすっきりしてきました。
「なでしこ」で百人一首music その2
昨日やった「文字を素材に音を作る」方法では、音符を全部4分音符にしてあるので、メロディーがちょっと単調だ。
そこで今日は、
音符の長さを文字によって変えるというアルゴリズムを入れてみる。色んな方法があると思うのだが、こんなことを考えてみた。
文字が漢字の場合 → 2部音符
文字がかなの場合 → 4部音符
文字が空白の場合 → 4部休符
この、切り分けをIF(条件)文にあたる、「
なでしこ」の、
もし(条件)文でやってみる。
もし
http://nadesi.com/doc/cmd/doc.cgi?mode=cmd&id=200//百人一首music_2音階=区切(『"ミ/"ラ/"シ/ド/ミ/ファ/ラ/シ/`ド/`ミ/`ファ/`ラ/`シ』 "/")和歌="秋の田の 仮庵の伊庵の 苫をあらみ わが衣出は 露に濡れつつ"文字=和歌を文字列分解したものMML="Tempo=60 音色(Koto) "和歌の文字数 回 弦番号=ASC(文字[回数-1])%13 もし(文字[回数-1]=" ")ならば 音符="r4" 違えば、もし(文字[回数-1]>"ん")ならば 音符=音階[弦番号]&"2" 違えば 音符=音階[弦番号]&"4" ここまで MML=MML&音符和歌を表示; MMLを表示MMLをMML演奏//ここまで音符の種類を複数にしただけで、なんか、かなりいい感じの曲になる。
「なでしこ」で百人一首music その1
「
文字を素材に音を作る」プログラムの準備が大体できたところで、いよいよ文字を音に変えるプログラムを作ってみる。
最初に、文字の素材として『百人一首』を使ってみる。フレーズも短いので
テストがやりやすいと思う。
音の方は、琴の音色を使ってみる。琴は13の弦があるので、この弦に相当する音階(
平調子)を配列で作り、配列要素に実際に出る音を入れておく。
次に、百人一首の歌(文字列を)を1文字づつに区切り、昨日やったアルゴリズムで
文字を0~12の数字に変換する。
この数字を配列の要素番号と考え(
つまりは琴の弦の番号になる)て、配列に入っている音でMMLを組み立てていく。
//百人一首music_1音階=区切(『"ミ/"ラ/"シ/ド/ミ/ファ/ラ/シ/`ド/`ミ/`ファ/`ラ/`シ』 "/")和歌="秋の田の 仮庵の伊庵の 苫をあらみ わが衣出は 露に濡れつつ"文字=和歌を文字列分解したものMML="Tempo=60 音色(Koto) "和歌の文字数 回 弦番号=ASC(文字[回数-1])%13; MML=MML&音階[弦番号]和歌を表示; MMLを表示MMLをMML演奏//ここまで確認のために、歌の内容とMMLの内容を表示するようにしてある。MML通りの妙なる琴の調べが奏でられただろうか。
「なでしこ」の演算記号
昨日は、
文字を数字にするということをやってみたのだが、できた数字が5桁もあって、ちょっとこのままでは扱いにくい。
そこで、今日はこれをもっと小さい数字にする方法を考える。一番最初に思いつくのは、この数字を割り算して、その余りを使うという方法だ。例えば、ある数字を10で割った余りを求めれば、0~9までの数字ができる。13で割れば、できる数字は、0~12となる。
「
なでしこ」で余りを求める計算はとても簡単で、記号
% を使う。
A % B・・・・割り算の余りを求める
四則演算
http://nadesi.com/doc/reference/syntax/1-7-calc.htm#head1それでは、昨日のプログラムに、13で割った余りを計算して表示する部分を付け加えてみる。
//文字を数字に文章=「あいうえお かきくけこ」文字=文章を文字列分解したもの文章の文字数 回 表示(文字[回数-1]&" = "&ASC(文字[回数-1])&" → "&ASC(文字[回数-1])%13)//ここまでこのプログラムを実行すると、下の画像のような結果になるはずだ。
ここまでくれば、「文字を素材に音を作る」プログラムの準備は大体できた感じだ。
「なでしこ」で文字コードを表示する
さて、「
なでしこ」のプログラミングにも少しなれてきたので、今日からは「なでしこ」でアルゴリズム作曲に挑戦してみる。最初の課題として、
文字を素材に音を作るというのをやってみたい。
前準備として、今日はまず、指定した文字列を一つ一つの文字に分解し(関数、
文字列分解を利用)、この文字の
ASCIIコードを表示するプログラムを作ってみる。
//文字を数字に文章=「あいうえお かきくけこ」文字=文章を文字列分解したもの文章の文字数 回 文字[回数-1]&" = "&ASC(文字[回数-1])を表示//ここまでこのプログラムを実行すると、下の画像のような結果になるはずだ。
ここで、
文字数というのは、引数で指定した文字列の文字数を返す関数だ。
文字数
http://nadesi.com/doc/cmd/doc.cgi?mode=cmd&id=301回数というのはシステム変数で、繰り返し構文において、繰り返しの何回目かをカウントしている。配列の番号が0から始まるので、回数から-1している。
回数
http://nadesi.com/doc/cmd/doc.cgi?mode=cmd&id=211
「なでしこ」で「サクラ」の定義ファイルを使う
「サクラ」では、音色名と音色番号を変換するために、標準定義ファイル(stdmsg.h)を参照している。ということで、例えば次のような「
なでしこ」のプログラムを実行すると画像のようなエラーが出る。
"音色(Koto) cdefg"をMML演奏そこで、「サクラ」の
Includeフォルダにある
stdmsg.hを「なでしこ」のインストールフォルダに入れてみた。
これで、エラーは起きなくなった。
「サクラ」のIncludeフォルダをそのまま「なでしこ」のインストールフォルダにコピーしてもOKだったので、ここはフォルダ毎コピーしてしまいましょう。
これで、「サクラ」のMMLをそのまま「なでしこ」でも使えるようになる。
「なでしこ」の日本語らしさ
昨日は、
配列を区切る命令を試したのだが、プログラムはこんな風に書いてある。
音階=『ド/レ/ミ/ファ/ソ』
音階=音階を"/"で区切ったもの
いかにもプログラミング言語という感じなのだが、「
なでしこ」では、これをプログラミング言語っぽくなくする書き方がいろいろとできる。
試しに、いくつかの書き方をテストしてみた。
//日本語らしいのは?!母艦設計="母艦の可視はオフ"●例表示(Nの) "例{N}{改行}" & 音階を言う #1音階=『ド/レ/ミ/ファ/ソ』音階=音階を"/"で区切ったもの1の例表示#2音階=区切("ド/レ/ミ/レ/ド", "/")2の例表示#3音階=『ド/レ/ド/レ/ソ』を"/"で区切る3の例表示#4音階は『ソ/レ/ミ/ファ/ソ』を"/"で区切ったもの4の例表示#5音階は、『ソ/ファ/ミ/レ/ド』を「/」で区切ったもの。5の例表示//ここまで#2が今までのプログラミング言語っぽい書き方(関数的な書き方)だと思うが、#5のように、本当にこれがプログラミング言語なのかと思うような書き方までできる。
今日は、結果を確認するための、例表示(N)という関数を作ってみた。この中に出てくる{改行}というのは、特殊な文字を表す定数で、次のような種類がある。
特殊記号の表記方法
http://nadesi.com/doc/reference/syntax/1-2-str.htm#head3昨日は、「表示」を使って確認したのだが、今日は「言う」を使って例毎に確認をとりながら、配列全部を表示するようにしてみた。プログラムを実行すると、次のようなダイアログが表示されるはずだ。
配列は要素毎に改行されて表示される。これは、なかなか便利だ。
「なでしこ」で配列を使ってみる
「
なでしこ」は、他のプログラミング言語と同じように
配列が使える。2次元配列や連想配列なども使えるから、「なでしこ」でもかなりのことができそうだ。
さらに、「なでしこ」には配列を簡単に使うための豊富な関数が用意されている。
例えば、配列に値をセットしたい場合、次のような「
区切る」という命令で簡単に値をセットできる。
区切る (くぎる)
http://nadesi.com/doc/cmd/doc.cgi?mode=cmd&id=331例えば、次のようにして配列に音階をセットできる。
音階=『ド/レ/ミ/ファ/ソ』音階=音階を"/"で区切ったもの音階[2]を表示この、プログラムを実行すると配列の2番目の音は「ミ」になることがわかる。ということで、「なでしこ」の配列は[0]から始まっていることがわかる。
「なでしこ」でMMLをファイルから読み込む
「
なでしこ」では、変数を外部のファイルから読み込むのがとても簡単だ。
読む (ひらく)
http://nadesi.com/doc/cmd/doc.cgi?mode=cmd&id=502昨日のプログラムの、変数で定義した部分(「サクラ」のプログラムの部分)を、ex01.mmlという名前で、テキストファイルとして保存しておく。
この、ファイルを変数(変数名=実験音楽)に読み込んでみる。
母艦の可視はオフ実験音楽に『ex01.mml』を読む実験音楽をMML演奏テキストファイルをそのまま変数にできるなんて、これは色々と面白いことができそうだ。
「なでしこ」でMMLを変数で定義してみる
「
なでしこ」の文字変数は、複数行の文字列を定義することができる。そこで、「
サクラ」のアルゴリズム作曲で使ったMMLを、そのまま変数として定義してみる。
母艦の可視はオフ実験音楽=『Function Compose(RoN,NoN){ STR ML={} [(NoN) ML=ML+{n(}+(NoteNo(ド)+Random(RoN)-RoN/2)+{)}+RandomSelect(1,2,4,8) ] Result=ML}#Part1=Compose(50,200)#Part2=Compose(50,200)TR(1) P(000+20) @(1) #Part1TR(2) P(127-20) @(1) #Part2』実験音楽をMML演奏「サクラ」と全く同じように演奏される。ということは、この変数の部分を「なでしこ」でアルゴリズム生成すれば、「サクラ」よりもさらに凝ったアルゴリズムが組めそうだ。
「なでしこ」のメインフォームを隠す
「
なでしこ」のプログラムを実行すると、標準ではメインフォームが表示されてしまう。
昨日のようなプログラムでは、このウィンドーは必要がないので、これを出さないようにする方法がある。次のように設定すればよい。
母艦の可視はオフこのコマンドを入れて、プログラムをちょっと変更してみた。
●クジラが歌う(音符を)
「@(86)o7」&音符をMML演奏 クジラが音符を言う
母艦の可視はオフ
「ドレミファソ」をクジラが歌う
クジラが~を言うと言うコマンドは、デスクトップに張り付いたように表示されていたのがわかる。
「なでしこ」でクジラが歌う関数を作る
昨日は「なでしこ」で変数を使う方法をやったので、今日は、「なでしこ」で簡単な
関数を定義してみる。
「なでしこ」の関数は次のように定義する。
●関数名(引数 引数 ・・・・)MMLを引数にして、このMMLをクジラが歌う、『MMLをクジラが歌う』という関数を定義してみた。
●クジラが歌う(音符を)
「@(86)o7」&音符をMML演奏 クジラが音符を言う
「ドレミファソ」をクジラが歌う今日のプログラムでは、
文字列の連結というのも使っている。「なでしこ」の文字連結には記号&を使う。
文字
&文字
「なでしこ」で変数を使う
昨日までは、MML演奏コマンドで演奏する内容を直接文字列として指定していたのだが、この文字列は
変数にすることも可能だ。
今日は、前にやった『「ドレミ」をMML演奏』という文の「ドレミ」の部分を変数にしてみる。
楽譜=「ドレミ」楽譜をMML演奏「
なでしこ」では、変数に日本語を使うことができるので、とてもわかりやすいプログラムを作ることができる。
「なでしこ」で「サクラ」してみる
昨日は、「
なでしこ」で「サクラ」のMMLを実行させてみたのだが、このMMLは「
サクラ」と同じものを書くことができる。
MMLの部分は、「なでしこ」では文字列として扱われるから、MMLを複数行に渡って記述することもできるのだ。
そこで、今日は「サクラ」の実験音楽シリーズでやったような、ちょっとプログラムっぽいMMLを「なでしこ」に実行させてみる。
「
TR(1) P(000) @(10) [100 n(Random(40,80))(RandomSelect(4,8))]
TR(2) P(127) @(13) [100 n(Random(40,80))(RandomSelect(4,8))]
」をMML演奏
「サクラ」と全く同じように演奏される。これなら、「なでしこ」を実験音楽用のプログラミング言語として十分利用することができる。「なでしこ」は、なんでもできる超高級言語ということができるから、アイデア次第で面白いことがたくさんできそうだ。
「なでしこ」でドレミと演奏させてみる
「
なでしこ」の画面に、左タブパネルというのがある。この中に命令一覧というタブがあるのだが、ここに「なでしこ」で使える命令が全て載っているのだ。
試しに、この中のMIDIという項目を選んで、サクラMMLのところで出るMML演奏というのをダブルクリックしてみる。そすると、エディタ画面に下のような文字列が自動的に入力されるはずだ。
MMLをMML演奏
「なでしこ」では、こんな感じで命令一覧を参照しながら、プログラムを書いていくことができるのだ。
ここで、最初の方のMMLを「ドレミ」に変更してみる。
「ドレミ」をMML演奏パソコンから、「ドレミ」と音が出ただろうか。
この「ドレミ」という部分には、いわゆる「サクラ」仕様のMMLを書くことができるのだ。ということは、「なでしこ」では、このMML命令を使うことで、「サクラ」でやったことと同じことができるということだ。
これは、ちょっとすごいことになってきました。
「なでしこ」のメインフォーム
昨日やってみたように、「
なでしこ」で「表示」コマンドを実行すると、新しくウィンドが作成されて、ここに結果が表示される。いかにもWindowsっぽいプログラムが、こん感じで簡単に作れてしまうのだ。
この、ウィンドはWindowsアプリケーションで言うとフォームというもので、標準で使うこのフォームはメインフォームと言う。
この、メインフォームのことを「なでしこ」では「母艦」と言う名前で呼ぶ。表示コマンドやグラフィックコマンドなどでは、標準ではこの「母艦ウィンド」を出力先に指定したことになるのだ。
この母艦ウィンド(メインフォーム)にタイトルを付けたり、大きさを変えたり、表示位置を変えたりするのはとても簡単で、次のように書けば良い。
// ここから母艦は「今日の日付」母艦について X=0; Y=0; W=200; H=100今日を表示// ここまでこのプログラムを実行すると、下のような画面になる。
母艦は「~~」と書くことで、ウィンドのタイトルを指定することができる。
母艦について ~ と書いた部分で、ウィンドの大きさや表示位置を指定する。
上のプログラムの例では、横200ピクセル、縦100ピクセルのウィンドが画面の左上に表示されるはずだ。
母艦を中央移動、母艦を最小化、母艦を最大化、母艦を閉じる、といったコマンドも試してみましょう。
// ここから母艦は「今日の日付」母艦について X=0; Y=0; W=200; H=100今日を表示5秒待つ 母艦を中央移動5秒待つ 母艦を最小化5秒待つ 母艦を最大化5秒待つ 母艦を閉じる// ここまですごいでしょ。これだけでも、プログラマー気分を味わえる。
「なでしこ」の言うと表示と表示する
昨日は、"クジラが「ドレミ」と言う"という文を「
なでしこ」で実行してみたのだが、この「クジラ」の部分をとって実行してみる。
「ドレミ」と言う次のようなダイアログが表示されたと思う。
これは、「サクラ」の場合で言うとMsgBoxコマンドだ。次に「言う」のところを「表示」に変えてみる。
「ドレミ」と表示すると、新しいウィンドーが開いて、下のような画像が表示されるはずだ。
これは、「サクラ」のPrintコマンドに相当する。「表示」の部分は「表示する」でも良い。
Msgbox=
言(う)
Print=
表示(する)
という感じだ。この、「言う」や「表示」は、プログラムの実行結果を確認したり、プログラムのテストをする時に重要な命令だ。
「なでしこ」とにかく何か実行してみる
「
なでしこ」のインストールができたところで、それでは、早速なんかプログラムを書いて実行してみる。
「なでしこ」のエディタ画面に下のように1行入力する。
クジラが「ドレミ」と言うそして、実行ボタン(メニューの下にある右向き三角ボタン、または、F5キー)を押してみる。
下の画像のような結果になったと思う。
つまり、"クジラが「ドレミ」と言う"っていう日本語の文章がプログラムになるのだ。なんかすごくないですか。
「クジラ」の部分を「ワニ」や「ライオン」にして、実行してみてください。あらら・・・・
「なでしこ」まずはセットアップ
しばらく続いた「
サクラ」シリーズ、ここでちょっとお休みして、今日からは「
なでしこ」シリーズをやってみる。
「なでしこ」というのは、「サクラ」の作者の「クジラ飛行机」さんが開発した、日本語プログラミング言語で、IPAの2004度「未踏ユース」に採択された優れものだ。
日本語プログラム言語「なでしこ」公式ページ
http://nadesi.com/今日はまず、「なでしこ」システムをパソコンにセットアップして「なでしこ」を使えるようにする。
下記のページから「なでしこ」をダウンロードする。
http://www.geocities.jp/kujira_soft/nadesiko.htmnadesiko.zip というファイルができるので、これを解凍する。解凍してできたフォルダの中に、setup.exe というファイルがあるので、これを実行する。
セットアップが終わると、デスクトップに起動用のショートカットアイコンができて、下の画像のような画面が表示される。
この画面が出れば、インストール成功だ。なんか見た目が「サクラ」の画面に近いですねー。セットアップが終わったら、nadesiko.zipや解凍したファイルは削除してもかまわない。
「サクラ」でアルゴリズム作曲 - 12.1 -
今日は、昨日やった「和楽器のための二つのラプソディー NO.2」に、琴と三味線を2パート、太鼓を1パート加え、8つの楽器で合奏させてみる。これは、結構いい感じにできあがりました。
//_ 和楽器のための二つのラプソディー NO.2.1Function Compose1(Int NoN, Array LoN){ Array Scale=({レ},{レ#},{ファ},{ソ},{ソ#},{`ド},{`レ},{`レ#},{`ファ},{`ソ},{`ソ#},{``ド},{``レ},{``レ#}) Str ML={} [(NoN) ML=ML+Scale(Random(0,14))+RandomSelect(LoN) ] Result=ML}Function Compose2(Int NoN, Array LoN){Array Scale=({ド},{ミ},{ソ}) Str ML={}[(NoN) ML=ML+Scale(Random(0,3))+RandomSelect(LoN)] Result=ML}TR(1) P(64+50) V(080) v.Random(60) REV(100) q080 音色(Piccolo)TR(2) P(64+30) V(080) v.Random(60) REV(100) q080 音色(Shakuhachi)TR(3) P(64-30) V(100) v.Random(60) REV(100) q080 音色(Shamisen)TR(4) P(64-50) V(100) v.Random(60) REV(100) q080 音色(Koto)TR(5) P(64-10) V(100) v.Random(60) REV(100) q080 音色(SynthDrum)TR(6) P(64+10) V(100) v.Random(60) REV(100) q080 音色(TaikoDrum)TR(7) P(64-40) V(100) v.Random(60) REV(100) q080 音色(Shamisen)TR(8) P(64-60) V(100) v.Random(60) REV(100) q080 音色(Koto)#Part1=Compose1(120,(2,4,4,8)) #Part2=Compose1(120,(2,4,4,8))#Part3=Compose1(120,(2,4,4,8)) #Part4=Compose1(120,(2,4,4,8))#Part5=Compose2(128,(2,4,4,8)) #Part6=Compose2(120,(2,4,4,8))#Part7=Compose1(120,(2,4,4,8)) #Part8=Compose1(120,(2,4,4,8))Tempo(112)TR(1) #Part1 TR(2) #Part2 TR(3) #Part3 TR(4) #Part4TR(5) #Part5 TR(6) #Part6 TR(7) #Part7 TR(8) #Part8TR(5) Tempo(12) 音色(Applause) c1//_______ ここまで _______________今日も、YAMAHAのXGソフト音源(AC-XG WDM XG Synth)を使って録音してみた。
「サクラ」でアルゴリズム作曲 - 12 -
今日は、昨日やった「和楽器のための二つのラプソディー NO.1」の尺八のパートの一つを笛に変え、さらに鼓を加えた5つの楽器で合奏させてみる。
//_ 和楽器のための二つのラプソディー NO.2Function Compose1(Int NoN, Array LoN){ Array Scale=({レ},{レ#},{ファ},{ソ},{ソ#},{`ド},{`レ},{`レ#},{`ファ},{`ソ},{`ソ#},{``ド},{``レ},{``レ#}) Str ML={} [(NoN) ML=ML+Scale(Random(0,14))+RandomSelect(LoN) ] Result=ML}Function Compose2(Int NoN, Array LoN){Array Scale=({ド},{ミ},{ソ}) Str ML={}[(NoN) ML=ML+Scale(Random(0,3))+RandomSelect(LoN)] Result=ML}TR(1) P(64+50) V(080) v.Random(60) REV(100) q080 音色(Piccolo)TR(2) P(64+30) V(080) v.Random(60) REV(100) q080 音色(Shakuhachi)TR(3) P(64-30) V(100) v.Random(60) REV(100) q080 音色(Shamisen)TR(4) P(64-50) V(100) v.Random(60) REV(100) q080 音色(Koto)TR(5) P(64-00) V(100) v.Random(60) REV(100) q080 音色(SynthDrum)#Part1=Compose1(120,(2,4,4,8))#Part2=Compose1(120,(2,4,4,8))#Part3=Compose1(120,(2,4,4,8))#Part4=Compose1(120,(2,4,4,8))#Part5=Compose1(128,(2,4,4,8))Tempo(112)TR(1) #Part1 TR(2) #Part2 TR(3) #Part3 TR(4) #Part4 TR(5) #Part5TR(5) Tempo(12) 音色(Applause) c1//_______ ここまで _______________今日も、YAMAHAのXGソフト音源(AC-XG WDM XG Synth)を使って録音してみた。
参考:「ドリトル」版の「和楽器のための二つのラプソディー NO.2」
http://mugen-blog.blogspot.com/2006/04/oom12-no2.html
「サクラ」でアルゴリズム作曲 - 11 -
今日は、「尺八のための4声のインベンション」の二つのパートを、琴と三味線に変えてみる。題して、「和楽器のための二つのラプソディー NO.1」だ。まるで、邦楽器の合奏団が演奏しているようだ。
//_ 和楽器のための二つのラプソディー NO.1
Function Compose1(Int NoN, Array LoN){
Array Scale=({レ},{レ#},{ファ},{ソ},{ソ#},{`ド},{`レ},{`レ#},{`ファ},{`ソ},{`ソ#},{``ド},{``レ},{``レ#})
Str ML={}
[(NoN) ML=ML+Scale(Random(0,14))+RandomSelect(LoN)
] Result=ML
}
TR(1) P(64+50) V(080) v.Random(60) REV(100) q080 音色(Shakuhachi)
TR(2) P(64+30) V(080) v.Random(60) REV(100) q080 音色(Shakuhachi)
TR(3) P(64+00) V(100) v.Random(60) REV(100) q080 音色(Shamisen)
TR(4) P(64-50) V(100) v.Random(60) REV(100) q080 音色(Koto)
#Part1=Compose1(120,(2,4,4,8))
#Part2=Compose1(120,(2,4,4,8))
#Part3=Compose1(120,(2,4,4,8))
#Part4=Compose1(120,(2,4,4,8))
Tempo(112)
TR(1) #Part1 TR(2) #Part2 TR(3) #Part3 TR(4) #Part4
//_______ ここまで _______________
今日は、YAMAHAのXGソフト音源(AC-XG WDM XG Synth)を使って録音してみた。
参考:「ドリトル」版の「和楽器のための二つのラプソディー NO.1」
http://mugen-blog.blogspot.com/2006/04/oom11-no1.html
「サクラ」でアルゴリズム作曲 - 10.3 -
SoundFontに、アジアの打楽器を集めたものを見つけた。今日は、昨日やった「尺八のための4声のインベンション」と同じものを、このSoundFontで演奏させてみる。
「サクラ」でアルゴリズム作曲 - 10.2 -
今日は、昨日やった「尺八のための2声のインベンション NO.2」の尺八の数を4本にしてみる。高音の1尺6寸管と低音の2尺4寸管を加えて合奏しているような感じになる。まるでリコーダーの4重奏のようだ。
//_ 尺八のための4声のインベンションFunction Compose1(Int NoN, Array LoN){ Array Scale=({レ},{レ#},{ファ},{ソ},{ソ#},{`ド},{`レ},{`レ#},{`ファ},{`ソ},{`ソ#},{``ド},{``レ},{``レ#}) Str ML={} [(NoN) ML=ML+Scale(Random(0,14))+RandomSelect(LoN) ] Result=ML}TR(1) P(64-50) V(100) v.Random(60) REV(100) q080 音色(Shakuhachi) o5TR(2) P(64-20) V(100) v.Random(60) REV(100) q080 音色(Shakuhachi) o4TR(3) P(64+20) V(100) v.Random(60) REV(100) q080 音色(Shakuhachi) o4TR(4) P(64+50) V(100) v.Random(60) REV(100) q080 音色(Shakuhachi) o3#Part1=Compose1(120,(2,4,4,8))#Part2=Compose1(120,(2,4,4,8))#Part3=Compose1(120,(2,4,4,8))#Part4=Compose1(120,(2,4,4,8))Tempo(112)TR(1) #Part1 TR(2) #Part2 TR(3) #Part3 TR(4) #Part4//_______ ここまで _______________