I saw discussion of ixi, and wondered what it was. I had a go at implementing something ixi like in Sonic Pi, but unfortunately I did that before I watched the tutorial on ixi to understand how it works. So, what I did is … different.
Once set up, my ‘ixi-like’ code which isn’t very ixi-like looks like this:
live_loop :forever do
ixi "|a a b acc b a bc|" +
"|d d e |" +
"|p pq p p q r|"
"|x y x y x y x y|"
sleep 4
end
But, what my code is doing is mapping each ‘a’ onto a function a(), ‘b’ onto b(), and so on. By adding function definitions for these single letter functions, and creating a very big and copy-pasted ixi() function, it works.
Well, when I say ‘works’, I mean that it produces sound and modifying the above code changes the music. But, having now seen an ixi tutorial, what it’s not doing is implementing ixi
Note that while there are 26 possible single letter functions, it’s only necessary to define the ones that are actually going to be used in the not-ixi pattern.
use_bpm 120
set_mixer_control! limiter_bypass: 1
define :x do
sample :drum_cymbal_closed, pan: 0.7
end
define :y do
sample :drum_cymbal_closed, pan: -0.7
end
define :d do
sample :tabla_ghe2
end
define :e do
sample :tabla_ghe4
end
define :a do
use_synth :dsaw
play 48, amp: 0.25, cutoff: 90, sustain: 0.25
end
define :b do
use_synth :dsaw
play 51, amp: 0.45, cutoff: 90, sustain: 0.25
end
define :c do
use_synth :dsaw
play 53, amp: 0.45, cutoff: 90, sustain: 0.25
end
define :p do
sample :bd_haus
end
define :q do
sample :sn_dolf
end
define :r do
sample :sn_dolf, amp: 0.25
end
define :ixi do |contents|
conarr = contents.split( "|" )
conarr.each do |line|
if line != ""
in_thread do
line.length.times do |i|
b = line[i]
if b == "a"
a()
end
if b == "b"
b()
end
if b == "c"
c()
end
if b == "d"
d()
end
if b == "e"
e()
end
if b == "f"
f()
end
if b == "g"
g()
end
if b == "h"
h()
end
if b == "i"
i()
end
if b == "j"
j()
end
if b == "k"
k()
end
if b == "l"
l()
end
if b == "m"
m()
end
if b == "n"
n()
end
if b == "o"
o()
end
if b == "p"
p()
end
if b == "q"
q()
end
if b == "r"
r()
end
if b == "s"
s()
end
if b == "t"
t()
end
if b == "u"
u()
end
if b == "v"
v()
end
if b == "w"
w()
end
if b == "x"
x()
end
if b == "y"
y()
end
if b == "z"
z()
end
sleep 0.25
end
end
end
end
end
live_loop :forever do
ixi "|a a b acc b a bc|" +
"|d d e |" +
"|p pq p p q r|"
"|x y x y x y x y|"
sleep 4
end