max/msp Javascript,JSUIのメモ リスト編
fendoapです。
max/mspにおけるJS,JSUI個人メモです。
リストを中心にいろいろな処理の例をメモしています。
Max for live デバイスを以下でリリースしています。
リスト処理について
リストの受け取り arrayfromargs()などについて
基本的なmaxでのjsのグローバルメソッドについては以下を参照
https://docs.cycling74.com/max8/vignettes/jsglobal
配列の作成。
配列の初期化はカンマで区切る。
post()はmaxのコンソールに値を表示する。
var array_1=[];
post(array_1+"\n");
var array_2=[1,3,5];
post(array_2+"\n");
配列の追加
push()で後ろに unshift()で前に追加します。
var arr=[1,5,7];
post(arr+"\n");
arr.push(4); //add post
post(arr+"\n");
arr.unshift(2); //add pre
post(arr+"\n");
配列の長さ
オブジェクトから値を出力してみます。
outletsはオブジェクトのアウトレットの数を指定します。
outlet(0,lenght)は一番最初のアウトレットからメッセージを出力します。
outlets = 1; //define outlet number
var arr=[1,5,7];
var length = arr.length;
outlet(0,length); // outlet from 0
配列の値の取得
functionを使うとメッセージで関数を呼び出せます。
arr_index は配列の指定した番目の値を出力します。
outlets = 1; //define outlet number
var arr=[1,5,7,8];
var arr_element = -1;
function arr_index(x){
arr_element = arr[x];
outlet(0,arr_element);
}
外部からメッセージでリストを読み込む
外部からリストを読み込みます。
変数 = arrayfromargs(arguments) とするとリストが変数に入ります。
outlets = 1; //define outlet number
var arr =[];
function arr_put(){
arr = arrayfromargs(arguments);
outlet(0,arr);
}
リストのソート(並び替え)
入力したリストを並び替えます。
sort()は配列をソートしますがデフォルトでは数字ではなく文字列として大小が比較されるようです。数字として並び替えを行うにはsortのルールを定義する必要があります。
arr.sort( function(a,b){
return a - b;
} );
この中身は比較関数と呼ばれます。
a - bが負の場合aが小さいと判断されaが前に配置されます。
a - bが正の場合bが小さいと判断されbが前に配置されます。
a - bが0の場合、そのままになります。
outlets = 1; //define outlet number
var arr =[];
function arr_sort(){
arr = arrayfromargs(arguments);
arr.sort(function(a,b){
return a - b;
}
);
outlet(0,arr);
}
リストの中に特定の数字があるかどうか
リストの中に特定の数字があるかどうか判別します。
第一インレットからあるかどうかを出力します。
最初に見つけたインデックスを第二アウトレットから出力します。
indexOf()は指定した値を検索して最初に見つかったインデックスを返します。見つからない場合は-1を返します。-1かどうかで条件を判別して処理を変えます。
outlets = 2; //define outlet number
var arr =[];
function arr_set(){
arr = arrayfromargs(arguments);
}
function arr_include(x){
var flag = arr.indexOf(x);
if(flag !== -1){
outlet(0,"Yes");
outlet(1,flag);
}else{
outlet(0,"No");
outlet(1,"X");
}
}
リストを反転する
outlets = 1; //define outlet number
var arr =[];
function arr_rev(){
arr = arrayfromargs(arguments);
arr.reverse();
outlet(0,arr);
}
リストをフィルタリングする
例えばある値以上を0に置き換えます。
.map()メソッドは配列の各要素に対して指定された関数を適用して、新しい関数を作成します。
function(element)とすると現在の要素の値に対し処理を行います。
array.forEach(function(currentValue, index, array) {
// 要素ごとに行いたい処理を記述
});
currentValue: 現在の要素の値
index: 現在の要素のインデックス
array: map()メソッドが呼び出された元の配列
内部では三項演算子というものが用いられています。
element >=x ? 0 : element;
要素がx以上なら0 そうでないなら要素のまま
という意味です。
outlets = 1; //define outlet number
var arr =[];
function arr_set(){
arr = arrayfromargs(arguments);
}
function arr_filt_more(x){
var filt_arr = arr.map(function(element){
return element >= x ? 0 : element;
});
outlet(0,filt_arr);
}
リストの最小、最大値を見つける
reduce()メソッドが使われています。reduce()は内部に関数を書き込み各要素に対して処理を行うことが出来ます。
関数には4つの引数があり
function(returnで保持される値、要素の値、インデックス、配列)
となっています。minやmaxで最小値を保持しつつcurrentで要素の値と比較していきます。
outlets = 2; //define outlet number
var arr =[];
function arr_set(){
arr = arrayfromargs(arguments);
}
function arr_max_min(){
var min_val = arr.reduce(function(min,current){
return Math.min(min,current);
});
var max_val = arr.reduce(function(max,current){
return Math.max(max,current);
});
outlet(0,min_val);
outlet(1,max_val)
}
要素をランダムに並び替える
リストの要素をランダムに並び替えます。
outlets = 2; //define outlet number
var arr =[];
function arr_set(){
arr = arrayfromargs(arguments);
}
function arr_shuffle(){
var shuffled = shuffle_array(arr);
outlet(0,shuffled);
outlet(1,arr);
}
function shuffle_array(array){
var shuffle = array.slice();
for(var i = shuffle.length - 1;i > 0; i--){
var j = Math.floor(Math.random() * (i + 1));
[shuffle[i],shuffle[j]] = [shuffle[j],shuffle[i]];
}
return shuffle;
}
ここではフィッシャー・イェーツのシャッフルアルゴリズムが使われています。
・配列の最後の要素からスタートする。
・現在の要素とそれより前の要素の中からランダムに選択した要素を交換。
・交換した後一つ前に進む
・最初の要素まで繰り返す。
ここで var shuffle = arrayとすると元の配列が変更されてしまいます。
slice()を使うと元の配列をコピーできます。
slice()は任意の配列の範囲を取り出すメソッドです。
また
[shuffle[i],shuffle[j]] = [shuffle[j],shuffle[i]];
の部分は分割代入と言います。
function shuffle_array(array){
var shuffle = array.slice();
for(var i = shuffle.length - 1;i > 0; i--){
var j = Math.floor(Math.random() * (i + 1));
[shuffle[i],shuffle[j]] = [shuffle[j],shuffle[i]];
}
return shuffle;
}
Buffer Zoneで音源リリースしています。
AudioBulb recordsでもMax for liveデバイスリリースしています。
よろしければサポートお願いします!