Clapping music: Difference between revisions

From XPUB & Lens-Based wiki
No edit summary
No edit summary
Line 3: Line 3:
See the page on [[Bash]] for help with using loops & variables
See the page on [[Bash]] for help with using loops & variables


This is an exercise to create a Bash version of [[wikipedia:Steve Reich]]'s [[wikipedia:Clapping Music]] using Bash and a pipeline using midge and timidity.
This is an exercise to create a Bash version of [[wikipedia:Steve Reich|Steve Reich]]'s {{w:Clapping Music}} using Bash and a pipeline using midge and timidity.


To start, create the first two bars "by hand" as a midge file:
To start, create the first two bars "by hand" as a midge file:

Revision as of 14:33, 13 October 2010

... continuing from the sedsongs exercise

See the page on Bash for help with using loops & variables

This is an exercise to create a Bash version of Steve Reich's Template:W:Clapping Music using Bash and a pipeline using midge and timidity.

To start, create the first two bars "by hand" as a midge file:

@head {
    $tempo 120
    $time_sig 4/4
}
@body {
    @channel 1 {
        $patch 1
        $length 16
        $octave 4
        $pan 0

    # the main pattern (3, 2, 1, 2 claps with rests in between)
    c c c r c c r c r c c r
    # the first performer simply repeats the pattern...
    c c c r c c r c r c c r

    }
    @channel 2 {
        $patch 1
        $length 16
        $octave 5
        $pan 127

    # the 2nd performer starts with the main pattern
    c c c r c c r c r c c r
    # .. and (eventually) shifts the pattern
    c c r c c r c r c c r c

    }
}

Now, we convert the midge file to a minimal bash script that does nothing but outputting the text (using a heredoc and cat). Note the need to backslash the $'s.

cat << END
@head {
    \$tempo 120
    \$time_sig 4/4
}
@body {
    @channel 1 {
        \$patch 1
        \$length 16
        \$octave 4
        \$pan 0

    c c c r c c r c r c c r
    c c c r c c r c r c c r

    }
    @channel 2 {
        \$patch 1
        \$length 16
        \$octave 5
        \$pan 127

    c c c r c c r c r c c r
    c c r c c r c r c c r c

    }
}
END

We will make use of a simple counting loop (see Bash#Loops) ...

for ((i=0; i<13;i++))
do
# ...
done