The Overtone Jam Challenge #1

56 views
Skip to first unread message

Sam Aaron

unread,
Sep 27, 2010, 3:43:59 PM9/27/10
to over...@googlegroups.com
Hello there fellow musical coders!

So, it's clear to me that we would benefit from some sort of framework for discussion and collaborative learning. I therefore propose we adopt something similar to the infamous Ruby Quiz - a weekly programming challenge. However, rather than run through Project Euler, wouldn't it be cool if we could have a weekly challenge that promoted musical creativity.

So, without further ado, here's the first Overtone Jam Challenge:

= Non-Cyclic Baseline =

The task is simple:

* Fork/clone the code from here: git://github.com/overtone-jam-challenge/001.git
* Get it playing through your speakers (email this list if you have any issues with this)
* Listen for 20 seconds
* Get very bored by the repeating monotony
* Hack, hack hack until it no longer obviously repeating and sounds interesting (however you may define that)
* Submit your jam to this thread by next Monday (4th October)
* Grab hold of everyone else's jam and play about and discuss them!

So let's have fun and learn together :-)

Sam

---
http://sam.aaron.name

Fabian Aussems

unread,
Sep 28, 2010, 5:43:43 AM9/28/10
to over...@googlegroups.com
Sounds like a lot of fun!, 
Plus I really need to get some more overtone live coding skills :-)

Pepijn de Vos

unread,
Sep 28, 2010, 6:27:49 AM9/28/10
to over...@googlegroups.com
Okay, I'm trying to understand what it all does.

The definst is total magic to me. I'm not touching that. You define an instrument by doing some math?

So then there's a metronome and the at fn. I've seem (at (now)) so I guess metronome returns now + msec * beat? If this is the case, how can I fumble with the timing, and play it in swing for example?

Is apply-at some kind of recur? And why is this: #'bass-player

I understand notes are midi note numbers. But what are vel and dur?

Also, using overtone.live form the lein repl doesn't work, so I'm having a hard time toying with this stuff.

Groeten,
Pepijn de Vos
--
Sent from my iPod Shuffle
http://pepijndevos.nl

Sam Aaron

unread,
Sep 28, 2010, 7:03:53 AM9/28/10
to over...@googlegroups.com
Hey Pepijn,

On 28 Sep 2010, at 11.27 am, Pepijn de Vos wrote:

> Okay, I'm trying to understand what it all does.

Don't worry too much - there are a lot of moving parts here, and it will take time to become accustomed to them.

>
> The definst is total magic to me. I'm not touching that. You define an instrument by doing some math?

Yup, you have it. You're also right - treat it like total magic for now. All you should care about for this challenge is that it creates a fn that you can call to make sound :-)

> So then there's a metronome and the at fn. I've seem (at (now)) so I guess metronome returns now + msec * beat? If this is the case, how can I fumble with the timing, and play it in swing for example?

OK, let's take these in turn.

Metronome
=========

The metronome is a slightly tricksy thing. We'll go into more detail in future jam challenges. For now, you just need to know that it has two faces:

* It's a counter counting the number of beats that have taken place
* It's a fn for converting a given beat count to a timestamp

The following creates a metronome called metro representing 100 BPM:

(def metro (metronome 100))

You can do two things with this metronome:

(metro) ;=> get the current value of the beat counter.
(metro 12345) ;=> get the timestamp for the 12345th beat

at
==

At is a macro. Any osc-calls scheduled within it are automatically bundled together with the supplied timestamp. This allows you to schedule musical events ahead of time. If were to rely on the JVM for timing then we'd start to get annoyed with the thread scheduler and garbage collector getting in the way of precise timing. With a timestamped OSC bundle, we rely on SuperCollider for the timing.


Swing
=====

OK, so to emulate a swing beat, you need to mess about with the result of (metro beat) which is passed to the at macro at the top of the bass-player fn. If you add/remove some ms to the result of that then you can effect the timeliness of the beat:

(at (swing beat (metro beat))

where swing can modify the timestamp returned by (metro beat) depending on the beat count:

(defn swing [beat timestamp] (if (swingable? beat) (+ 100 timestamp) timestamp))

Obviously, I don't know how to codify a swing beat, but this should give you an idea...


>
> Is apply-at some kind of recur? And why is this: #'bass-player


This is similar to apply, except it schedules the evaluation for a future time. In fact it actually schedules the evaluation for a small period of time *before* the specified time. (I have a version of this in my code which I call apply-before.) So it can be used in a similar fashion to recur - only the recur will happen at a future time on a potentially different thread.

> And why is this: #'bass-player

I'm not fully down on this reader-syntax, but the result is that you can re-eval bass-player and it will automatically take effect in the looping construct. This is great for live coding and getting quick feedback.

>
> I understand notes are midi note numbers. But what are vel and dur?

OK, let's break open a little of the definst magic. The arglist of definst defines controllable parameters to the instrument created. In this case we have:

[note 58 vel 0.4 dur 0.2]

We can therefore call the bass fn with values for these params:

(bass 58 0.4 0.2)

The values you see are also the defaults so the following would produce the same result:

(bass)

These arguments can be anything you can control in SuperCollider so it's up to the instrument designer to choose sensible names. In this case we can assume vel means velocity and dur means duration. Try different values to see how things change.

>
> Also, using overtone.live form the lein repl doesn't work, so I'm having a hard time toying with this stuff.

OK, so you haven't been able to hear the base line?

Have you tried:

lein repl
(use 'jam-challenge-001.core)

Sam


---
http://sam.aaron.name

Pepijn de Vos

unread,
Sep 28, 2010, 8:52:55 AM9/28/10
to over...@googlegroups.com
Hey,

That metronome part is nice, but how would I make 1/8 notes? Or is the metronome the smallest unit?
That would mean to have 1/16 you'd actually have to quadruple the bpm.

I guess you could just do the math with the timestamps. So that'd be (+ beat1 (/ (- beat2 beat1) 2)) for the offbeat.

Swing is usually turning 1/8 1/8 into triplets of 1/4 1/8.
It gives this lazy sound, which is very appropriate for Clojure, even more so because of a certain GUI lib.

The metronome is another place that could use some abstraction in my opinion. I'm at the moment cooking up an idea for a nested list where ever item can be a note or a list and the length of a note could be determined by the length of the list and its nesting.

I was able to hear the bass line. but just loading ovetone didn't work. Re-read that sentence carefully to find out why.

Thanks for the explanation. I'll toy with it for a bit.

Groeten,
Pepijn de Vos
--
Sent from my iPod Shuffle
http://pepijndevos.nl

Sam Aaron

unread,
Sep 28, 2010, 9:03:20 AM9/28/10
to over...@googlegroups.com
Hey Pepijn,

On 28 Sep 2010, at 1.52 pm, Pepijn de Vos wrote:
>
> That metronome part is nice, but how would I make 1/8 notes? Or is the metronome the smallest unit?
> That would mean to have 1/16 you'd actually have to quadruple the bpm.

The metronome is just a helper. It's probably simplest to treat it as generating atomic time units. However, it's a part of Overtone that could definitely do with some heavy use and modification/abstraction based on experience. Treat all this stuff as iteration 1 :-) Discussions on how to improve/replace things like the metronome are discussions I'm looking forward to having.

>
> I guess you could just do the math with the timestamps. So that'd be (+ beat1 (/ (- beat2 beat1) 2)) for the offbeat.

Give it a try :-) I look forward to hearing your experience with this approach.

>
> Swing is usually turning 1/8 1/8 into triplets of 1/4 1/8.
> It gives this lazy sound, which is very appropriate for Clojure, even more so because of a certain GUI lib.

hehe

>
> The metronome is another place that could use some abstraction in my opinion. I'm at the moment cooking up an idea for a nested list where ever item can be a note or a list and the length of a note could be determined by the length of the list and its nesting.

Absolutely! See above.

>
> I was able to hear the bass line. but just loading ovetone didn't work. Re-read that sentence carefully to find out why.

I re-read it but still didn't fully understand. How careful is carefully? With the jam challenge stuff you shouldn't need to use overtone.live explicitly as the jam's namespace does this for you. Clearly I'm missing something obvious here...

Sam


---
http://sam.aaron.name

Jeff Rose

unread,
Sep 28, 2010, 9:14:41 AM9/28/10
to over...@googlegroups.com
On Tue, Sep 28, 2010 at 12:27 PM, Pepijn de Vos <pepij...@gmail.com> wrote:
The definst is total magic to me. I'm not touching that. You define an instrument by doing some math?

Sam answered most of your questions already, but I'll give a quick walk through of the instrument definition.
 
First, it's important to realize that functions like saw, sin-osc, env-gen, and rlpf are all ugen (unit-generator) functions.  Rather than actually performing computation these functions return a simple "object" (hash-map).  Try it out on the repl.  

(saw 200) ; => #:overtone.core.ugen.UGen{:id 35, :name "Saw", :rate 2, :special 0, :args (200.0), :n-outputs 1}

So this whole let form will return a tree of these objects.  Since definst, inst, defsynth, and synth let-bind the arithmetic operators you'll also find that even these don't do computation if their arguments contain a UGen object.  Instead they also return a ugen.

When an instrument is defined then this UGen graph will be compiled into a SuperCollider synthesizer definition and sent to the audio engine.  It then defines a function that when called triggers this synthesizer.  So calling (bass) will trigger the synth with default parameters.

Learning audio synthesis is a whole world in itself, but here's a commented version of this one:

; Argument names and their defaults are hooked up as control parametsrs for the synthesizer.  These control values can be sent when
; triggering a new synth note (making a new instance of the synth), or later as a way to modify parameters of an already playing synth.
(definst bass [note 58 vel 0.4 dur 0.2]
  (let [
; convert the midi note value to a frequency (cycles per second)
freq (midicps note)

; defines a percussive envelope generator (more below)
        env (env-gen (perc 0.1 dur) 1 1 0 1 :free)

; creates 2 saw waves, one slightly de-tuned from the main frequency
        src (saw [freq (* 1.02 freq)])

; creates a sin wave at half the frequency (an octave lower)
        sub (sin-osc (/ freq 2))

; creates a resonant low-pass filter, which cuts out some of the buzzing sound from the saw waves
        filt (rlpf src (* 1.1 freq) 0.8)]

; addition adds to signals together, sample by sample, so adding the low sin-wave to the saw waves gives the sound some more low-end bass feel
; multiplication effects the amplitude of a signal, so here the velocity (vel) acts as a basic
; volume adjustment, and the envelope adjusts the volume over time, so it's loud in the beginning and then trails off
    (* vel
       env
       (+ src sub))))


So then there's a metronome and the at fn. I've seem (at (now)) so I guess metronome returns now + msec * beat? If this is the case, how can I fumble with the timing, and play it in swing for example?

As Sam said you can add or subtract from the value returned by (metro beat) to adjust by milliseconds.  If you want to think more in terms of beats (like to trigger a note on the up-stroke), you can also pass partial beats:  (metro (+ 0.5 beat))
 
Is apply-at some kind of recur? And why is this: #'bass-player

This pattern has been called "recursion through time", and it's just a timestamped apply.  Using the #' reader macro returns the var itself, rather than the value it represents.  Doing it this way lets us keep re-defining the bass-player function and each recursion it will use the latest version.

-Jeff

Jeff Rose

unread,
Sep 28, 2010, 11:19:09 AM9/28/10
to over...@googlegroups.com
To do 1/8 or 1/16 notes with this style of recursive player function I normally do this:

(defn bass-player [...]

; on the next beat
(at (metro beat) 
  (bass))

; 1/8th note after the next beat
(at (metro (+ 0.5 beat)) 
  (bass))

; 1/16th note after the next beat
(at (metro (+ 0.25 beat)) 
  (bass))

(apply-at #'bass-player ...))

-Jeff

Iain Wood

unread,
Nov 16, 2010, 12:55:31 AM11/16/10
to over...@googlegroups.com
Sam,

Tried to get the Jam Challenge stuff running, just to help learn how to play overtone. Running init--jam -challenge gives me this:

******************************************************************************************
Preparing you for the Jam Challenge...
======================================

Pulling this Jam's deps...
Copying 2 files to /Users/iain/Code/overtone-jam-challenge-jam-001-b3fb795/lib

Pulling in Overtone as a checkout for your curious perusal...
You need to run this command from the toplevel of the working tree.
You need to run this command from the toplevel of the working tree.

Pulling Overtone's deps...
Copying 2 files to /Users/iain/Code/overtone-jam-challenge-jam-001-b3fb795/lib

Merging deps...
cp: lib/*: No such file or directory

*************************
* OK, get your code on! *
*************************

soulflyer:overtone-jam-challenge-jam-001-b3fb795 iain$ lein repl
"REPL started; server listening on localhost:50240."
user=> (use 'jam-challenge-001.core)
java.io.FileNotFoundException: Could not locate overtone/live__init.class or overtone/live.clj on classpath: (core.clj:1)
user=>

******************************************************************************************

Any ideas what I have missed/missassumed this time?

Iain

Sam Aaron

unread,
Nov 16, 2010, 4:08:34 AM11/16/10
to over...@googlegroups.com
Hey Iain,

did you run the script from within the jam-challenge dir? I only knocked it up quickly and it assumes your location...

Sam

---
http://sam.aaron.name

Iain Wood

unread,
Nov 16, 2010, 5:16:27 AM11/16/10
to over...@googlegroups.com
Sam,

yes I ran it from inside the jam challenge directory. What does your script assume?

Iain

Sam Aaron

unread,
Nov 16, 2010, 5:54:20 AM11/16/10
to over...@googlegroups.com

On 16 Nov 2010, at 10:16, Iain Wood wrote:
>
> yes I ran it from inside the jam challenge directory. What does your script assume?

It assumes that your CWD is the jam challenge directory. This is how I got it up and running just now:

∴ /Users/sam/foo
λ git clone git://github.com/overtone-jam-challenge/jam-001.git
Cloning into jam-001...
remote: Counting objects: 46, done.
remote: Compressing objects: 100% (36/36), done.
remote: Total 46 (delta 16), reused 0 (delta 0)
Receiving objects: 100% (46/46), 4.73 KiB, done.
Resolving deltas: 100% (16/16), done.

∴ /Users/sam/foo
λ ls
jam-001

∴ /Users/sam/foo
λ cd jam-001

∴ /Users/sam/foo/jam-001
λ ls
README.md checkouts init-jam-challenge project.clj src test

∴ /Users/sam/foo/jam-001
λ ./init-jam-challenge

Preparing you for the Jam Challenge...
======================================

Pulling this Jam's deps...

Copying 2 files to /Users/sam/foo/jam-001/lib

Pulling in Overtone as a checkout for your curious perusal...

Submodule 'checkouts/overtone' (git://github.com/overtone/overtone.git) registered for path 'checkouts/overtone'
Cloning into checkouts/overtone...
remote: Counting objects: 4224, done.
remote: Compressing objects: 100% (1772/1772), done.
remote: Total 4224 (delta 2857), reused 3481 (delta 2344)
Receiving objects: 100% (4224/4224), 2.48 MiB | 382 KiB/s, done.
Resolving deltas: 100% (2857/2857), done.
Submodule path 'checkouts/overtone': checked out '349c4603b34868cfa30431d4b32f925f90d2d99b'

Pulling Overtone's deps...
[INFO] snapshot scenegraph:scenegraph:0.0.1-SNAPSHOT: checking for updates from central
[INFO] snapshot scenegraph:scenegraph:0.0.1-SNAPSHOT: checking for updates from clojure
[INFO] snapshot scenegraph:scenegraph:0.0.1-SNAPSHOT: checking for updates from clojure-snapshots
[INFO] snapshot scenegraph:scenegraph:0.0.1-SNAPSHOT: checking for updates from clojars
[INFO] snapshot scenegraph:decora-runtime:0.0.1-SNAPSHOT: checking for updates from clojure
[INFO] snapshot scenegraph:decora-runtime:0.0.1-SNAPSHOT: checking for updates from clojure-snapshots
[INFO] snapshot scenegraph:decora-runtime:0.0.1-SNAPSHOT: checking for updates from clojars
[INFO] snapshot scenegraph:decora-runtime:0.0.1-SNAPSHOT: checking for updates from clojars.org
[INFO] snapshot overtone:osc-clj:0.2.1-SNAPSHOT: checking for updates from central
[INFO] snapshot overtone:osc-clj:0.2.1-SNAPSHOT: checking for updates from clojure
[INFO] snapshot overtone:osc-clj:0.2.1-SNAPSHOT: checking for updates from clojure-snapshots
[INFO] snapshot overtone:osc-clj:0.2.1-SNAPSHOT: checking for updates from clojars
[INFO] snapshot overtone:byte-spec:0.2.0-SNAPSHOT: checking for updates from central
[INFO] snapshot overtone:byte-spec:0.2.0-SNAPSHOT: checking for updates from clojure
[INFO] snapshot overtone:byte-spec:0.2.0-SNAPSHOT: checking for updates from clojure-snapshots
[INFO] snapshot overtone:byte-spec:0.2.0-SNAPSHOT: checking for updates from clojars
[INFO] snapshot overtone:midi-clj:0.2.0-SNAPSHOT: checking for updates from central
[INFO] snapshot overtone:midi-clj:0.2.0-SNAPSHOT: checking for updates from clojure
[INFO] snapshot overtone:midi-clj:0.2.0-SNAPSHOT: checking for updates from clojure-snapshots
[INFO] snapshot overtone:midi-clj:0.2.0-SNAPSHOT: checking for updates from clojars
[INFO] snapshot overtone:scsynth-jna:0.1.2-SNAPSHOT: checking for updates from central
[INFO] snapshot overtone:scsynth-jna:0.1.2-SNAPSHOT: checking for updates from clojure
[INFO] snapshot overtone:scsynth-jna:0.1.2-SNAPSHOT: checking for updates from clojure-snapshots
[INFO] snapshot overtone:scsynth-jna:0.1.2-SNAPSHOT: checking for updates from clojars
[INFO] snapshot java-osc:java-osc:cvs-SNAPSHOT: checking for updates from clojure
[INFO] snapshot java-osc:java-osc:cvs-SNAPSHOT: checking for updates from clojure-snapshots
[INFO] snapshot java-osc:java-osc:cvs-SNAPSHOT: checking for updates from clojars
[INFO] snapshot java-osc:java-osc:cvs-SNAPSHOT: checking for updates from clojars.org
[INFO] snapshot vijual:vijual:0.1.0-SNAPSHOT: checking for updates from central
[INFO] snapshot vijual:vijual:0.1.0-SNAPSHOT: checking for updates from clojure
[INFO] snapshot vijual:vijual:0.1.0-SNAPSHOT: checking for updates from clojure-snapshots
[INFO] snapshot vijual:vijual:0.1.0-SNAPSHOT: checking for updates from clojars
[INFO] snapshot org.clojure:clojure:1.1.0-alpha-SNAPSHOT: checking for updates from clojure
[INFO] snapshot org.clojure:clojure:1.1.0-alpha-SNAPSHOT: checking for updates from clojure-snapshots
[INFO] snapshot org.clojure:clojure:1.1.0-alpha-SNAPSHOT: checking for updates from clojars
[INFO] snapshot org.clojure:clojure:1.1.0-alpha-SNAPSHOT: checking for updates from central
Downloading: org/clojure/clojure/1.1.0-alpha-SNAPSHOT/clojure-1.1.0-alpha-SNAPSHOT.pom from clojure
Downloading: org/clojure/clojure/1.1.0-alpha-SNAPSHOT/clojure-1.1.0-alpha-SNAPSHOT.pom from clojure-snapshots
Downloading: org/clojure/clojure/1.1.0-alpha-SNAPSHOT/clojure-1.1.0-alpha-SNAPSHOT.pom from clojars
Downloading: org/clojure/clojure/1.1.0-alpha-SNAPSHOT/clojure-1.1.0-alpha-SNAPSHOT.pom from central
[INFO] snapshot org.clojure:clojure-contrib:1.0-SNAPSHOT: checking for updates from clojure
[INFO] snapshot org.clojure:clojure-contrib:1.0-SNAPSHOT: checking for updates from clojure-snapshots
[INFO] snapshot org.clojure:clojure-contrib:1.0-SNAPSHOT: checking for updates from clojars
[INFO] snapshot org.clojure:clojure-contrib:1.0-SNAPSHOT: checking for updates from central
Copying 19 files to /Users/sam/foo/jam-001/checkouts/overtone/lib

Merging deps...

*************************
* OK, get your code on! *
*************************


∴ /Users/sam/foo/jam-001
λ lein repl
"REPL started; server listening on localhost:5407."
user=> (use 'jam-challenge-001.core)
WARNING: partition-by already refers to: #'clojure.core/partition-by in namespace: vijual, being replaced by: #'clojure.contrib.seq-utils/partition-by
WARNING: frequencies already refers to: #'clojure.core/frequencies in namespace: vijual, being replaced by: #'clojure.contrib.seq-utils/frequencies
WARNING: shuffle already refers to: #'clojure.core/shuffle in namespace: vijual, being replaced by: #'clojure.contrib.seq-utils/shuffle
WARNING: reductions already refers to: #'clojure.core/reductions in namespace: vijual, being replaced by: #'clojure.contrib.seq-utils/reductions
WARNING: partition-all already refers to: #'clojure.core/partition-all in namespace: vijual, being replaced by: #'clojure.contrib.seq-utils/partition-all
WARNING: group-by already refers to: #'clojure.core/group-by in namespace: vijual, being replaced by: #'clojure.contrib.seq-utils/group-by
WARNING: flatten already refers to: #'clojure.core/flatten in namespace: vijual, being replaced by: #'clojure.contrib.seq-utils/flatten
Nov 16, 2010 10:53:08 AM sun.reflect.NativeMethodAccessorImpl invoke0
INFO: boot-internal: 30560
Nov 16, 2010 10:53:08 AM sun.reflect.NativeMethodAccessorImpl invoke0
INFO: booting internal audio server listening on port: 30560
Using vector unit: no
Loading synthdefs from default path: /Users/sam/Library/Application Support/SuperCollider/synthdefs
Number of Devices: 3
0 : "Built-in Microphone"
1 : "Built-in Input"
2 : "Built-in Output"
"Built-in Microphone" Input Device
Streams: 1
0 channels 2
"Built-in Output" Output Device
Streams: 1
0 channels 2
mSafetyOffset 17
mNumberBuffers 1
mDataByteSize 0 4096
<-SC_CoreAudioDriver::Setup world 19819E50
SC_AudioDriver: sample rate = 44100.000000, driver's block size = 512
->SC_CoreAudioDriver::DriverStart
start UseSeparateIO?: 1
<-SC_CoreAudioDriver::DriverStart
SuperCollider 3 server ready..

<SOUND!>

Sam

---
http://sam.aaron.name

Iain Wood

unread,
Nov 16, 2010, 6:39:59 AM11/16/10
to over...@googlegroups.com

On 16 Nov 2010, at 17:54, Sam Aaron wrote:

>
> On 16 Nov 2010, at 10:16, Iain Wood wrote:
>>
>> yes I ran it from inside the jam challenge directory. What does your script assume?
>
> It assumes that your CWD is the jam challenge directory. This is how I got it up and running just now:
>

There must be a missing path or something cos that's what I was doing too :-(

soulflyer:overtone-jam-challenge-jam-001-b3fb795 iain$ pwd
/Users/iain/Code/overtone-jam-challenge-jam-001-b3fb795
soulflyer:overtone-jam-challenge-jam-001-b3fb795 iain$ ./init-jam-challenge

Preparing you for the Jam Challenge...
======================================

Pulling this Jam's deps...

Copying 2 files to /Users/iain/Code/overtone-jam-challenge-jam-001-b3fb795/lib

Pulling in Overtone as a checkout for your curious perusal...

You need to run this command from the toplevel of the working tree.
You need to run this command from the toplevel of the working tree.

Pulling Overtone's deps...
Copying 2 files to /Users/iain/Code/overtone-jam-challenge-jam-001-b3fb795/lib

Merging deps...
cp: lib/*: No such file or directory

*************************

Sam Aaron

unread,
Nov 16, 2010, 6:46:22 AM11/16/10
to over...@googlegroups.com
How weird. What version of git are you using? Could you try updating to the latest from Git-scm.org?

Sam

---
http://sam.aaron.name

Iain Wood

unread,
Nov 16, 2010, 1:15:47 PM11/16/10
to over...@googlegroups.com

On 16 Nov 2010, at 18:46, Sam Aaron wrote:

> How weird. What version of git are you using? Could you try updating to the latest from Git-scm.org?
>

it's up to date now and still the same symptoms :-(

Iain

Sam Aaron

unread,
Nov 16, 2010, 7:19:28 PM11/16/10
to over...@googlegroups.com
Hey Iain,

that's most odd.

Could you crack open init-jam-challenge and go through each line by hand and let me know what you see?

Sam

---
http://sam.aaron.name

Iain Wood

unread,
Nov 16, 2010, 11:37:57 PM11/16/10
to over...@googlegroups.com
Sam,

It's the 2 git commands. I've skipped them and downloaded overtone to the checkouts directory by hand and now I hear sounds :-)

Iain

Sam Aaron

unread,
Nov 17, 2010, 3:18:55 AM11/17/10
to over...@googlegroups.com

On 17 Nov 2010, at 04:37, Iain Wood wrote:

> It's the 2 git commands. I've skipped them and downloaded overtone to the checkouts directory by hand and now I hear sounds :-)
>

How strange. What version of git are you running and how do they fail?

Cool that you finally hear sounds!!

Sam

---
http://sam.aaron.name

Reply all
Reply to author
Forward
0 new messages