Orca is a two-dimensional esoteric programming language in which every letter of the alphabet is an operator, where lowercase letters operate on bang, uppercase letters operate each frame.
The application is not a synthesiser, but a flexible livecoding environment capable of sending MIDI, OSC & UDP to your audio interface, like Ableton, Renoise, VCV Rack or SuperCollider.
The base operators are present in every version of Orca, no matter the platform:
Aadd(a b): Outputs sum of inputs.
Bsubtract(a b): Outputs difference of inputs.
Cclock(rate mod): Outputs modulo of frame.
Ddelay(rate mod): Bangs on modulo of frame.
Eeast: Moves eastward, or bangs.
Fif(a b): Bangs if inputs are equal.
Ggenerator(x y len): Writes operands with offset.
Hhalt: Halts southward operand.
Iincrement(step mod): Increments southward operand.
Jjumper(val): Outputs northward operand.
Kkonkat(len): Reads multiple variables.
Llesser(a b): Outputs smallest of inputs.
Mmultiply(a b): Outputs product of inputs.
Nnorth: Moves Northward, or bangs.
Oread(x y read): Reads operand with offset.
Ppush(len key val): Writes eastward operand.
Qquery(x y len): Reads operands with offset.
Rrandom(min max): Outputs random value.
Ssouth: Moves southward, or bangs.
Ttrack(key len val): Reads eastward operand.
Uuclid(step max): Bangs on Euclidean rhythm.
Vvariable(write read): Reads and writes variable.
Wwest: Moves westward, or bangs.
Xwrite(x y val): Writes operand with offset.
Yjymper(val): Outputs westward operand.
Zlerp(rate target): Transitions operand to input.
*bang: Bangs neighboring operands.
#comment: Halts a line.
The special operators make use of a platform's devices, here are the suggested special operators:
$self(cmd): Send a command to Orca.
:midi(ch oct note velocity*): Send a midi note.
!midi cc(ch knob val): Send a midi control change.
;pitch(oct note): Send pitch byte out.
/byte(high low): Send a raw byte.
=play(ch oct note velocity*): Play note with built-in synth.
An introduction to basic operations
This section will teach the basics of playing a note and a sequence of notes.
Send a midi note:
- D8, will send a bang, every 8th frame.
- :03C, will send the C note, on the 3rd octave, to send C#, use the lowercase c3.
Play a random note:
aRG, will output a random value between A & G, the rightside uppercase letter indicates an uppercase output.
Make a melody
04TCAFE, will create a track of 4 notes, and output its first value.
Play the melody
8C4, will count from 0 to 3, at 1/8th speed.
.8C4..... D804TCAFE .:03C....
This section will teach the basics of automating logic decisions and changing the values of operators dynamically.
Play every second note.
2I6, will increment to 6 at a rate of 2.
.2I6....... D646TCAFEDG .:03D......
Play a note with an offset
1AC, will add 1 to C, to output D. To get D#, use the lowercase d, like 1Ac.
Play a sequence back and forth
The combination of the output of C6 into B3 will bounce a value between 0 and 3 over 6 frames.
4C6...... .4B3..... D414TCAFE .:03A....
Play a note at a specific interval
- .I4, will increment to 4, at a rate of 1.
- .F2, will bang only if leftside input is equal to 2.
I4..... 3F2.1AC ..:03D.
This section will teach the basics of creating new operators procedurally.
Halt a moving operator
- E, will travel further eastward, every frame.
- H, will stop a E from moving.
Read an operator at position
22O, will get the operator E at the offset 2,2.
22O... ..E..H .....E
Write an operator at position
22X, will output the operator E at the offset 2,2.
22XE. ..... ..... ....E
Animate a projector
B8, will bounce between 0 and 8.
C........... .B4......... .1XE........ ........:03C ........:03D ........:03E ........:03F ........:03G
This section will teach the basics of storing accessing and combining that stored data.
Write a variable
aV5, will store 5 in the variable a.
Read a variable
Va, will output the value of the variable a. Notice how variables always have to be written above where they are read.
....Va ....... aV5..Va .....5. ....... aV6..Va .....6.
Read 3 variables
3Kion, will output the values of i, o & n, side-by-side.
iV0.oV3.nVC ........... 3Kion...... .:03C......
Carry a value horizontally and vertically
- Y, will output the west input, eastward.
- J, will output the north input, southward.
3.. J.. 3Y3
Carry a bang
This method will allow you to bring bangs into tight spots.
We hope the abive tutorial was enlightening, if you have questions or suggestions, please visit the forum, or the chatroom.
Base 36 table
Orca operates on a base of 36 increments. Operators using numeric values will typically also operate on letters and convert them into values as per the following table. For instance Do will bang every 24th frame.
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
Here are a few interesting snippets to achieve various arithmetic operations.
1X.. Modulo 6I4. Will output the modulo of 6 % 4. cA1. Uppercase .dAZ Will output uppercase C. H... Lowercase CM1. Will output lowercase C. .L0. Not Null ..F0 Will bang if L free input is not null.
The license applies to all the documented projects, the projects themselves and their assets. The source code of this website and our apps are under the MIT License, but the assets and text content of this website and of our apps are under the BY-NC-SA4.0 License. We are happy to pass knowledge, and that others can learn from our projects, improve on them, or make them into something else that is useful, but please, do not try to sell our projects as is under a different name. Doing so is very lazy, and disrespectful to us.
DO NOT resell or mint our work.
You can find our more recent projects on Sourcehut.
See the Github and Sourcehut repositories. Pull Requests are welcome, but please read our design philosophy first.