Orca is an esoteric programming language, designed to create procedural sequencers in which each letter of the alphabet is an operation, where lowercase letters operate on bang, uppercase letters operate each frame. It was created by hundred rabbits, a research studio on a sailboat.
Orca is not a synthesizer, but a flexible livecoding environment capable of sending MIDI, OSC & UDP to your audio/visual interfaces, like Ableton, Renoise, VCV Rack or SuperCollider.
For the purposes of this site, we've connected some drum racks and synthesizers from Enfer in the bottom right and are patching them in as virtualized midi instruments. Normally, Orca will not make sound on its own, and rather just sends messages or data to external devices or programs. Orca and Enfer are both creations of Devine Lu Linvega.
Orca utilizes a unique base-36 number system:
Here is a table to make it clear:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
C | D | E | F | G | H | I | J | K | L | M | N |
12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
O | P | Q | R | S | T | U | V | W | X | Y | Z |
24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 |
Anytime you want to give a numeric value, you can give a letter as well.
Operators are mostly letters, and a few symbols. An operator takes up one cell in the grid. Most operators have some type of input or output on one of their adjacent tiles. Some operators are capable of moving; others stay put. You can see a guide referencing the operators by pressing CmdOrCtrl+G
Operators come in two main flavors: lower-case and upper-case. Lower-case letters will operate on every bang, and upper-case letters will operate on every frame.
Most operators take some number of inputs and produce some number of outputs. The inputs and outputs are generally going to be on the top, bottom, or sides of the operator.
For example, take the D operator. It has two inputs and one output.
Other operators have a larger number of inputs an outputs. For example, take X - it has three inputs and one output:
Bangs are what makes thing happen. Many operators only get triggered when they there is a bang operator adjacent to them. The bang operator itself is a * character. For example, the D operator causes a bang on an interval at its bottom location. Any adjacent operator will be triggered if it is next to that particular cell.
Orca has a few relevant components related to timing:
The clock can be started and stop with the spacebar. If a midi device is connected as an input, the clock will be set from the midi device, and Orca will respond to midi start and stop messages.
For each tick of the clock, we move forward a frame. Frames can be skipped or rewound with an Orca command if needed, too. The current frame number can be seen in the bottom right of the window.
The tempo, as expected, determines the BPM and rate that the clock will tick. There are some relevant shortcuts as well:
Frame By Frame........... CmdOrCtrl+F
Reset Frame.............. CmdOrCtrl+Shift+R
Incr. Speed.............. >
Decr. Speed.............. <
Incr. Speed(10x)......... CmdOrCtrl+>
Decr. Speed(10x)......... CmdOrCtrl+<
For the purposes of learning, the easiest way to start making some sound is by using the midi operator. The midi operator takes five inputs. It has zero Orca outputs but as you might expect, sends a midi message to a midi device.
The midi operator interprets any letter above the chromatic scale as a transpose value, for instance 3H, is equivalent to 4A.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B |
---|---|---|---|---|---|---|---|---|---|---|---|
_ | _ | _ | _ | _ | _ | _ | _ | _ | _ | A0 | B0 |
C | D | E | F | G | H | I | J | K | L | M | N |
C0 | D0 | E0 | F0 | G0 | A0 | B0 | C1 | D1 | E1 | F1 | G1 |
O | P | Q | R | S | T | U | V | W | X | Y | Z |
A1 | B1 | C2 | D2 | E2 | F2 | G2 | A2 | B2 | C3 | D3 | E3 |
However, you'll need to somehow send a bang to the operator. Go ahead and try checking out some of the instruments that are already wired up via Enfer. An easy one to start with is the D (delay) operator.
Try adding the following:
.D......
..:03cf5
and making sure the clock is on by pressing space. Boom! We've made our first notes. Quickly, I'm sure you'll find a single repeating note annoying.
Don't forget you can press space to turn on or off the clock. Why don't we add some chaos?
We can add a random note value by using the R (random) operator.
So, lets try putting it above our note argument:
.D..aRf.
..:03cf5
We can also create something interesting by varying regularly. One useful operator for this is the C (clock) operator.
Try running the following:
..C.....
.D..aRf.
..:03cf5
Now lets make two of them! Remember you can drag with the mouse or just use the arrow keys and shift to select a section. After that, simply copy and paste to a new section. Let's also make some changes:
..C.....
.D..aRf.
..:03cf5
........
........
.D2.aRf.
..:02cf5
Now we have a somewhat interesting mixture of regularization, and randomization.
What if we wanted to specify a particular sequence of notes, rather than choosing them randomly?
One of the most essential operators for sequencing is the T (tracker) operator. The T operator takes at minimum 3 inputs. We say at minimum because one of the arguments determines how many arguments there are on the right side.
T operators are nice because we can specify a sequence of notes that we are interested in and we can also control how often we change between them, as well as which ones we want to change to. Let's start by establishing an interesting or fun sequence with the T operator, then moving the operand it produces down into the note selection area for a midi operator. Here's what we'll do:
...C...........
...68TCFGACFE..
..C..E.........
.D6..J.........
..:32Ef5.......
Wait! It sounds different. Note that we also changed the midi operator's channel and octave. We're now sending a much lower note to a different instrument. Try changing it yourself.
There are few operators for give us some basic math skills. These will prove invaluable when adding nuance to your creation. The first is the A operator, which, maybe predictably, is for addition:
After that, we have the B operator, which takes the difference of two operands:
One other simple operator that is really useful for adding some nuance is the F operator. The F operator checks for equality, and bangs if its true.
Devine has conveniently added drum samples to the first octaves of the voices in Enfer which is where our synthesizers and sounds are actually coming from. Let's add a kick, snare, hi-hat and lead to our previous bass line.
..........................
.#.sequence.#..#..kick..#.
..........................
...C.............C........
...38TCFGACFE....3F6......
..C..A.............:30cff.
.D3..J....................
.*:32Af5..................
..........................
.#..snare...#...#..hat..#.
..........................
...C..............0R4.....
...3F2.............1B2....
.....:10eff.......fC1.....
.................2B0......
................2D2.......
..................:10hff..
..........................
.#.........lead.........#.
..........................
.....4Cf..................
....D40fT...C..E.F.D..G...
.....:85.ff...............
..........................
.....2....................
..........................
With that, we've made our first little tune!
As you can probably imagine, sometimes things can get a little crowded. Two operators we can use to space things out are the J (jumper) and Y (jymper) operators.
The Y operator moves an operand from the left to the right:
The J operator moves an operand from the top to the bottom:
We can use these when things start to feel too tight - or if you need to move an operator around a bit.
When you're trying to read or write further away, there are two operators that are particularly relevant:
If you find this guide useful, and would like to contribute, PRs are welcome here. If you find Orca or Enfer useful; please support hundred rabbits.