ORCA Operators
参考:
To display the list of operators inside of Orca, use CmdOrCtrl+G.
A add(a b): Outputs sum of inputs.
aとbを乗算する
code:orca
1A2 <- 1+2
.3. <- A=3
B bounce(a b): Outputs difference of inputs.
aのstepにしたがってbの範囲でバウンスする。ただし B4 の場合にはaには0から7まで(4の倍)のstepが必要
code:orca
4C8.....I8..
.1B4....5B4.
..3.X....1.X
https://gyazo.com/9a7584b08d2ffc3db493889b007a5ad8
どうも違うっぽい。範囲でというよりも右辺から左辺を引いた数が出力される、と思っていたほうがいいみたい。
code:orca
.4C6..
..3B3.
...0..
......
とかやってみるとわかるけど。B3ならBの右辺に0から5までをCで送ってやれば0,1,2,3,2,1,0,1,2,3,,,,というようにカウンドアップダウンされる。これであってるのか不安になる実装だなこれ。
C clock(rate mod): Outputs modulo of frame.
rateのフレーム数毎にmodの数だけ0からカウントする
ただしテンポに対してのフレーム数の解像度は4。
つまりテンポが60の時に 4C8 とあれば、テンポ60の四分音符ごとにカウントされる。
ということは2C8だと八分音符、1C8だと十六分音符ということになる。
解像度的には低いと言わざる得ないな、、、もっと細かく指定できるんだろうか。
逆に数字を増やしてくと5フレームごと、6フレームごと、、、となり、最大で9までしてできる。10を指定しようとすると0になる(二桁の指定はできない、ようだ)
code:orca
..........................................
.1C8.2C8.3C8.4C8.5C8.6C8.7C8.8C8.9C8.10C8.
..0...0...5...0...6...2...5...0...4....0..
..........................................
D delay(rate mod): Bangs on modulo of frame.
modで指定したフレーム数に対してrateの数だけ送らせてbangを送る
code:orca
.D1..D2..D3..D4..D5..D6..D7..D8..D9
.*...*.............................
...................................
............2D4.............2D8....
...................................
https://gyazo.com/3f26b107ce91a06d5a7de91fcc436a95
E east: Moves eastward, or bangs.
Eは東に移動する(地図的に東。要するに右に移動する)
https://gyazo.com/23554a6415c75fe961fedaa8289072cb
で当たったところにbang(*)する様がわかる
https://gyazo.com/d338bbaa9ba7d096da2e898904b52c0d
(あとで出てくるけど#はそれ以降のラインを無効にする。つまりコメントに出来る。コメント書くのが億劫だけど)
CやXと組み合わせるとこんなことができる
https://gyazo.com/39c9e641cc939b89f8bfd16e75fbc27e
code:orca
.....
.C4..
.3XE.
.....
さらにBも加えてみる
https://gyazo.com/04d79591945fb0c480627c6aec03b6cf
code:orca
.......
.1C8...
..7B4..
...3XE.
.......
F if(a b): Bangs if inputs are equal.
aとbが一緒ならbangを送る
https://gyazo.com/e36e7ceb5504da35fe6088be87967529
G generator(x y len): Writes operands with offset.
x, y オフセットし、lenの長さで右辺のオペレーターを出力
何に使えるのか思いつかない、、、
https://gyazo.com/35ac0b42ff9959fa0dea06a153aad7cb
H halt: Halts southward operand.
Eを止めます
https://gyazo.com/fbccd38e9cbbb5ca82a449766abbabda
I increment(step mod): Increments southward operand.
stepの数だけmodの範囲で増えていく。例えば
code:orca
.........
.3I9.3I8.
..3...7..
.........
の場合、3I9なら036036036036となる(始まりの数字が別に指定されていればそこからのstepになる)
左の3I8なら03614725となる
? ところで右辺左辺の数字は一桁しかダメなんだろうか?結構大きな制限だと感じるな。
https://gyazo.com/4886b69c0e9be6fe7f42fcfa10fa416f
J jumper(val): Outputs northward operand.
Jの上側の数字を下側に出力する
code:orca
.....
..C3.
..0..
..J..
..0..
.....
https://gyazo.com/448245d21188758b5c27400ad6e66c30
K konkat(len): Reads multiple variables.
この後に出てくるVでセットした変数の値を複数読み出力する
code:orca
.................
.aV1.bV2.cV3.dV4.
..4..............
.5Kabc.d.........
...123.4.........
.................
https://gyazo.com/79ae4e5b654fc5bd038adf0c5915c33f
L less(a b): Outputs smallest of inputs.
a, bどちらかの小さい方が出力される
code:orca
.....
.R.R.
.jLw.
..j..
.....
https://gyazo.com/b1faf030d1b024d97e245270e9a1d5fc
M multiply(a b): Outputs product of inputs.
どちらかに入力された値をそのまま出力する
https://gyazo.com/5bc98673f52abe9f01554b1dc3f6903f
N north: Moves Northward, or bangs.
Sの逆で上にNを飛ばして当たったところがbangします
https://gyazo.com/aee8a4da6dc04036dce9736cc3dfb946
O read(x y read): Reads operand with offset.
例としては上のが参考になりますが、x, yで指定した場所のオペレーターを読み出力します。
シンプルな例
https://gyazo.com/f72e7ca2e97ac6fbd1b9a4ff8e0315bd
P push(len key val): Writes eastward operand.
とりあえず例を見てもらったほうが早い。。。
https://gyazo.com/35ab4209e1d815f5f978253efb034742
例の場合、abPcとあったらcをb列の分、a列のいちに出力、という感じだろうか。
Q query(x y len): Reads operands with offset.
244Qならx=2, y=4の1から4つぶんのオペレータを読む
? このオペレーターを読む系の使い所がいまいちわからないのでサンプルが必要
code:orca
............
.244Q.......
.1234.......
............
............
.......1234.
............
例えば上のPの例と組み合わせると以下のようなことができる。
code:orca
............
.244Q.......
.dpy9.......
.....C5.R...
.....04Pi...
.......ipy9.
............
https://gyazo.com/e38c9de2db4b1b63fcf4a3690555d6c7
R random(min max): Outputs random value.
決められた範囲でrandomを出力と簡単に読むとちょっとハマる。
どうやら左辺は開始の数字、右辺は0から数えての数値のカウント数
code:orca
.........
.2R5.4R6.
..3...5..
.........
https://gyazo.com/24ea3fa1fbc7992aaa2de0c7e95c1330
どうも上の例だと左側は2から4(つまり0から4までの範囲の中で最小が2)となっている。言い方を帰ると右側の例の右辺は「ゼロから6個目つまり0から5までの中で最小を4に指定してるので、4、5をランダムに出力してる、という風に見える。
ちょっとこの指定の仕方は独特過ぎないだろうか、、、
S south: Moves southward, or bangs.
下方向にbangを出力
code:orca
......
4C6...
.4B3..
..1.XS
https://gyazo.com/ce3863e4e1c1500196ac91354e8448f2
T track(key len val): Reads eastward operand.
code:orca
..C.......
..24T1234.
....3.....
https://gyazo.com/21324250da341cb537c56f3d1d0ae1c4
4Tなら右辺4つ分オペレータを読める
14T11234なら出力は1、22T1234なら出力は2というように読み込む位置を変えることができる
ステップシーケンサー的なことができそう
U uclid(step max): Bangs on Euclidean rhythm.
ユークリッドリズムでbangを出力する。
ユークリッドリズムとは?(下記のページによくまとまっています。あと論文もあるので読んでみると良いかもしれません) https://gyazo.com/7a8b7f66fd07e6e96c06180aa7d4d90b
code:orca
..........
.1U4..2U3.
..*....*..
..........
.3U5......
..*.......
..........
で、これ例えば 3U5 だと「5拍3連」ということでなくて以下のようになります。
全体が5拍なので、00000
そのうち3拍鳴らすので、111+00
ゼロと1をペアにするので、10+10+1
言葉にすると「タンタンタ」という感じでしょうか。いわゆる均等に割れているわけではありません。
4U9だとすると、、、
1111+00000 > 10101010+0 > 100 + 10 + 10 +10 「ターンタンタンタン」
3U9
111000000 > 101010+000 >100+100+100 「ターンターンターン」
? 本当はユークリッドリズムはもっとmaxの値を大きくしたいところなんですが、Orcaで右辺に二桁の数字を置く方法がわからないのですが、そんな方法あるんでしょうか?
? ↑これについては5Udみたいな感じでアルファベットまで使えば二桁(dなら0から13までと同じ)、つまり0〜9+a〜zで10+26の36までカウント(?)できることになるのか?
? あと他の場面でもよく思うんですが、bangを数字に置き換える方法はないのでしょうか?なかなかそれができなくて。Uとかはそれがあるとないとでは全然違うと思うんですよね。でもアルファベット分がすでに埋まってるから自分でコードを変更して追加してプルリク投げるとか出来ないしな。もし方法があれば教えてください。
上記についてコメントを頂いた。ありがとうございます。
小文字のアルファベットはbangを受けたときのみ実行されるオペレータになります😃9以上はそうですね,orcaかpilotのgithubかどこかにアルファベットと数値の対応表があったような気がします
対応表はGithubにあった。スクショで引用しておく。
https://gyazo.com/041289959b1a3e5366247b3c5b73b524
やってみた。
https://gyazo.com/03511cbbae58ec7b945d94c10ee53a58
V variable(write read): Reads and writes variable.
Kの説明がそのまま使えるので下記の通りです。Vで変数をセットしてKで読み込んでいます。
code:orca
.................
.aV1.bV2.cV3.dV4.
..4..............
.5Kabc.d.........
...123.4.........
.................
https://gyazo.com/79ae4e5b654fc5bd038adf0c5915c33fW
W west: Moves westward, or bangs.
West(左方向)にWを飛ばしてbangさせる
code:orca
.....
.C4..
.3Xw.
.....
https://gyazo.com/4c66ac46f55c215925e2dabc2de4a62b
X write(x y val): Writes operand with offset.
ちょうど上のWでも使っていますが、xyの位置に右辺のval を出力します。
EWNSで同じような形で使っています。
Y jymper(val): Outputs westward operand.
左の入力を右にアウトプットする(同じようなのでJがあります。Jは上の入力を下にアウトプットします。)
code:orca
.................
..C......C...C...
..6Y6...Y....6...
.............J...
.............6Y6.
.................
https://gyazo.com/c4290622d9eee92f887d38bf085d8c0d
上の例だと真ん中だけは動作していないのがわかると思います。
Z lerp(rate target): Transitions operand to input.
右側のtargetに数値が入力されると、最後に出力した数値から、その数まで左のrateで指定した間隔で数値を変化させる
1Z1から1Z8にtargetを変更すると1、2、、、8まで数値を出力する
code:orca
.............
....D.....R9.
........bV3..
....vb...3...
...Z3........
.aV3.........
.............
https://gyazo.com/c2292adf292485c0df0f84d21ec62d57
小文字のvはbangが来た時にだけ大文字のVと同じように動作する、はずなんだけど、変数をセットしないで右側に数値を渡してbangすると数字が出力されるは思いつかないだろう、、、これ。
* bang: Bangs neighboring operands.
*は近隣のオペレーターにbangを送って実行する
とはいえ手動ではどうもできないっぽい??
# comment: Halts a line.
#より右側はコメントになる。
挟み込めばその中がコメントになる
code:orca
........................
..#.hoge................
..#.fuga.#..............
........................
https://gyazo.com/e2928c8b143407bc6c695a4b18744595