見出し画像

2024-03-17 回文の迷路

●LEAF 0860 回文の迷路

カンブリアンゲーム(ニューイヤーカンブリアン2024)

回文(かいぶん)とは、始めから(通常通り)読んだ場合と終わりから(通常と逆に)読んだ場合とで文字ないし音節の出現する順番が変わらず、なおかつ、言語としてある程度意味が通る文字列のことで、言葉遊びの一種である。英語では palindrome )という。

音楽の回文というのもある。蟹行カノンは、音譜を前から読んだものと後ろから読んだものとを同時に演奏するものである。J.S.バッハが作った「蟹のフーガ」という曲があります。この曲は「二声の逆行カノン」になっている。


この曲にインスパイアされて2011年に制作したアルバムが「Palindrome」です。「二声の回文的カノンによる12の変奏」というサブタイトルを付けました。

この曲集は、プログラミング言語「ドリトル」で書かれたプログラムにより自動作曲されたものです。 曲集の12のバリエーションは、194612×N(バリエーション番号)により計算される乱数の種を元にして生成されました。
曲は二つの声部で構成されています。各パートは、二分の一小節ずれているだけで同じ旋律です。 各旋律は、最初から演奏しても最後から演奏しても同じになる回文的な構造になっています。曲は全て32小節になっているので、1~16小節と17~32小節が、ちょうど鏡に映し出したように対称になります。 左右対称の同じメロディーが二分の一小節ずれているだけなのですが、実際に演奏してみると、各パートの音が微妙に絡み合って複雑な音のパターンが出現します。

最初の2小節
最後の2小節

アルバのアートワークもかなり凝って作りました。この時計の文字盤が示す時刻は「19:46:12」。私が生まれたのが「1946年12月」なんです。

CDにした時に、12の変奏に素敵なタイトルが付きました。

1. raindrops in the morning 01:27

2. 陽だまりで眠る猫 02:11

3. 空飛ぶ自転車 ~あなたに早く会いたい~ 01:05

4. 仲良し二人でおしゃぺり 01:27

5. 光の妖精とお魚 川面でダンス 01:15

6. ねずみの鬼ごっこ 01:05

7. 葡萄から泡 あわ アワ・・・ 美味しいワインにな~れ!・・・ 01:05

8. 里山を渡る風の歌 02:11

9. ぶなの森 戯れる木漏れ日たち 01:05

10. 朝露のめざまし時計 ”おはよう!てんとうむしさん” 02:11

11. 名もなき星々のささやき 02:55

12. ハンモックでお昼寝 02:11

音域的には、クラリネットでも演奏可能になっています。クラリネットとボーカルバージョンも制作してみました。

No.1からNo.144までの144 変奏バージョンも作ってみました。

こちらは、アルバムの制作に関する解説のスライドです。


Palindromeのメロディーは、その後色々の音源で試したり、歌声合成のテストなどに使っています。


アルバム「Palindrome」は、「M3-2011秋」に出展し販売しました。90㎝幅のブースは、やはりちょっと狭かったですが、展示や視聴もばっちりだったと思います。 こんなCD売れるわけがないという前評判だったのですが、プログラミングに興味のある方が結構立ち寄ってくれて、CDや楽譜も目標の10倍以上売れました。目標はCD一枚だったので・・・・。 お買い求めいただいた皆様、どうもありがとうございました。そして、販売等にご協力いただいた皆様、本当にご苦労さまでした。

M3-2011秋 配布冊子用サークルカット
M3-2011秋 出展ブース
M3-2011秋 M3-2011秋 出展ブース
M3-2011秋 サークル通行証

2017年に開催した「実験音楽工房 2017」展でも、ドリトルによる「Palindrome」を2Fスペースに展示しました。展示用に仕様を大幅に拡張した「Palindrome 2017」を制作しています。

htmlによる楽譜と演奏画面
楽譜をピアノロールで表示
演奏楽器の拡張
Parindrome コンサート
アルバム収録12曲の楽譜展示


ドリトルでプログラムを作成した「Palindrome」は、現在のドリトルのバージョン(インストール版)でも動作することが確認できました。まずは、下記のサイトからドリトルをインストールしてください。

// Palindrome

// 指定範囲の乱数を作る
RandomNumber=[|r_min r_max|
 random(r_max - r_min) + r_min.
].
// カンマ区切りのデータからランダムに選ぶ
RandomSelect=[|slc; ary|
 ary=slc ! "," 分割.  ary! (random(ary! 要素数?)) 読む.
].
// MIDIノート番号からドリトルの音名を作る
NoteName=[|番号; 音階 前 後 octv|
  音階="ド:ド#:レ:レ#:ミ:ファ:ファ#:ソ:ソ#:ラ:ラ#:シ" ! ":" 分割.
  前="_____:____:___:__:_::^:^^:^^^:^^^^:^^^^^]"! ":" 分割.
  後="^^^^^:^^^^:^^^:^^:^::_:__:___:____:_____]"! ":" 分割.
  octv=floor(番号/12)+1.
  (前 ! (octv) 読む) + (音階 ! (番号%12+1) 読む) + (後 ! (octv) 読む).
].
// ドリトルの音名からMIDIノート番号を作る
NoteNumber=[|音名; mns pls onk scl bis k|
 mns=0. pls=0. onk=0.
 scl="c,d,e,f,g,a,b,ド,レ,ミ,ファ,ソ,ラ,シ,#,%,#,♭" ! "," 分割.
 bis="0,2,4,5,7,9,11,0,2,4,5,7,9,11,1,-1,1,-1" ! "," 分割.
 k=1.[
  [音名! (scl!(k)読む)含む?]! なら [onk=onk+(bis!(k)読む)]実行. k=k+1.
 ] ! (scl! 要素数?) 繰り返す.
 k=1.[
  [(音名! (k)(1) 部分)! "↓" 含む?]! なら [mns=mns+1]実行.
  [(音名! (k)(1) 部分)! "↑" 含む?]! なら [pls=pls+1]実行.
  k=k+1.
 ] !(音名! 長さ?)繰り返す.
 60 + onk + (pls*12) - (mns*12).
].
compose2=[|小節数 拍子 下限 上限 使う音符 音符配列 長さ配列; m tt tm to w_base|
 w_base=拍子! "/" 分割.
 m=小節数 * (w_base! (1) 読む) * (4/(w_base! (2) 読む)).
 i=1. tt=0.
 [tt < m]!の間 [
  note_n=(!(!(!(下限)NoteNumber)(!(上限)NoteNumber)RandomNumber) NoteName).
  tm=(!(使う音符) RandomSelect).
  to=tt. tt=tt+(1/tm)*4.    
  [tt > m]! なら [tm=1/(m-to)*4] 実行.
  note_l=tm.
  [(m-to)==0.75]! なら [note_l="8.". tt=m ] 実行.
  [(m-to)==1.50]! なら [note_l="4.". tt=m ] 実行.
  [(m-to)==1.75]! なら [note_l="4..". tt=m ] 実行.    
  音符配列! (i)(note_n) 挿入.
  長さ配列! (i)(note_l) 挿入.
  i=i+1.
 ] 実行.
].


タイトル="Palindrome".
曲数=12.
サブタイトル="(二声の回文的カノンによる"+曲数+"の変奏)".

初期処理=[|v_no|
 変奏番号=v_no.
 乱数初期化 (変奏番号*194612).
 速さ=(!("48,64,80,96,112,128") RandomSelect) .
 音符種類=!("2/4/8/8/8/8,2/2/4/4/4/8,2/4/4/4/8/8,2/4/8/16/16/16") RandomSelect.
 使う音符=音符種類! "/" "," 全部置き換える.
 曲の内容=リスト!作る (画面!幅?)(画面!高さ?) 大きさ ((画面!幅?)*-0.5)((画面!高さ?)*0.5) 位置.
].

作曲処理=[
 小節数=16. 拍子="4/4". 下限="↓ソ". 上限="ミ↑↑".
 音符配列=配列! 作る. 長さ配列=配列! 作る.
 ! (小節数)(拍子)(下限)(上限)(使う音符)(音符配列)(長さ配列) compose2.
 音符数=(音符配列! 要素数?).
 mml_1="". [|i|
  音符=(音符配列!(i)見る)+(長さ配列!(i)見る).
  mml_1=mml_1+音符+" ".
 ]! (音符数) 繰り返す.
 mml_2="". [|i|
  音符=(音符配列!(音符数+1-i)見る)+(長さ配列!(音符数+1-i)見る).
  mml_2=mml_2+音符+" ".
 ]! (音符数) 繰り返す.
].

演奏処理=[
 part_1="・・"+mml_1+mml_2. part_2=mml_1+mml_2+"・・".

 曲の内容!クリア.
 曲の内容!("タイトル:"+タイトル+サブタイトル)書く.
 曲の内容!("変奏No:"+変奏番号)書く.
 曲の内容!("テンポ:"+速さ) 書く.
 曲の内容!("音符長:"+使う音符) 書く.
 曲の内容!("{P1} "+part_1) 書く.
 曲の内容!("{P2} "+part_2) 書く.

 バンド!(メロディ!作る (part_1) 追加 )追加(メロディ!作る (part_2) 追加)追加 (速さ/2)テンポ 演奏 待つ クリア.
].

[|v_no|
 !(v_no) 初期処理. !作曲処理. !演奏処理.
]! (曲数) 繰り返す.

編集画面に、上記のソースコードをコピーして貼り付けます。

実行ボタンを押せば、NO.1~No.12までの12曲が連続して演奏されます。

DTMに詳しければ、MIDIポートを指定することでドリトルで外部のピアノ音源やシンセサイザーも演奏させることができます。

有名なフリーのピアノ音源(VSTi)の「Piano One」で、演奏させてみました。美しいピアノの音が響きます。


以前は「オンライン版ドリトル」でも演奏ができたのですが、現在はJavaの仕様の関係でオンライン版では音楽機能は使えなくなってしまいました。


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