Micro Music Media Library

Welcome!

This is the companion web page for the Micro Music: Exploring the Idiosyncratic Compositional Strategies Encountered in 1-Bit, Limited Memory Environments doctoral project. This page is an aggregation of various examples and materials that support the research's written commentary, which you can find here. You can also find the official, archived repository here.

IMPORTANT NOTE: This material has been left as it was submitted in September 2019 so that it aligns with the commentary for future readers. It should be noted that there have been numerous changes and adaptations to many of these assets since the submission date. For example, the code below has had bugs removed and features added, or has become completely redundant. For example (as of 2020-05-24) The latest version of the μMML compiler can be found on my GitHub and some of the demonstration pieces were altered and combined into a single release, 4000AD.

I sincerely hope you enjoy the media within and do make sure to email me at hello@protodome.com if you have any questions or comments.

So, what's 1-bit music?

1-bit music, generally considered a sub-division of chiptune, is the music of a single square wave. The only sonic operations possible in a 1-bit environment are amplitude and time, where amplitude is quantised to two, binary states: high or low, on or off. As such, it is seemingly impossible to achieve traditionally simple musical operations such as polyphony and dynamic control. However, despite restricted, the unique techniques and auditory tricks of contemporary 1-bit practice exploit the limits of human perception. Through layers of modulation, abstraction and clever writing, these compositional methods generate music far more complex than the medium would, at first impressions, indicate...

Last Update: 2020-05-24 by Blake 'PROTODOME' Troise

Companion Software

The code herein is fairly straightforward (no dependencies or complex configurations required) and efforts have been made to make each comprehensible from the source alone, however this does require a basic knowledge of C programming, the command line and compilers to use. Additionally, use of the microcontroller code demands an understanding of AVR programming, flashing scripts to microcontroller and simple electronics (to power the chip and deliver pulses to an output diaphragm).

Software For Mac & Linux

Here one can find the complete suite of desktop software I have used to create, experiment and compose the audio assets for this research project. The entire workflow has been created from scratch and, as such, may be rather idiosyncratic! Instructions for compiling can be found below, or in the source code itself, as can guidance for operation. Although I have exclusively worked in OSX and Linux environments, these projects should compile for Windows, but this has only been sporadically tested.

how to run the software To run the programs below, you must compile with your system. For example, on Linux / OSX:

$ gcc 1-bit-generator.c -o 1-bit-generator

This will create an output file named '1-bit-generator' (or whatever is entered after the -o flag), then run the output program from the terminal like so:

$ ./1-bit-generator

On Linux you will need to install the 'GCC' package if it is not already:

$ sudo apt-get install gcc

On OSX, you will need to install 'Command Line Tools'. In Mac OS 10.9 (and later), this can be achieved by using the following command:

$ xcode-select --install

For Windows, please consult the following link.

> mmml-compiler.c
Compile μMML code to the include (.h) file required by the mmml-generator.c wave builder program and the mmml.c microcontroller program. Compilation to AVRC requires an additional -a flag.

> mmml-generator.c
Builds wave files from compiled μMML code. Essentially runs a simulation of mmml.c and outputs the result of the virtual I/O pins to a wave file. Requires prerequisite use of the mmml-compiler.c program listed below to create the musicdata.h data file.

> 1-bit-generator.c
1-bit-generator.c creates a wave file using different 1-bit synthesis techniques; built to accompany the JMSG '1-Bit Instrument' article. By default, the program generates 10 seconds of four, pulse interleaved pulse waves. This can be switched from pulse interleaving to pin pulse mixing by commenting-out (or deleting) the MIXING_METHOD definition at the top of the program. To get the most out of the program you'll need to modify code to explore different approaches and techniques!

> bytebeat.c
Generates wave files from simple bytebeat (and bitbeat) algorithms. Note - bitbeat algorithms will not behave the same as their Attiny equivalents when generated using this software.

> notecalc.c
Quickly add, or multiply, musical note durations / bar subdivisions. Makes composing in μMML a little easier; very useful when trying to sync up material between channels.

> notefreq.c
Creates a sequence of timer values with a ratio equal to the 12th root of 2 (12√2 ≈ 1.05946). Useful (exclusively?!) for generating accurate pitches in musical software applications.

> pattern.c
This little program is designed to find repeated music sub-strings within μMML code. Primarily, this is so that the composer may replace repetitive material with macro or loop commands.

> PCMtoPDM.py
Converts pulse code modulation (PCM) audio data to pulse density modulation (PDM) audio data. Used to generate the drum samples in mmml.c.


Software For AVR Microcontroller

The project has been exclusively concerned with the Attiny13, Attiny45 and Attiny85 series of microcontrollers, however should be compatible with most AVR microcontrollers. As the majority of works have been composed in μMML, the most vital piece of software in this project is mmml.c (listed below). Additionally, a few other routines mentioned in the commentary have been included which may prove useful as a reference. One may notice an omission of the bitbeat routines in this section; as there are a large number of bitbeat compositions, the code has been included under the Bitbeat Collection heading. μMML files for each song can be found under the Composition Portfolio heading.

> mmml.c
μMML player for Attiny45 and Attiny85 clocked at 8MHz. Requires prerequisite use of the mmml-compiler.c program listed below to create the musicdata.h data file.

> spooky.c
1KB, three channel routine (mixed using the pin-pulse method) for Attiny13 at 4MHz. Two of these channels are pulse waves, with a controllable decay transient and percussion takes the form of micro bursts of noise generated by reading (functionally) random values from program memory. If you'd like to hear an example of the output, click here.

> square.c
Simple monophonic square wave generator for Attiny13 at 4MHz, demonstrating perhaps the most elementary 1-bit tone generator.

> fractal.c
Recursive square wave generator for Attiny13 at 4MHz. Generates identical square waves at multiple time domains resulting in a recursive pattern of modulation.


Software For DOS

1-bit music is truly multiplatform! As proof, one can find an adaptation of mmml.c (and the associated compiler) for the Microsoft DOS operating system included below. The routines rely on the internal PC speaker for sonification (but can also be run in DOSBox). At this time there is no automatic compensation for differing CPU speeds. As such, the CLOCK_SPEED_DELAY definition must be adjusted for your CPU (increase definition value to slow playback).

Only tested compiling using the Borland Turbo C++ compiler (but GCC also works with the same code).

> MMMLDOS.C
Plays compiled μMML code. To allow the routine to operate on all machines, pin pulse mixing has been used, as opposed to the pulse interleaving method used in mmml.c. Other than a timbral change between Attiny and DOS, μMML code will run identically on all platforms. MMMLCOMP.C program listed below to create the MUSDAT.H data file.

> MMMLCOMP.C
Compile μMML code to the include (.H) file required by the MMMLDOS.C player program.

The 1-Bit Music Box

Schematics & Documentation

The nature of microcontroller music is to be embedded; recordings simply do not compare to the real hardware, synthesising compositions in real-time. As such, there had to be a physical realisation of each composition using actual components. Timing errors, wobbly voltages and imperfect components give the pieces additional timbral character that is not present in (and, personally, preferable to) the perfect digital recreation. Below, one can find all that is required to make their own music boxes: simply follow the schematic or send the Gerber files to a PCB manufacturer! To complete the device, mmml.c must be flashed to the chip using the AVR Crosspack (for OSX and Linux) or Atmel Studio (Windows). If you'd like to learn more, the book Make: AVR Programming by Elliot Williams is a great place to start!

> download schematic > download gerber files
(pcb manufacture)
> download stl files
(for protective case)

Micro Music Box Instructions

Please consult the image below for the basic operation of the Micro Music Box. To increase volume, twist the dial clockwise. To decrease volume, twist the dial counterclockwise. When the on switch is pointing to the battery, the device is powered off. When the switch is pointing away from the battery, the device is powered on. If treated correctly, the Micro Music Box should work in temperatures between -55℃ to +125℃ and will continue to be operational for up to 100 years at 25℃. The electrolytic capacitor technically only has a guarenteed lifetime of only two years but, if you're not worried about the DC offset, you can simply bridge the connections across the capacitor and enjoy a century of tiny music!
Please read the following instructions to ensure safe operation of the Micro Music Box:
  • The Micro Music Box is designed to drive headphones only - use with amplifiers, soundcards and other outboard gear is certainly possible, but has not been tested, nor electronically protected against.
  • Although unlikely, it is possible to short circuit the Micro Music Box by placing conductive material over the top of the device. This can lead to over-heating and, potentially, damage to the device and materials around it. Please ensure that no conductive materials (such as: aluminium, water, carbon nanotubes or super-cooled compounds like bismuth strontium calcium copper oxide and yttrium barium copper oxide) are touching the top of the Micro Music Box. With this in mind, when transporting the Micro Music Box, it is advised that the battery is removed.
  • When operating the device with any new set of headphones attached, please switch on the device with the volume turned completely counter-clockwise. As the device is designed to drive headphones, it can be quite loud on those headphones with lower impedance. It is better to start the volume low, then adjust to your comfort level.

Roses Are #FF0000

Performed by Yshani Perinpanayagam. Recording is of the first version of the piece whereas materials below are for the second (where the code was readapted to a newer μMML version).

> download score > download .mmml file
> download backing > download recording

Roses Are #FF0000 is a duet for pianist and Attiny85. The piece explores the relationship between two sound and paradigmatic worlds: the acoustic and the digital, the human and the computational. Materials aim not to be confrontational but collegial; perhaps as far as intrinsically symbiotic. The human behind the piano takes on the role they, and their instrument, are best suited: expressive passages, fluidity of rhythm and extended polyphony. The microcontroller provides eclectic percussive material and rigidly quantised ostinatos, reinforcing harmony and, in places (bb. 88 - 114 for example), implying alternate harmonies using the thematic repeated motif. The microcontroller requires the pianist to provide this harmonic context just as the pianist relies on the electronics to provide timing, percussion and extended timbres.

The piece, primarily the electronics, has been composed around short, polyrhythmic loops. It has been structured in a similar format to the typical tracker archetype (pattern, chain structure). In fact, Roses Are #FF0000 specifically utilises the hypertracker framework, exploiting the fact that, in μMML, there can exist multiple pointers to different materials simultaneously. Each channel of audio can be played in parallel, yet with separate metres and, potentially, tempi. This approach is similar to Reich's oft cited work using minimalist forms, for example Clapping Music and Piano Phase. Rhythmic variation is engendered by the offsetting of material, in this case, by introducing multiple time signatures. This approach is a efficacious solution to composition with limited memory as only a few bars of material can produce minutes of unique musical patterns.

Performed at: Ludomusicology, Bath (2017); Power Up, Southampton (2017); All Your Base Festival, Nottingham (2018); and Fantastic Worlds, Nottingham (2019).

Composition Portfolio

Below are all the compositions created as part of the research. Besides the four arrangements / transcriptions listed in the under the Additional Works heading, all herein are original compositions, created using the custom tools listed on this page. 'Recordings' are 44.1kHz recordings from the output of an Attiny85, whereas renders are generated wave files (or 44.1kHz mp3 files to reduce load times when embedded) from the mmml-generator.c. Wave files are potentially more useful for close analysis as they demonstrate the 1-bit techniques ideally, without colouration from components or imperfect replication. Despite this, I feel the recordings have their own, inimitable sonic charm!

Note, wherever filesizes exceed a few megabytes (looking at you 4000ad.wav - 105MB!), an mp3 equivalent has been used to reduce bandwidth stress. I find it rather amusing that, for a project that focuses on reducing memory footprint, the supporting documentation is comparatively gargantuan! You could fit 27463 compiled 4000ad.mmml files in its lossless, generated product.

Finally, if you wish to create your own .mmml files, the following blank μMML document might provide a helpful starting point.

Oscilloscope visuals for 4000AD, Paganini's Been At The Bins and Goose Communications created using SidWizPlus.

Major Compositional Works

4000AD


6495 Bytes | 489 Seconds

> download .mmml file > download wav
Epic seven minute composition in 6KB demonstrating how extreme re-purposing and looping of material can be disguised by distracting the listener with various musical decoys. The listener may not notice that the slow section is tightly, recursively looped to make the most of very little additional data. Solos divert attention away from verbatim repetition of ad-hoc 'rhythm section' and even the opening kit solo returns (disguised by context) as accompaniment towards the piece's finale.

Paganini's Been At The Bins


3410 Bytes | 209 Seconds

> download .mmml file > download wav
Classical / prog-rock fusion in three distinct parts. The first section relies heavily on classical melodic writing in a pastiche of Paganini. The second section largely exploits μMML's inherent informality of metre, allowing for multiple, parallel time signatures, creating interest by contrasting loops of materials at different lengths. The third section is somewhat traditionally composed chipmusic in 7/4: dramatic super-fast arpeggios and delay/reverb effects.

Goose Communications


5377 Bytes | 281 Seconds

> download .mmml file > download wav
Designed to show that three pitched channels can appear to sound more than the sum of their parts. Whilst conservatively composed, the large filesize is due to heavy use of volume commands to vary timbre, alternate between chords and melody on the same channel and really push the 1-bit soundscape. Prominent use of `harmonic neckering' (see section 4 of commentary) with the whole piece focused around a repeated ostinato. Expect an unconstrained prog-rock breakdown towards the end!

Jupiter


646 Bytes | 676 Seconds

> download .mmml file > download wav
'Jupiter' is a suite of minimalist, 1-bit sonic textures representing the environments, topographies and unique characteristics of the Jovian moons. Written for three, pin-pulse mixed, 1-bit pulse waves. Through the use of phase shifting, each piece is extrapolated from a few, simple lines of musical material, producing kaleidoscopic, aural moiré patterns.

Some interesting visualisations can be created from jupiter.mmml's source code (note: images 13-16 are from various other pieces), when outputs are pixels rather than amplitudes. For a cool, high-resolution map of the entire piece, click here.
> image 1
> image 7
> image 13
> image 2
> image 8
> image 14
> image 3
> image 9
> image 15
> image 4
> image 10
> image 16
> image 5
> image 11
> image 6
> image 12

Bitbeat Collection

Bitbeat is a an adapted, customised implementation of bytebeat technique for 1-bit environments (and the Attiny13 at 4MHz). The heart of the pieces are a bitshifting algorithm, a delay for loop, and an incremental for loop from which the sequences are effectively clocked against. This is further modified by additional loops, changing parameters within the fundamental algorithm. The pieces, collectively, have a run time of many hours (though each is only interesting for a little while). Unlike bytebeat pieces, which judge their size on the number of charaters in the source code, to keep filesizes to a minimum and to optimise for speed, software functions such as power, modulo, multiplication and division, have to be excluded.

As the Attiny13 can fit around 4 - 5 of the pieces below (and it seemed a waste to only include one track per chip) I created a tiny little program to toggle between tracks when the power is cycled. This way, turning the chip off and on again will increment the track pointer by one, allowing you to skip between pieces that have no definite end - without any additional buttons! If you'd like to examine the code, I've uploaded it below.

> download bitbeat.c player
Fax Attack
> download fax-attack.c file
> download recording
Ghost Pony
> download ghost-pony.c file
> download recording
Helicopter Mating Season
> download helicopter-mating-season.c file
> download recording
Ghoul School
> download ghoul-school.c file
> download recording
Howl Owl
> download howl-owl.c file
> download recording
Infinity Soup
> download infinity-soup.c file
> download recording
Inkjet House Party
> download inkjet-house-party.c file
> download recording
The Squeak Squad
> download the-squeak-squad.c file
> download recording
Modem Exorcism Pt.1
> download modem-exorcism-pt1.c file
> download recording
Modem Exorcism Pt.2
> download modem-exorcism-pt2.c file
> download recording
Millipede Call Centre
> download millipede-call-centre.c file
> download recording
Sludge Bugs
> download sludge-bugs.c file
> download recording
Small Ahh
> download small-ahh.c file
> download recording
Snooping
> download snooping.c file
> download recording
Tiny Djent
> download tiny-djent.c file
> download recording
Typewriter-Tantrum
> download typewriter-tantrum.c file
> download recording
Upstairs Neighbours
> download upstairs-neighbours.c file
> download recording

As an added bonus - bitbeat can make some very cool visualisations when output directly to video memory, see below!


Additional Works

Below are pieces created as part of the research, but are either experimental, a little self-indulgent, or perhaps not the best example of novel 1-bit practice and accomplished low-memory technique. Still, they document the process, the mindset and are important part of the commentary's discussion.

Sunglasses Snake
> download .mmml file
> download wav
> download remix!
Greatest Hat
> download .mmml file
> download wav
> download remix!
Shrub Club
> download .mmml file
> download wav


'Till There Was You
> download .mmml file
> download wav
Goblin Shark
> download .mmml file
> download wav
Puppy Slug
> download .mmml file
> download wav
Fly Me To The Moon
> download .mmml file
> download wav
Bach Prelude I
> download .mmml file
> download wav
Reich Piano Phase
> download .mmml file
> download wav

Audio Examples

Table Of Contents

All included audio files (unless stated otherwise) are generated by the 1-bit-generator.c, mmml-generator.c or bytebeat.c programs and have been kept at the original sampling rates. Due to the differences between the various forms of synthesis and 1-bit mixing methods employed, perceptual volume will vary between audio files. Pin pulse mixing will always be perceptually louder than the pulse interleaving method even though the bit depth is identical. I have deliberately not intervened to retain authenticity of synthesis; if one were to convert a pulse interleaved wave file to 44.1kHz mp3 format (whilst perceptibly identical) the product would no longer be truly 1-bit, thus the original techniques would be lost to the conversion.

WARNING - because 1-bit signals alternate between only two amplitudinal states, and because all audio files here have been normalised, the examples below are very loud indeed! Please reduce your volume before listening.

Column 1 Column 2 Column 3
  • > Pulse Width Sweep
  • > Pin Pulse Method
  • > Bytebeat Example #1
  • > Volume Enveloping
  • > Pin Pulse Chord
  • > Bytebeat Example #2
  • > Timbre vs Volume
  • > Pulse Interleaving Method
  • > Bytebeat Example #3
  • > PWM Enveloping
  • > Pulse Interleaving Method (Parasite Tone)
  • > Bytebeat Example #4
  • > PWM Enveloping Scale
  • > Harmonisation Techniques
  • > Endless Canon
  • > Crab Canon
  • Pulse Width Sweep



    > download wav

    The example shows a square wave progressively narrowed in pulse width over time. The duty cycle is decremented (non-linearly) from 50% through to 0%. The generated sample rate was 214000Hz and was created using the 1-bit-generator.c program.

    Volume Enveloping



    > download wav

    Two short examples demonstrating 1-bit volume enveloping. The first example depicts a quick attack, starting at the maximum value, decaying to a medium, brief sustain level and then moving quickly to silence. The second example is a ramp from zero to sustain, then again a decay to silence. These do not show true changes in amplitude but, instead, in pulse width. The generated sample rate was 214000Hz and was created using the 1-bit-generator.c program.

    Timbre vs Volume



    > download wav

    Audio example of two, identical ascending sequences demonstrating how the timbral character of a pulse wave, in relation to the duty cycle half its width, changes as the starting pulse width is reduced. Each arpeggio consists of dotted eighth notes subdivided into four sixteenth notes of fixed frequency (one of silence), differing only in duty cycle. Each sixteenth note is half the duty cycle of the one before it. The first arpeggio starts each note at 50%, the second at 6.25%. The example was generated at 60000Hz by the mmml-generator.c program.

    PWM Enveloping



    > download wav

    Example of different 1-bit 'instruments' created by sweeping between pulse widths. Each sound has its own individual characteristics; an instrumentally distinct entity. Even though generated via identical 1-bit parameters, with each sound the movement of pulse width over time forms the voice's instrumental identity. See example PWM Enveloping Scale for a practical demonstration of these sounds. The generated sample rate was 214000Hz and was created using the 1-bit-generator.c program.

    PWM Enveloping Scale



    > download wav

    A practical demonstration of the PWM Enveloping example, showing how unique instruments can be created by varying pulse width in different ways. The generated sample rate was 214000Hz and was created using the 1-bit-generator.c program.

    Pin Pulse Method



    > download wav

    A demonstration of two waveforms combined at an interval of a major third using the 'pin pulse method'. In the example, both voices are modulated from 100% through to 0% duty cycles. The example was generated at 64100Hz by the 1-bit-generator.c program.

    Pin Pulse Chord



    > download wav

    Five 1-bit waveforms combined using PPM and widened from 0% to 100% duty cycle. The chord gradually becomes increasingly distorted as it decays demonstrating the limits of the mixing technique. The example was generated at 64100Hz by the 1-bit-generator.c program.

    Pulse Interleaving Method



    > download wav

    A demonstration of two 1-bit waveforms gradually combined using the pulse interleaving method. Pulses are mixed from 2Hz through to 32050Hz (Nyquist) to demonstrate how the parasite tone is generated then pushed upwards, beyond audible frequencies. The example was generated at 64100Hz by the 1-bit-generator.c program.

    Pulse Interleaving Method (Parasite Tone)



    > download wav

    An isolated parasite tone; the waveform generated by the pulse interleaving mixing method. Also serves as a good aural demonstration of moving between various temporal domains. One can experience a pulse wave move from rhythmic domain, to effect domain, then to pitch, then beyond human hearing. The example was generated at 64100Hz by the 1-bit-generator.c program.

    Harmonisation Techniques



    > download wav
    show .mmml code

    % channel a
    @ t50 % set tempo

    % harmonisation technique #1: arpeggio - 190 bytes
    v7 o4 e64d v6 <g>c v5 [3 ed<g>c ] v4 [4 ed<g>c ]
    v7 d<b v6 gd> v5 [3 d<bgd> ] v4 [4 d<bgd> ]
    v7 c<g v6 ed> v5 [3 c<ged> ] v4 [12 c<ged> ]
    v7 o3 af v6 dc v5 [3 afdc ] v4 [4 afdc ]
    v7 bg v6 ed v5 [3 bged ] v4 [4 bged ]
    v7 o4 c<a v6 f+d> v5 [3 c<af+d> ] v4 [4 c<af+d> ]
    v7 o4 c<a v6 fd> v5 [3 c<afd> ] v4 [4 c<afd> ]

    % harmonisation technique #2: harmonic neckering - 45 bytes
    [8 o3 v5 c32 v3 d> v5 c< v3 c v5 g> v3 c< v5 c v3 g< v5 f> v3 c< v5 g
    v3 f> v5 c< v3 g> v5 d v3 c ]

    % harmonisation technique #3: melody - 38 bytes
    v5 o4 e8degd4<b> | c8<b>ce<b4g | a8ga>c<g16rg8>ce16r | e8fdcd2

    % harmonisation technique #4: simple harmonisation - 12 bytes
    v4 o4 e2dc1<a2g>c<b

    % channel b (bassline)
    @ v4 [4 o2c2<bagfedg ]

    Possible types of single voice harmonisation / accompaniment of a simple descending Ionian(ish) bassline in μMML, ordered by memory cost. Generated by the mmml-generator.c program.

    Bytebeat Example #1



    > download wav

    Product of the formula: t*((t>>12|t>>8)&42&t>>4)-1 discovered / created by Heikkilä. Generated at 8000Hz by the bytebeat.c program.

    Bytebeat Example #2



    > download wav

    Product of the formula: ((t>>1)^((t<<1)+(t>>7)&t>>12))|t>>(4-(1^7&(t>>19)))|t>>7 discovered / created by Kragen. Generated at 8000Hz by the bytebeat.c program.

    Bytebeat Example #3



    > download wav

    Product of the formula: t*(t>>((t>>9|t>>8))&63&t>>4), titled: Space Invaders VS Pong, discovered / created by Visy. Generated at 8000Hz by the bytebeat.c program.

    Bytebeat Example #4



    > download wav

    Product of the formula: ((t*((t>>v)&(t>>v)))&((t>>12|t>>8)&42&t>>4)-1); v-=1000;, discovered / created by me! Uses an additional line of code to modulate variable v, which results in a 'phasing' effect. Generated at 8000Hz by the bytebeat.c program.

    Endless Canon



    > download wav
    show .mmml code

    % channel a
    @ [255 m1 ] % loop main melody

    % channel b
    @ r1 [255 m1 ] % loop main melody, but offset initially by a bar

    % channel c (unused)
    @

    % channel d (unused)
    @

    % macro #1
    @ % bar #1
    o3 v6 g8 v4 g16 v2 g16 v6 > c16 v2 < g16 v6 > d16 v2 c16 v6 < f8 v4 f16 v2 f16 v6 > c16 v2 < f16 v6 > d32 e32 d16
    % bar #2
    v4 < c16 v2 c16v4 < e16 v2 e16 > c16 < e16 v4 > c16 v2 c16 v4 < g16 v2 g16 v4 f16 v2 f16 v4 a16 v2 a16 v4 > d16 v2 d16
    % bar #3
    v6 > d32 e16. c16 v2 e16 v6 < g16 v2 > c16 v6 < e16 v2 g16 v6 f16 v2 e16 v6 g16 v2 f16 v6 > c16 v2 < g16 v6 > d16 v2 c16
    % bar #4
    v4 < c16 v2 c16 v4 < e16 v2 e16 > c16 < e16 v4 > c16 v2 c16 v4 < g+16 v2 g+16 v4 f16 v2 f16 v4 > e16 v2 e16 v4 d16 v2 d16
    % bar #5
    v6 > e16 v4 e16 v6 c16 v2 e16 v6 e16 v2 c16 v6 g16 v2 g16 v6 f32 g16. f16 v2 g16 v6 c16 v2 f16 v6 d16 v2 d16
    % bar #6
    v6 < g16 v4 g16 v6 f16 v2 g16 v6 g16 v2 f16 v6 > c16 v2 < g16 v6 a+16 v2 > c16 v6 < a16 v2 a+16 v6 f16 v2 a16 v6 a16 v2 f16
    % bar #7
    v4 c16 v2 c16 v4 < c16 v2 c16 r16 v1 c16 v4 > c16 v2 c16 v4 < f16 v2 f16 v4 a16 v2 a16 v4 g16 v2 g16 v4 < g16 v2 g16

    A short canon written in μMML. Only a single channel of information is provided (m1) and staggered by r1 to create polyphony from monophony. Generated by the mmml-generator.c program.

    Crab Canon



    > download score

    A short, scored piece demonstrating the crab canon technique. A crab canon is a compositional technique where two voices play the same material, only one voice plays this material backwards. This is essentially a musical reflection or palindrome.