木曜日, 11月 30, 2006

「なでしこ」で百人一首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"
  ここまで
  歌音=歌音&音符

//ここまで



これぐらいのパラメータが可変にできれば、パラメータの設定次第で無限に音楽を生成できる。
 

水曜日, 11月 29, 2006

「なでしこ」で百人一首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|全て|*.*")
 

火曜日, 11月 28, 2006

「なでしこ」で百人一首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だ。

『文字を素材に音を作るプログラム』を素材に音を作るプログラム」なんて、なんか面白いですよねー。
 

月曜日, 11月 27, 2006

「なでしこ」で百人一首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を演奏することにしたので、これで何度でも好きなだけ画面をクリックして演奏を楽しむことができるようになった。
 

日曜日, 11月 26, 2006

「なでしこ」で百人一首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部音符になる。
 

土曜日, 11月 25, 2006

「なでしこ」で百人一首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"
  ここまで
  歌音=歌音&音符

//ここまで



これは、なかなか面白いです。和歌の部分を色々変更して楽しんでみましょう。
 

金曜日, 11月 24, 2006

「なでしこ」で百人一首music その3

なでしこ」を使って「文字を素材に音を作る」プログラミングの試みも、次第にプログラムの形ができてきた。

今日は、「文字を音に変える」アルゴリズム部分を、歌音変換()という関数として定義してみる。変換前の文字列と返還後のMMLを引数にしてみた。

●歌音変換({参照渡し}和歌,{参照渡し}歌音)

和歌・・・・MMLに変換する文字列
歌音・・・・変換されたMML文字列

引数の前に書いてある{参照渡し}というのは、関数の外で定義されている変数を関数内で直接利用する場合に指定する。

//百人一首music_3

音階=区切(『"ミ/"ラ/"シ/ド/ミ/ファ/ラ/シ/`ド/`ミ/`ファ/`ラ/`シ』 "/")
和歌="秋の田の 仮庵の伊庵の 苫をあらみ わが衣出は 露に濡れつつ"

歌音=""; 歌音変換(和歌,歌音)
楽譜="Tempo=60 音色(Koto) "&歌音
和歌を表示; 楽譜を表示

楽譜をMML演奏


●歌音変換({参照渡し}和歌,{参照渡し}歌音)
 文字=和歌を文字列分解したもの
 和歌の文字数 回
  弦番号=ASC(文字[回数-1])%13
  もし(文字[回数-1]=" ")ならば
   音符="r4"
  違えば、もし(文字[回数-1]>"ん")ならば
   音符=音階[弦番号]&"2"
  違えば
   音符=音階[弦番号]&"4"
  ここまで
  歌音=歌音&音符

//ここまで



関数を使うことで、プログラムもだいぶすっきりしてきました。
 

木曜日, 11月 23, 2006

「なでしこ」で百人一首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演奏

//ここまで



音符の種類を複数にしただけで、なんか、かなりいい感じの曲になる。
 

水曜日, 11月 22, 2006

「なでしこ」で百人一首music その1

文字を素材に音を作る」プログラムの準備が大体できたところで、いよいよ文字を音に変えるプログラムを作ってみる。

最初に、文字の素材として『百人一首』を使ってみる。フレーズも短いのでテストがやりやすいと思う。

音の方は、琴の音色を使ってみる。琴は13の弦があるので、この弦に相当する音階(平調子)を配列で作り、配列要素に実際に出る音を入れておく。

次に、百人一首の歌(文字列を)を1文字づつに区切り、昨日やったアルゴリズムで文字を0~12の数字に変換する。

この数字を配列の要素番号と考え(つまりは琴の弦の番号になる)て、配列に入っている音でMMLを組み立てていく。

//百人一首music_1

音階=区切(『"ミ/"ラ/"シ/ド/ミ/ファ/ラ/シ/`ド/`ミ/`ファ/`ラ/`シ』 "/")
和歌="秋の田の 仮庵の伊庵の 苫をあらみ わが衣出は 露に濡れつつ"
文字=和歌を文字列分解したもの

MML="Tempo=60 音色(Koto) "
和歌の文字数 回
 弦番号=ASC(文字[回数-1])%13; MML=MML&音階[弦番号]

和歌を表示; MMLを表示

MMLをMML演奏

//ここまで



確認のために、歌の内容とMMLの内容を表示するようにしてある。MML通りの妙なる琴の調べが奏でられただろうか。
 

火曜日, 11月 21, 2006

「なでしこ」の演算記号

昨日は、文字を数字にするということをやってみたのだが、できた数字が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)

//ここまで

このプログラムを実行すると、下の画像のような結果になるはずだ。



ここまでくれば、「文字を素材に音を作る」プログラムの準備は大体できた感じだ。
 

月曜日, 11月 20, 2006

「なでしこ」で文字コードを表示する

さて、「なでしこ」のプログラミングにも少しなれてきたので、今日からは「なでしこ」でアルゴリズム作曲に挑戦してみる。最初の課題として、文字を素材に音を作るというのをやってみたい。

前準備として、今日はまず、指定した文字列を一つ一つの文字に分解し(関数、文字列分解を利用)、この文字の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
 

日曜日, 11月 19, 2006

「なでしこ」で「サクラ」の定義ファイルを使う

「サクラ」では、音色名と音色番号を変換するために、標準定義ファイル(stdmsg.h)を参照している。ということで、例えば次のような「なでしこ」のプログラムを実行すると画像のようなエラーが出る。

"音色(Koto) cdefg"をMML演奏



そこで、「サクラ」のIncludeフォルダにあるstdmsg.hを「なでしこ」のインストールフォルダに入れてみた。

これで、エラーは起きなくなった。「サクラ」のIncludeフォルダをそのまま「なでしこ」のインストールフォルダにコピーしてもOKだったので、ここはフォルダ毎コピーしてしまいましょう。

これで、「サクラ」のMMLをそのまま「なでしこ」でも使えるようになる。
 

土曜日, 11月 18, 2006

「なでしこ」の日本語らしさ

昨日は、配列を区切る命令を試したのだが、プログラムはこんな風に書いてある。

音階=『ド/レ/ミ/ファ/ソ』
音階=音階を"/"で区切ったもの

いかにもプログラミング言語という感じなのだが、「なでしこ」では、これをプログラミング言語っぽくなくする書き方がいろいろとできる。

試しに、いくつかの書き方をテストしてみた。

//日本語らしいのは?

!母艦設計="母艦の可視はオフ"
●例表示(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

昨日は、「表示」を使って確認したのだが、今日は「言う」を使って例毎に確認をとりながら、配列全部を表示するようにしてみた。プログラムを実行すると、次のようなダイアログが表示されるはずだ。



配列は要素毎に改行されて表示される。これは、なかなか便利だ。
 

金曜日, 11月 17, 2006

「なでしこ」で配列を使ってみる

なでしこ」は、他のプログラミング言語と同じように配列が使える。2次元配列や連想配列なども使えるから、「なでしこ」でもかなりのことができそうだ。

さらに、「なでしこ」には配列を簡単に使うための豊富な関数が用意されている。

例えば、配列に値をセットしたい場合、次のような「区切る」という命令で簡単に値をセットできる。

区切る (くぎる)
http://nadesi.com/doc/cmd/doc.cgi?mode=cmd&id=331

例えば、次のようにして配列に音階をセットできる。

音階=『ド/レ/ミ/ファ/ソ』
音階=音階を"/"で区切ったもの

音階[2]を表示



この、プログラムを実行すると配列の2番目の音は「ミ」になることがわかる。ということで、「なでしこ」の配列は[0]から始まっていることがわかる。
 

木曜日, 11月 16, 2006

「なでしこ」でMMLをファイルから読み込む

なでしこ」では、変数を外部のファイルから読み込むのがとても簡単だ。

読む (ひらく)
http://nadesi.com/doc/cmd/doc.cgi?mode=cmd&id=502

昨日のプログラムの、変数で定義した部分(「サクラ」のプログラムの部分)を、ex01.mmlという名前で、テキストファイルとして保存しておく。

この、ファイルを変数(変数名=実験音楽)に読み込んでみる。

母艦の可視はオフ
実験音楽に『ex01.mml』を読む
実験音楽をMML演奏



テキストファイルをそのまま変数にできるなんて、これは色々と面白いことができそうだ。
 

水曜日, 11月 15, 2006

「なでしこ」で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) #Part1
TR(2) P(127-20) @(1) #Part2

実験音楽をMML演奏



「サクラ」と全く同じように演奏される。ということは、この変数の部分を「なでしこ」でアルゴリズム生成すれば、「サクラ」よりもさらに凝ったアルゴリズムが組めそうだ。
 

火曜日, 11月 14, 2006

「なでしこ」のメインフォームを隠す

なでしこ」のプログラムを実行すると、標準ではメインフォームが表示されてしまう。

昨日のようなプログラムでは、このウィンドーは必要がないので、これを出さないようにする方法がある。次のように設定すればよい。

母艦の可視はオフ

このコマンドを入れて、プログラムをちょっと変更してみた。

●クジラが歌う(音符を)
 「@(86)o7」&音符をMML演奏 クジラが音符を言う 

母艦の可視はオフ
「ドレミファソ」をクジラが歌う




クジラが~を言うと言うコマンドは、デスクトップに張り付いたように表示されていたのがわかる。
 

月曜日, 11月 13, 2006

「なでしこ」でクジラが歌う関数を作る

昨日は「なでしこ」で変数を使う方法をやったので、今日は、「なでしこ」で簡単な関数を定義してみる。

「なでしこ」の関数は次のように定義する。
●関数名(引数 引数 ・・・・)

MMLを引数にして、このMMLをクジラが歌う、『MMLをクジラが歌う』という関数を定義してみた。

●クジラが歌う(音符を)
 「@(86)o7」&音符をMML演奏 クジラが音符を言う

「ドレミファソ」をクジラが歌う




今日のプログラムでは、文字列の連結というのも使っている。「なでしこ」の文字連結には記号&を使う。

文字&文字
 

日曜日, 11月 12, 2006

「なでしこ」で変数を使う

昨日までは、MML演奏コマンドで演奏する内容を直接文字列として指定していたのだが、この文字列は変数にすることも可能だ。

今日は、前にやった『「ドレミ」をMML演奏』という文の「ドレミ」の部分を変数にしてみる。

楽譜=「ドレミ」
楽譜をMML演奏



なでしこ」では、変数に日本語を使うことができるので、とてもわかりやすいプログラムを作ることができる。
  

土曜日, 11月 11, 2006

「なでしこ」で「サクラ」してみる

昨日は、「なでしこ」で「サクラ」の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演奏




「サクラ」と全く同じように演奏される。これなら、「なでしこ」を実験音楽用のプログラミング言語として十分利用することができる。「なでしこ」は、なんでもできる超高級言語ということができるから、アイデア次第で面白いことがたくさんできそうだ。
 

金曜日, 11月 10, 2006

「なでしこ」でドレミと演奏させてみる

なでしこ」の画面に、左タブパネルというのがある。この中に命令一覧というタブがあるのだが、ここに「なでしこ」で使える命令が全て載っているのだ。

試しに、この中のMIDIという項目を選んで、サクラMMLのところで出るMML演奏というのをダブルクリックしてみる。そすると、エディタ画面に下のような文字列が自動的に入力されるはずだ。

MMLをMML演奏

「なでしこ」では、こんな感じで命令一覧を参照しながら、プログラムを書いていくことができるのだ。



ここで、最初の方のMMLを「ドレミ」に変更してみる。

「ドレミ」をMML演奏

パソコンから、「ドレミ」と音が出ただろうか。

この「ドレミ」という部分には、いわゆる「サクラ」仕様のMMLを書くことができるのだ。ということは、「なでしこ」では、このMML命令を使うことで、「サクラ」でやったことと同じことができるということだ。

これは、ちょっとすごいことになってきました。
 

木曜日, 11月 09, 2006

「なでしこ」のメインフォーム

昨日やってみたように、「なでしこ」で「表示」コマンドを実行すると、新しくウィンドが作成されて、ここに結果が表示される。いかにもWindowsっぽいプログラムが、こん感じで簡単に作れてしまうのだ。

この、ウィンドはWindowsアプリケーションで言うとフォームというもので、標準で使うこのフォームはメインフォームと言う。

この、メインフォームのことを「なでしこ」では「母艦」と言う名前で呼ぶ。表示コマンドやグラフィックコマンドなどでは、標準ではこの「母艦ウィンド」を出力先に指定したことになるのだ。

この母艦ウィンド(メインフォーム)にタイトルを付けたり、大きさを変えたり、表示位置を変えたりするのはとても簡単で、次のように書けば良い。

// ここから
母艦は「今日の日付」
母艦について X=0; Y=0; W=200; H=100
今日を表示
// ここまで

このプログラムを実行すると、下のような画面になる。



母艦は「~~」と書くことで、ウィンドのタイトルを指定することができる。
母艦について ~ と書いた部分で、ウィンドの大きさや表示位置を指定する。

上のプログラムの例では、横200ピクセル、縦100ピクセルのウィンドが画面の左上に表示されるはずだ。

母艦を中央移動、母艦を最小化、母艦を最大化、母艦を閉じる、といったコマンドも試してみましょう。

// ここから
母艦は「今日の日付」
母艦について X=0; Y=0; W=200; H=100
今日を表示
5秒待つ 母艦を中央移動
5秒待つ 母艦を最小化
5秒待つ 母艦を最大化
5秒待つ 母艦を閉じる
// ここまで

すごいでしょ。これだけでも、プログラマー気分を味わえる。
 

水曜日, 11月 08, 2006

「なでしこ」の言うと表示と表示する

昨日は、"クジラが「ドレミ」と言う"という文を「なでしこ」で実行してみたのだが、この「クジラ」の部分をとって実行してみる。

「ドレミ」と言う

次のようなダイアログが表示されたと思う。



これは、「サクラ」の場合で言うとMsgBoxコマンドだ。次に「言う」のところを「表示」に変えてみる。

「ドレミ」と表示

すると、新しいウィンドーが開いて、下のような画像が表示されるはずだ。



これは、「サクラ」のPrintコマンドに相当する。「表示」の部分は「表示する」でも良い。

Msgbox=(う)
Print=表示(する)

という感じだ。この、「言う」や「表示」は、プログラムの実行結果を確認したり、プログラムのテストをする時に重要な命令だ。
 

火曜日, 11月 07, 2006

「なでしこ」とにかく何か実行してみる

なでしこ」のインストールができたところで、それでは、早速なんかプログラムを書いて実行してみる。

「なでしこ」のエディタ画面に下のように1行入力する。

クジラが「ドレミ」と言う



そして、実行ボタン(メニューの下にある右向き三角ボタン、または、F5キー)を押してみる。

下の画像のような結果になったと思う。



つまり、"クジラが「ドレミ」と言う"っていう日本語の文章がプログラムになるのだ。なんかすごくないですか。

「クジラ」の部分を「ワニ」や「ライオン」にして、実行してみてください。あらら・・・・
 

月曜日, 11月 06, 2006

「なでしこ」まずはセットアップ

しばらく続いた「サクラ」シリーズ、ここでちょっとお休みして、今日からは「なでしこ」シリーズをやってみる。

「なでしこ」というのは、「サクラ」の作者の「クジラ飛行机」さんが開発した、日本語プログラミング言語で、IPAの2004度「未踏ユース」に採択された優れものだ。

日本語プログラム言語「なでしこ」公式ページ
http://nadesi.com/

今日はまず、「なでしこ」システムをパソコンにセットアップして「なでしこ」を使えるようにする。

下記のページから「なでしこ」をダウンロードする。
http://www.geocities.jp/kujira_soft/nadesiko.htm

nadesiko.zip というファイルができるので、これを解凍する。解凍してできたフォルダの中に、setup.exe というファイルがあるので、これを実行する。

セットアップが終わると、デスクトップに起動用のショートカットアイコンができて、下の画像のような画面が表示される。



この画面が出れば、インストール成功だ。なんか見た目が「サクラ」の画面に近いですねー。セットアップが終わったら、nadesiko.zipや解凍したファイルは削除してもかまわない。
  

日曜日, 11月 05, 2006

「サクラ」でアルゴリズム作曲 - 12.1 -

今日は、昨日やった「和楽器のための二つのラプソディー NO.2」に、琴と三味線を2パート、太鼓を1パート加え、8つの楽器で合奏させてみる。これは、結構いい感じにできあがりました。

//_ 和楽器のための二つのラプソディー NO.2.1

Function 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) #Part4
TR(5) #Part5 TR(6) #Part6 TR(7) #Part7 TR(8) #Part8

TR(5) Tempo(12) 音色(Applause) c1

//_______ ここまで _______________



今日も、YAMAHAのXGソフト音源(AC-XG WDM XG Synth)を使って録音してみた。


 

土曜日, 11月 04, 2006

「サクラ」でアルゴリズム作曲 - 12 -

今日は、昨日やった「和楽器のための二つのラプソディー NO.1」の尺八のパートの一つを笛に変え、さらに鼓を加えた5つの楽器で合奏させてみる。

//_ 和楽器のための二つのラプソディー NO.2

Function 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) #Part5
TR(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月 03, 2006

「サクラ」でアルゴリズム作曲 - 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
 

木曜日, 11月 02, 2006

「サクラ」でアルゴリズム作曲 - 10.3 -

SoundFontに、アジアの打楽器を集めたものを見つけた。今日は、昨日やった「尺八のための4声のインベンション」と同じものを、このSoundFontで演奏させてみる。




 

水曜日, 11月 01, 2006

「サクラ」でアルゴリズム作曲 - 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) o5
TR(2) P(64-20) V(100) v.Random(60) REV(100) q080 音色(Shakuhachi) o4
TR(3) P(64+20) V(100) v.Random(60) REV(100) q080 音色(Shakuhachi) o4
TR(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

//_______ ここまで _______________