(sound starts around 55 seconds in)
Here is a quick explanation of what was happening in the video.
Some people prefer to do live coding with a text editor, which is great because you can work a lot faster. However, for the sake of keeping this tutorial to the point, I'll assume you're working in IRB.
First, I'll start up IRB and set up an arpeggiator using the similar options as in the last post. That should look something like this:
require "diamond" @output = UniMIDI::Output.use(:first) arp = Diamond::Arpeggiator.new(175, :interval => 7, :midi => @output, :range => 4, :rate => 8) chord = ["C3", "G3", "Bb3", "A4"] arp << chord arp.startAt that point we start hearing arpeggios. Since the arpeggiator is started in a background thread by default, and I can make changes to it while it plays.
arp.rate = 16 arp.gate = 20 arp.range = 3 # etc
In the video, I use the Arpeggiator#rest_every method to insert musical rests in to the arpeggio sequence. If I do
arp.rest_every(5)notes become muted on every fifth beat.
Syncing multiple Arpeggiators
Another thing I do in the video is sync multiple arpeggiators to each other.
Assuming I still have that setup running, I'm going to add another arpeggiator.
arp2 = Diamond::Arpeggiator.new(138, :rate => 2, :output_channel => 1) arp2 << ["C3", "G4", "A4"]Because I used the :output_channel => 1 option, any notes coming from arp2 will be outputted on MIDI channel 1. Now I can sync this new arpeggiator to the old one -- the clock of the first arpeggiator, arp will drive arp2.
arp.sync(arp2)By default, the sync will wait for the next time the arpeggiator pattern repeats to take hold. You can override this by passing in :now => true which will activate the sync on the next downbeat.
arp.sync(arp2, :now => true)You can sync as many arpeggiators as you like.
Trouble getting this working in OSX? One solution here.
Thanks for reading