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
*/
参考
バブルソート : アルゴリズム
Array | SuperCollider 3.9dev Help