What is AM? =========== - AM is public domain software. - AM produces algorithmic music through any MIDI environment. - AM needs AmigaDOS 2.0 and the midi.library by Bill Barton About AM ======== This piece of software has been developed and was successfully used for an exhibition of pictures of a young painter I know, Olivia Rost. The exhibition was entitled "Der Nabel der Welt". The overall theme of the shown pictures and drawings was about the way, the human race approaches the new genetic technologies - both technically and in mind. The initial opening was planned to last for two hours. When Olivia asked me to write some music for this opening, I immediately thought of algorithmic music being the right thing to do this job. I had those early software packages in mind, "genetic music" and "DNA music" and the like. I asked for them at some software vendors, but it seems that these things have had some problems on the commercial market :-(. So I decided to write something myself. The first version of AM was coded during some weekend just to test my thoughts. After some refinements, I added some gadgets to ease the parameter input. The result has then been used for the exhibition. (Lazy guy? Come on, at least it worked! :-) This version has got one new feature (see below), which came to my mind during the opening. If you have other special ideas of producing algorithmic music, feel free to extend this program. But send me a copy of your results, I would love to hear other people's ideas. The original exhibition script is provided as an example. I designed this script and the proper sounds to produce a slow (remember: two hours!) evolution from harmonic to disharmonic sounds. The script shows how to assemble AM processes to build a complete performance. Running TAKT ============ First of all, you have to run the sync master called "takt". Give it the number of milliseconds (0..999999) you want to have between two sync signals, e.g. 1> run takt 333333 for three syncs per second. Every new AM process links onto the sync port, and will reject to run without it. To stop the sync process, just give it a break (ctrl-c) signal. Before dying, the sync process will terminate all running AM processes: 1> status Process 1: Loaded as command: ced Process 2: Loaded as command: conclip Process 3: Loaded as command: Workbench Process 4: Loaded as command: Helper Process 5: Loaded as command: Arq Process 6: Loaded as command: status Process 7: Loaded as command: takt Process 8: Loaded as command: am Process 9: Loaded as command: am 1> break 7 1> status Process 1: Loaded as command: ced Process 2: Loaded as command: conclip Process 3: Loaded as command: Workbench Process 4: Loaded as command: Helper Process 5: Loaded as command: Arq Process 6: Loaded as command: status 1> Running AM ========== AM can only be started from Shell. I have not had the time to implement any file requester for the startup parameters, but redirecting the input to some file works just fine. Also, after stopping an AM process, the last actual parameter set will be printed to stdout, so if you want to keep the changed parameters, also redirect the output to a file, for example 1> run AM newpar If you do not redirect the input, AM will look for parameters from the keyboard. When "run"'ed like above, AM will start immediately, thinking there is no input available. When started as the foreground process, you can enter parameter definitions (see below). An empty line or an undefined parameter keyword ends the input mode. AM will use it's default settings for up to then undefined parameters. Example: 1> AM >ram:test ; input from keyboard, output to ram:test skala=963633963517 ; set some parameters kanal=13 pausen=0.55 ende ; end input (empty line would do) When given the option '-w', AM will open a window containing all necessary gadgets to control the parameters in real time: 1> run AM -w >newpar NIL:). This keeps your screen from getting overcrowded. AM starts smoothly by fading the volume slowly in over the first few generated notes. This is to prevent abrupt changes in the flow of sounds and can't be disabled. To stop an AM process, break it (ctrl-c). Use the Shell command 'Break' to terminate background processes of AM. See the example script on how to control many AM processes running simultaneously. If the parameter window is enabled, you can also stop the corresponding AM process by clicking on the close gadget. Parameters ========== AM expects its parameter input to be lines of the format "KEYWORD=VALUE". An empty line or a wrong keyword ends the parameter input mode and starts the music generation. The output generated from AM can be used as the parameter input for the next AM start. In the parameter control window, the parameters 'KANAL' and 'INSTR' are each displayed one step higher than their actual values. So Kanal=1 in the parameter window means MIDI channel 0, and Instr=0 means no change. The Skala and CSkala string gadgets have a fixed length of 12 characters. If you enter less, the input will be discarded. If you leave just the "nn:" in the CSkala gadget, the corresponding CSkala entry will be cleared. Now for the allowed keywords (case is not significant) and their values: Keyword | Value (Range) | Description ----------+----------------+--------------------------------------------- KANAL | 0..15 | MIDI channel to be used (-> 1..16) | | INSTR | -1, 0..63 | Instrument# for MIDI device, -1 means no | | change | | FREQMITTE | 0..127 | The middle frequency; note pitches will be | | generated in the range FREQMITTE ± FREQABW | | This is measured in half steps, 0 is the | | lowest pitch playable through MIDI, 127 the | | highest | | FREQABW | 0..127 | see above, 12 means ± one octave | | VOLMITTE | 0..127 | The middle volume; note volumes will be | | generated in the range VOLMITTE ± VOLABW | | VOLABW | 0..127 | see above | | PAUSEN | 0.0 .. 1.0 | How many new notes shall be generated? | | 0.0 means every sync is a new note, 1.0 means | | the first note lasts forever... | | TONAUS | 0.0 .. 1.0 | If not starting a new note: The probability | | of stopping the actual note. 0.0 means no | | Note-Off at all, 1.0 means every pause also | | stops the note (so all note lengths will be | | of the sync interval length) | | SKALA | 12 characters | This is the big one. The 12 chars tell the | CcDdEFfGgAaB | "allowance" of each half tone of the octave. | | By carefully setting this value, you can | | control the harmonic of the generated music. | | The default value is "999999999999" what means | | all notes are absolutely allowed. This produces | | totally random harmonics. | | ENDE | - none - | Terminate parameter input mode | | ----------+----------------+--------------------------------------------- CSKALA | nn:SKALA | Added for this release. This provides for | | "continued skalas" what means every half tone | | can lead to it's own skala of allowed tones | | to follow. Not applied CSkalas default to | | the basic SKALA. | | By carefully programming this parameter, you | | can give the produced music some kind of | | melody; the programmed patterns will occur | | from time to time, causing the listener to | | remember them. | | Now here's a commented example input to AM: Kanal=0 Output to MIDI channel 1 Instr=-1 No instrument change FreqMitte=63 Note pitches will vary between 51 FreqAbw=12 and 75 (range of two octaves) VolMitte=63 Volume will vary between 43 VolAbw=20 and 83 Pausen=0.40 40 % of the syncs will be pauses TonAus=0.30 30 % of those pauses will stop the sound Skala=909099090909 C Major (C D E F G A B) CSkala=00:500009000000 C leads to C or F CSkala=05:000000090000 F leads to G CSkala=07:300006000090 G leads to C, F or Bb Ende That's it And here are the default settings: Kanal=0 Instr=-1 FreqMitte=63 FreqAbw=48 VolMitte=63 VolAbw=48 Pausen=0.40 TonAus=0.30 Skala=999999999999 Last Words ========== As each AM process generates exactly one voice, the composition of the harmonics is up to you. By carefully selecting the SKALA and CSKALA parameters, you should be able to produce any sound and melody, from absolutely boring to totally random. It's up to you. Feel free to use the code as a skeleton for your own algorithms, but if you do so, I would like to get a copy of your results. Send flames to HELL: and comments or enhanced versions to balzer@heike.informatik.uni-dortmund.de or M.BALZER@AWORLD.ZER or Michael Balzer Wildermuthstr. 18 W-5828 Ennepetal 14 GERMANY