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). A special case

is the "midi" instrument, i.e., it is not a synth definition, but sends MIDI messages out on a

specific bus.


| ... | 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



jarret  ->  midi[1   4   2  1      ]+12 // sending out midi on channel 1


jarret  ->  midi[1   4   2  1      ]c5 // sending out midi info on channel 5



// 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