XiiLang a live coding language interpreter - version 1 : December 2009
The ixi lang live coding environment is an extremely simple and visual system presenting a high entry level control over synth definitions and samples in SuperCollider. The core idea is to represent events in a spatial layout, thus merging musical code and musical scores. The score is active, i.e., if a method is performed upon the score, it changes in real time.
The interpreter uses a different key command for evaluating ixi lang code, namely alt+arrows. This allows for coding in both sc lang and ixi lang in the same document without confusing interpreters.
See also: XiiLangInstr
For further information and feedback contact: thor@ixi-audio.net
Installing
Don't take the ixi lang.app out of the ixi lang folder. It needs to be next to the sounds folder and there have to be some sounds in the default sounds folder. Also, don't try to run a session with some name if you haven't put a folder with that name in your sounds folder. And make sure there are some samples in that folder.
Having Problems? Here is a troubleshooting:
You need to make sure you're evaluating the code with alt+arrow keys. Don't use TABs, only spaces. Do you have a ixilang folder with a default folder inside your sounds folder (i.e., sounds/ixilang/default )? Put some small sounds into that folder. When you've figured this out, then you can create your own project folders.
The three modes of ixi lang:
The ixi lang presents three different modes in ixi lang: melodic mode, rhythmic mode and sample mode.
agentname -> marimba[1 4 3 2 ] // where square brackets indicate melodic score
agentname -> |o x o s x | // where the | symbol indicates percussive score
agentname -> sndname{0 1 2 8 } // where curly brackets indicate concrete score (using sample)
In general when running a command use one space between words, except when assigning (->) or when defining the score ([3 2 5 5 ]). Good practice is the following:
future 4:12 >> swap agentname
Further explanation below, but videos can be found on www.vimeo.com/ixi
Creation of ixi lang:
*new (project name, key)
project - This is the name of the session. It takes its name from the folder into which you have
put all your small samples to be used in the session. Default value is "default".
key - The key of the session. Default value is "C".
// inline example
XiiLang();
or
XiiLang.new("yourprojectname", "E");
Getting help in ixi lang (type command and ixi evaluate):
remind
Opens a document with all instructions
tonality
Opens a document listing scales and tunings
instruments
Opens a document listing all registered instruments (although all synthdefs can be used)
Operators of ixi lang:
-> Assignment operator: it assigns a score to an agent (see example below)
>> Route agent through an effect. (see example below)
<< Remove effect from an agent. (see example below)
)) Increase the amplitude of an agent. (see example below)
(( Reduce the amplitude of an agent. (see example below)
tonic Set the tonic of the performance. (in MIDI note value)
The three score modes of ixi lang:
[ ... ] Melodic score. Here notes are played in a scale from 1 to 9, where 1 is the tonic.
Spaces represent silence. Additional arguments are ! for inserting a silence after the score
and + or - for transposition in pitch. Melodic scores can use any Pattern-ready synthdef on
the system, or samples that have been loaded into XiiLangInstr (see class).
| ... | Percussive score. Here samples are mapped to keyboard keys (see _keyMappings.ixi).
Spaces represent silence. Additional arguments are ! for inserting a silence after the score.
{ ... } Concrete score. Here longer samples can be played and their amplitude controlled.
Spaces represent silence. Additional arguments are ! for inserting a silence after the score
and * for multiplying the scores duration.
Methods of ixi lang (put in front of agents, as in imperative verb noun):
doze Set the agent to sleep
perk Wake the agent, if sleeping
nap Sleep for a N number of seconds. If 2nd argument, then this is repeated N2 times. (e.g., nap miles 2:4 )
shake Shake the score of an agent, practically scrambling all items
swap Swap items in the score of an agent
>shift Right shift the score by N number of places (e.g., >shift jimi 6 )
<shift Left shift the score by N number of places (e.g., <shift jimi 6 )
inverse In melodic scores, inversion of the melody as in twelve-tone technique
expand Expand the score of an agent by N spaces in between notes
reverse Reverse the score of an agent
up In percussive scores, this method turns lower case letters to upper case
down In percussive scores, this method turns upper case letters to lower case
yoyo In percussive scores, this method scrambles the score to a mix of upper and lower cases
Commands in ixi lang:
tempo Set the tempo of performance ( destination tempo: n seconds) (e.g., tempo 120:2 )
future Schedule event in the future (in seconds:n times) (e.g., future 2:2 >> shake jimi )
scale Set the scale of the performance
tuning Set the tuning of the performance
grid Draw a grid with n spaces (e.g., grid 8 )
kill Stop all sounds in this window
remind Get a help document
instruments Get a list of instruments
tonality Get a list of scales and tunings
group Group together, under one name, various agents. This is handy for control
seequence Sequence agents linearly. This will create a new agent, but not stop running agents
Available Audio Effects in ixi lang (w/ hardcoded parameters):
reverb A decent space reverb
reverbS A small space reverb
reverbL A large space reverb
delay A decent delay
distor A decent distortion
cyberpunk A good healthy effect
bitcrush A jolly sounding effect
techno An old trick of sweeping filter
antique A lowpass and some vinyl scratches
lowpass What it says on the tin
tremolo Amplitude variation
vibrato Pitch variation
Running scores in ixi lang
By creating an agent (agentname -> .... ), you create a space where a score can be performed. The agent can play any type of score (melodic, percussive or sample). The agent name is then used when assigning effects or applying methods.
To RUN THE CODE, place the cursor somewhere in the line and then the agent is assigned a score by hitting command + arrow keys. Any arrow can be used, with ONE exception, where command + left arrow in an agent line will kill that agent (and turn it red). It will not wake up with a perk command, but has to be reevaluated.
On XiiLangInstr (hit alt+y to view)
The ixi lang instruments class stores the available instruments. Synthdefs are memStored when the class is run, and samples are mapped onto keys on the keyboard. This mapping is random unless a special _keyMapping.ixi file is present in the sample folder where keys are mapped to the NAME of the sound. Mono and short sounds are ideal.
Example of a ixi lang session with comments
XiiLang() // run this line in an EMPTY document and the ixi lang interpreter is launched
tuning just // choose a tuning
scale minor // set the scale
// melodic score
jimi -> string[1 2 6 2 ] // here we have an agent called jimi, playing four notes
jimi -> string[1 2 6 2 ]+12 // same as above but transposed up an octave (MIDI notes)
jimi -> string[1 2 6 2 ]!16 // ! 16 makes silence for 16 notes before playing again
jimi -> string[1 2 6 2 ]+12!16 // this can be combined
// percussive score
ringo -> |o x o x | // here o is mapped to a bass drum and x to a snare drum
ringo2 -> | ii s n | // here o is mapped to a bass drum and x to a snare drum
ringo3 -> | o o d sd |!12 // ! 12 inserts silence for 12 beats
// concrete score
pierre -> ice{0 2 8 4 1 0 } // numbers are amplitude
henry -> ice{0 2 8 }!14 // last amp value is extended by 14 beats
schaeffer -> ice{0 2 8 }*4!14 // duration is multiplied by 4 and same as above
jimi )) // increase the volume of jimi
jimi >> distort >> reverb // put jimi through distortion and reverb effects
shake jimi // scramble jimi's score
future 2:4 >> swap jimi // in 2 seconds time, swap jimi's score. Do this 4 times
tempo 60 // set the tempo
tempo 120:10 // set the tempo to 120 in 10 seconds
group funnyband -> ringo jimi // create a new group
doze band // make the band stop
perk band // restart the bandmembers
sequence drumbo -> ringo ringo2 // create a new sequence of two sequences