Frammenti di Tempo

プログラムで音楽を自動生成する時に欠かせないのが乱数です。乱数は乱数の種を指定することで生成する乱数の順序を特定のものに固定化することができます。曲集「Frammenti di Tempo」の100曲の作品は、1915~2014の連続した100個の4桁の数値を乱数の種にすることで、同じプログラムで100曲の別々の作品(曲のタイトルを指定した乱数にしてあります)を生成しています。どの曲も4部音符が300個(75小節)なのですが、乱数の種を変えることで、曲全体ののテンポと音域、音域内での音程の出現順序が異なるようにプログラムされています。音程は乱数で決めた音域からランダムに決定しているので、生成された音楽は12音階の楽曲になります。

乱数の種に使っている数字は異なる数値であれば何でもかまわないのですが、この数字を西暦の1915年~2014年というように考えると、その乱数により生成した曲にある種の想いを感じることができるかもしれません。作者が生まれた1946年は、世界初の汎用電子計算機「ENIAC」が誕生した年でもあります。アルバムに収録した12曲は、1915~2014の100曲の中から、作者がコンピュータと関わってきた中でエポックメイキングだった12の年を選んでみました。

アルバムの録音は、MIDIデータをコンピュータのピアノ音源で演奏したものですが、印刷した楽譜もあるのでピアノなどの楽器でで人が演奏することもできます。音域をクラリネットと同じにしているのでクラリネットでも演奏可能です。

01 - 1946 世界初の汎用電子計算機「ENIAC」誕生
02 - 1960 CODASYL「COBOL-60」発表
03 - 1964 プログラム言語「BASIC」誕生
04 - 1973 Digital Research「CP/M」発売
05 - 1977 コモドール「PET2001」 アップル「Apple II」発売
06 - 1982 MIDI仕様誕生 NEC「PC-9801」発売
07 - 1984 SONY「SMC-777」発売
08 - 1985 マイクロソフト「MS-DOS 3.1」発売
09 - 1987 東芝「J-3100」発売 ローランド「D-50」「MT-32」発売
10 - 1992 マイクロソフト「Windows 3.1」発売
11 - 1995 マイクロソフト「Windows95」発売 「Java」誕生
12 - 2014 HTML5 仕様確定

YouTube版


「Frammenti di Tempo」は、「LilyPond」のソースコードを自動作成するために実験的に作ったプログラム「Frammenti」により生成されました。「LilyPond」は、オープンソースのテキストベース楽譜作成システムで、楽譜と同時にMIDIデータも生成することができます。COBOL言語で書かれた「Frammenti」は、事務処理用の言語と言われるCOOBOL言語でも他のツールと組み合わせることで音楽などのアート作品を作れるいうひとつの可能性を示していると言えます。

プログラムの実行は次のようなコマンドをコンソールから入力します。

$ Frammenti 2015 > tmp.ly; lilypond tmp.ly; start tmp.pdf; start tmp.mid

これで、タイトルが"2015"の楽譜(pdf)とmidiデータが生成された後、楽譜の表示と演奏(.midに関連づけられているアプリによる再生)が行われます。

[COBOL プログラム]

program-id. Frammenti.
data division.
working-storage section.
01 i   pic 9(6).
01 o   pic 9(6).
01 p   pic 9(6).
01 r   pic 9(6).
01 l   pic 9(6).
01 h   pic 9(6).
01 t   pic 9(2).
01 n1  pic 9(2).
01 n2  pic 9(2).
01 wn  pic 9(4).
01 pi  pic x(8).
01 pd  pic x(48) value "c   cis d   dis e   f   fis g   gis a   ais b   ".
01 filler redefines pd.
 02 pt occurs 12 pic x(4).
01 od  pic x(28) value ",,, ,,  ,       '   ''  ''' ".
01 filler redefines od.
 02 ot occurs 7 pic x(4). 
procedure division.
display 1 upon argument-number accept wn from argument-value
compute r = function random(wn)
compute l = 30 compute h = 90 perform randomn compute t = r
compute l = 55 compute h = 60 perform randomn compute n1 = r
compute l = 84 compute h = 91 perform randomn compute n2 = r 
display '\version "2.16.2"'
display '\paper{system-count=#10 top-margin=10\mm ragged-last-bottom = ##f}'
display '\header{title="Frammenti di tempo  ' wn '" subtitle=" " subsubtitle=" " composer="Akihiko YAMAZAWA" tagline=" "}'
display "\score{" display "<<" display "{\tempo 4 =" t
perform varying i from 1 by 1 until i > 300
 compute l = n1 compute h = n2 perform randomn
 compute o = r / 12 compute p = function rem(r 12) + 1
 move ' ' to pi string pt(p) delimited ' ' ot(o) delimited ' ' into pi
 display pi
end-perform
display '\bar "|."}' display ">>"
display '\layout{}' display '\midi{}' display '}'
exit program.
randomn.
compute r = function rem(function random * 123456789 (h - l + 1)) + l.

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