Index of /knowledgemedia/MIDI/AMIGA/AM

      Name                    Last modified       Size  Description

[DIR] Parent Directory 11-Jun-2003 14:52 - [TXT] AM 11-Jun-2003 14:52 15k [TXT] AM.C 11-Jun-2003 14:52 8k [TXT] AM.H 11-Jun-2003 14:52 1k [TXT] AMWINDOW.C 11-Jun-2003 14:52 13k [DIR] LIBS/ 11-Jun-2003 14:52 - [TXT] MAKEFILE 11-Jun-2003 14:52 1k [DIR] PAR/ 11-Jun-2003 14:52 - [DIR] S/ 11-Jun-2003 14:52 - [TXT] TAKT 11-Jun-2003 14:52 3k [TXT] TAKT.C 11-Jun-2003 14:52 3k



	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 <oldpar >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 <oldpar

This option is for experimenting and for designing a new set of parameters.
When  you  want  AM  to just process some previously defined data, start it
with  only  the  proper redirections (probably <parfile >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