var note = [63,61,69,64]; note.sort;
と書けばnoteはソートされるのであるが、ソート中のnoteは見ることも聞くこともできない。聞く価値があるのか・ソート中の配列に芸術的な価値があるのか、は神棚に上げておくとし、ひとまずバブルソートしているときの音を聞いてみたい。
コードを実行すると音がどんどん昇順になることが分かる。ただ、あまり綺麗ではないな...というのが率直な感想である。
コード
/* Bubble Sort */ ( ~r = r({ //var note = [ 68, 71, 70, 61, 60, 64, 67, 65, 63, 66, 69, 62 ]; //var note = (60 .. 71).scramble; var note = Array.rand(8, 50, 50+24); var note_size = note.size; var x;//temp variable for Synth "-----START-----\n".post; note.postln; "---------------\n".post; (note_size - 1).do({|item,i| (0 .. note_size - 2 - i).do({|jtem,j| //"compare: (%, %)\n".postf(jtem,jtem+1); if(note[jtem] > note[jtem+1],{ note.swap(jtem,jtem+1); note.postln; note.do({|ktem,k| x = Synth(\default,[\freq,ktem.midicps]); (1/8).wait; x.release(0.1); }); });//end of if });//end of j in do-loop });//end of i in do-loop "-----END-----\n".post; note.postln; }); ) ~r.reset; ~r.play;
コード実行例
-----START----- [ 60, 65, 70, 53, 69, 52, 56, 55 ] --------------- [ 60, 65, 53, 70, 69, 52, 56, 55 ] [ 60, 65, 53, 69, 70, 52, 56, 55 ] [ 60, 65, 53, 69, 52, 70, 56, 55 ] [ 60, 65, 53, 69, 52, 56, 70, 55 ] [ 60, 65, 53, 69, 52, 56, 55, 70 ] [ 60, 53, 65, 69, 52, 56, 55, 70 ] [ 60, 53, 65, 52, 69, 56, 55, 70 ] [ 60, 53, 65, 52, 56, 69, 55, 70 ] [ 60, 53, 65, 52, 56, 55, 69, 70 ] [ 53, 60, 65, 52, 56, 55, 69, 70 ] [ 53, 60, 52, 65, 56, 55, 69, 70 ] [ 53, 60, 52, 56, 65, 55, 69, 70 ] [ 53, 60, 52, 56, 55, 65, 69, 70 ] [ 53, 52, 60, 56, 55, 65, 69, 70 ] [ 53, 52, 56, 60, 55, 65, 69, 70 ] [ 53, 52, 56, 55, 60, 65, 69, 70 ] [ 52, 53, 56, 55, 60, 65, 69, 70 ] [ 52, 53, 55, 56, 60, 65, 69, 70 ] -----END----- [ 52, 53, 55, 56, 60, 65, 69, 70 ]
学んだことなど
note
が配列のとき、note.swap(i , j)
でnote[i]
とnote[j]
を交換する。- do-loopの反復回数に悩んだ。
n.do
と(0 .. n).do
だと、前者はn回反復し後者はn+1回反復する。
例
( var x = 0; (8).do({|item,i| /* "(8).do({" is same as "8.do({" */ x = x+1; "(item,i) = (%, %)\n".postf(item,i); }); x;//8 ) /* 実行結果 (item,i) = (0, 0) (item,i) = (1, 1) (item,i) = (2, 2) (item,i) = (3, 3) (item,i) = (4, 4) (item,i) = (5, 5) (item,i) = (6, 6) (item,i) = (7, 7) */ ( var x = 0; (0 .. 8).do({|item,i| x = x+1; "(item,i) = (%, %)\n".postf(item,i); }); x;//9 ) /* 実行結果 (item,i) = (0, 0) (item,i) = (1, 1) (item,i) = (2, 2) (item,i) = (3, 3) (item,i) = (4, 4) (item,i) = (5, 5) (item,i) = (6, 6) (item,i) = (7, 7) (item,i) = (8, 8) */
- 前述のdo-loop例を頭に入れて、今回のコードのループ構造を見ると、以下の通りとなる。
( var note = Array.rand(8,50,50+12+12); var note_size = note.size; "-------------------".postln; " - note is %\n".postf(note); " - note_size is %\n".postf(note_size); "-------------------".postln; (note_size - 1).do({|item,i| (0 .. note_size - 2 - i).do({|jtem,j| "item, i : jtem, j = %, % : %, %\n".postf(item,i,jtem,j); }); }); ) //実行結果 /* ------------------- - note is [ 54, 50, 52, 61, 55, 50, 70, 65 ] - note_size is 8 ------------------- item, i : jtem, j = 0, 0 : 0, 0 item, i : jtem, j = 0, 0 : 1, 1 item, i : jtem, j = 0, 0 : 2, 2 item, i : jtem, j = 0, 0 : 3, 3 item, i : jtem, j = 0, 0 : 4, 4 item, i : jtem, j = 0, 0 : 5, 5 item, i : jtem, j = 0, 0 : 6, 6 item, i : jtem, j = 1, 1 : 0, 0 item, i : jtem, j = 1, 1 : 1, 1 item, i : jtem, j = 1, 1 : 2, 2 item, i : jtem, j = 1, 1 : 3, 3 item, i : jtem, j = 1, 1 : 4, 4 item, i : jtem, j = 1, 1 : 5, 5 item, i : jtem, j = 2, 2 : 0, 0 item, i : jtem, j = 2, 2 : 1, 1 item, i : jtem, j = 2, 2 : 2, 2 item, i : jtem, j = 2, 2 : 3, 3 item, i : jtem, j = 2, 2 : 4, 4 item, i : jtem, j = 3, 3 : 0, 0 item, i : jtem, j = 3, 3 : 1, 1 item, i : jtem, j = 3, 3 : 2, 2 item, i : jtem, j = 3, 3 : 3, 3 item, i : jtem, j = 4, 4 : 0, 0 item, i : jtem, j = 4, 4 : 1, 1 item, i : jtem, j = 4, 4 : 2, 2 item, i : jtem, j = 5, 5 : 0, 0 item, i : jtem, j = 5, 5 : 1, 1 item, i : jtem, j = 6, 6 : 0, 0 */