[Initial revision
thielema**20040522174809] 
[make PerformanceOld.lhs the previous CVS version of Performance.lhs
thielema**20040522175514] 
[tried to compile as many modules as possible, excluded conflicting modules, invoked minor corrections
thielema**20040522185821] 
[replaced 'quot' by 'div' which is the proper choice for negative numbers
thielema**20040522194204] 
[use Sequence and Parallel constructors rather than :+: and :=: because this better matches the structure of music, disabled some of the optimizations in ReadMidi to get the modules compiled, yet
thielema**20040523162233] 
[maximum volume is now 1 instead of 100, removed bug in defNasHandler where the volumes are averaged instead of being multiplied
thielema**20040523163307] 
[Ssf.lhs was available but had the wrong capitalization
thielema**20040524135314] 
[foldr -> foldl in perform
thielema**20040703191144] 
[replaced Sequence by Serial, since Serial is an adjective like Parallel
thielema**20040705144556] 
[Redefinition of PitchClass? Rests and Notes
thielema**20040705145659] 
[Rests and Notes are the sonic atoms in a Music, whereas the other constructors structure the Music. Sonic atoms share the property 'duration' which is now expressed in the type definition and simplifies the functions that process the duration of music
thielema**20040705204436] 
[make the tutorial compilable latex as of 2003 and pdflatex
thielema**20040705205426] 
[corrected number of repetitions
thielema**20040706145910] 
[added tableofcontents and hyperref stuff
thielema**20040706150012] 
[Volume constructor
thielema**20040725094218] 
[more hierarchical structure of the tutorial document
thielema**20040725170231] 
[amsthm package for theorems
thielema**20040725181738] 
[turned old paragraphs into subparagraphs
thielema**20040725181903] 
[merged the Trill part of Basics with the module Trill, separated Percussion module from Basics, since Percussion needs trills
thielema**20040725211319] 
[eliminated identifier conflicts by removing the module export clause
thielema**20040726194022] 
[removed module export clauses to eliminate identifier conflicts, removed overlapping match patterns as reported by 'ghc'
thielema**20040726194208] 
[target 'clean'
thielema**20040726194238] 
[this is now a full Haskell module
thielema**20040726200634] 
[moved contents from new module Percussion to Drums, now this is included instead
thielema**20040726200710] 
[adapt to new Atom constructor
thielema**20040726204255] 
[perc -> drum, though I'm uncertain if the 'perc' or the 'drum' naming scheme ist the newer one
thielema**20040726204403] 
[seemed to use some old Random functions, make use of type class Num instead of fixing to Float
thielema**20040726204611] 
[now all modules except CSound can be compiled
thielema**20040726204729] 
[turned endEL and diddle to 'map's on lists of pitches
thielema**20040727075522] 
[three sections: todo, think over, done; suggest module restructuring, Music data restructuring
thielema**20040727075720] 
[some indentation fixed all errors
thielema**20040727213255] 
[(+:+) and (=:=) now merge their operands if they are also Serial or Parallel lists
thielema**20040727213501] 
[separated Optimization from ReadMidi
thielema**20040727213628] 
[I hope I can now compile all modules
thielema**20040727213744] 
[moved most of the Player related code from Performance to Players; left definition of Player data in Performance, since GHC doesn't support mutually modules satisfyingly today
thielema**20040729205402] 
[tabulators to spaces
thielema**20040729205620] 
[considerations of volume
thielema**20040729205912] 
[MIDI volume is scaled logarithmically, Velocity is different from Volume, turned the NoteAttribute Volume into Velocity
thielema**20040731134621] 
[implemented all trigonometric and hyperbolic functions, eliminated some warnings concerning unused parameters
thielema**20040731165448] 
[some references to newsgroups postings regarding Haskore
thielema**20040801125512] 
[instrument specific values provided by type parameters
thielema**20040811142449] 
[modules can be compiled both with Hugs and GHC
thielema**20040811221128] 
[some things that can be done immediately
thielema**20040814175718] 
[formatting
thielema**20040814175744] 
[include CSound tutorial in Haskore tutorial
thielema**20040814175829] 
[the Pch definition of CSound is rather ill and should not be adapted by Haskores back-end, I have now data type Pch with two constructors
thielema**20040814180043] 
[Loudness enumeration
thielema**20040814221923] 
[clipping of velocity was wrong in HaskToMidi, thus it always clipped to zero
thielema**20040816213313] 
[/tt instead of \tt
thielema**20040827100936] 
[structure analysis of a sequence of notes; modularity and datatype identifier T
thielema**20040827144732] 
[MIDI volume is scaled logarithmically, Velocity is different from Volume, turned the NoteAttribute Volume into Velocity
thielema**20040827172613] 
[Made the examples more concise
thielema**20040827172658] 
[Section structure degraded to fit into the big document
thielema**20040827172737] 
[the Pch definition of CSound is rather ill and should not be adapted by Haskores back-end, I have now data type Pch with two constructors
thielema**20040827172849] 
[Use 'replicate' instead of 'ChildSong6.times'
thielema**20040827212748] 
[Parallel -> chord, Serial -> line, keep independent of the internal structure of Music
thielema**20040827213309] 
[Logfiles need no version control
thielema**20040827220334] 
[Added signatures for Hugs compatibility
thielema**20040827220459] 
[Moved all example songs to a separate directory
thielema**20040827223030] 
[Tutorial must also load the examples from the Example directory
haskore@henning-thielemann.de**20040828093644] 
[Separate directories for different back-ends like MIDI and CSound
thielema**20040828102049] 
[CSound was accidentally moved to MIDI directory
thielema**20040828103514] 
[Colored instead of framed links
thielema**20040828115333] 
[HaskToMidi -> WriteMidi, in order to match the module name ReadMidi
thielema**20040828124758] 
[makeMidi -> writeMidi, in order to match the function name readMidi
thielema**20040828130136] 
[OutputMidi -> SaveMidi, outputMidiFile -> saveMidiFile, in order to match the module and function names of LoadMidi
thielema**20040828134812] 
[Hyperlinks for generator descriptions
thielema**20040828141113] 
[turned some internet references to real hyperlinks
thielema**20040828142647] 
[Found out more about the pitch meanings of MIDI and CSound
thielema**20040828153759] 
[Converted Kantate 147 successfully to Haskore Music
thielema**20040828180207] 
[Raise an error if negative pitches appear, don't let Prelude.char do this
thielema**20040828180407] 
[Explicit error if lineToList is not applied to a Serial Music
thielema**20040828181054] 
[Changed parameter order of performToMidi, the Performance is the main parameter
thielema**20040828181828] 
[Kantate147 under control of Makefile
thielema**20040828183233] 
[ChildSong6.mid was broken
haskore@henning-thielemann.de**20040829091113] 
[Place GHC specific modules in src/GHC
haskore@henning-thielemann.de**20040829102923] 
[use 'make test' to run an automatic test on 'darcs record'
haskore@henning-thielemann.de**20040829202617] 
[Function 'rest' for abstracting from 'Atom ... Rest'
haskore@henning-thielemann.de**20040829123304] 
[quickNote -> note, it seems to be the most natural way to define a note
haskore@henning-thielemann.de**20040829130141] 
[fixed bug in cutList: it appended an infinite number of zero rests
haskore@henning-thielemann.de**20040830221008] 
[TestHaskore.lhs -> BackEnd/MIDI/TestMidi.lhs, because TestHaskore contains routines for testing the MIDI back-end only
haskore@henning-thielemann.de**20040829121800] 
[module PlayMidi supports immediate replay of Music as MIDI, though it works not satisfyingly, yet
haskore@henning-thielemann.de**20040829201243] 
[shell-haskell is necessary to use piping in PlayMidi
haskore@henning-thielemann.de**20040829202507] 
[TestSuite checks if the current modules produce still the same results as the old versions. Currently not functional because it has already changed too much.
haskore@henning-thielemann.de**20040829214645] 
[HaskoreLoader -> Haskore
haskore@henning-thielemann.de**20040830222002] 
[now even infinite performances are possible
haskore@henning-thielemann.de**20040831231715] 
[create a test that verifies the integrity of Ssf
haskore@henning-thielemann.de**20040901153600] 
[now the MIDI files of Ssf and Kantate147 can be verified
haskore@henning-thielemann.de**20040901205420] 
[ChildSong6 can be tested
haskore@henning-thielemann.de**20040901215414] 
[merge generates a unique result
haskore@henning-thielemann.de**20040902210216] 
[assert function
haskore@henning-thielemann.de**20040902215827] 
[test 'cut' function
haskore@henning-thielemann.de**20040902215943] 
[hyperlink to a web page mentioning MML (macro music language), though I don't know if it is the same MML as in this source
haskore@henning-thielemann.de**20040902221959] 
[test for NewResolutions made from the current sources
haskore@henning-thielemann.de**20040904174046] 
[add most of the tests from HaskoreExamples
haskore@henning-thielemann.de**20040904194349] 
[some of the tests failed only because of the ordering
haskore@henning-thielemann.de**20040904195021] 
[CSound scores generated by the original Haskore
haskore@henning-thielemann.de**20040904213052] 
[CSound can be started, but it seems as if changes to the scores arose since the original Haskore
haskore@henning-thielemann.de**20040904213554] 
[writeOrc -> writeOrchestra, is no longer an IO function but generates a string
haskore@henning-thielemann.de**20040904220855] 
[printScore -> writeScore, is no longer an IO function but generates a string
haskore@henning-thielemann.de**20040904221807] 
[CSound orchestras can be successfully tested, score tests fail
haskore@henning-thielemann.de**20040904225502] 
[diffIA applies tkdiff to two files
haskore@henning-thielemann.de**20040905081557] 
[diffIA compares strings rather than files
haskore@henning-thielemann.de**20040905082240] 
[diff for CSound files
haskore@henning-thielemann.de**20040905083813] 
[writeArgs more concise
haskore@henning-thielemann.de**20040905091441] 
[made CSound score tests successful
haskore@henning-thielemann.de**20040905113043
 original Haskore's defNasHandler forgot to propagate PFields
 velocity information is interpreted as logarithmic volume
 remaining problem: GHC outputs 0.01 as 1.0e-2 whereas Hugs shows 0.01
] 
['instance Show Player' instead of 'instance Show (a -> b)'
haskore@henning-thielemann.de**20040905115637] 
[a new section about several design decisions
haskore@henning-thielemann.de**20040905120932] 
[swapped order of octave and pitchClass in Pitch type
haskore@henning-thielemann.de**20040905125905] 
[design study of functions that contain an octave number and lifts a note function to a note
haskore@henning-thielemann.de**20040905130606] 
[the interval function didn't increment the pitch
haskore@henning-thielemann.de**20040905131511] 
[function arpeggio simplifies definition of arpeggio chords
haskore@henning-thielemann.de**20040905133948] 
[NewResolution no longer depends on HaskoreExamples
haskore@henning-thielemann.de**20040905134528] 
[Player.T should replace type Player
haskore@henning-thielemann.de**20040905152100
 unfortunately since mutual recursive modules aren't supported, one cannot have Player.T as an independent type and Player.C as constructor
 defPMap and fancyPMap moved to Player module
 renamed them accordingly
] 
[PMap -> Player.Map
haskore@henning-thielemann.de**20040905152851] 
[PName -> Player.Name
haskore@henning-thielemann.de**20040905153341] 
[def prefix -> deflt prefix
haskore@henning-thielemann.de**20040905154919] 
[Performance -> Performance.T
haskore@henning-thielemann.de**20040905163732] 
[MidiFile -> MidiFile.T
haskore@henning-thielemann.de**20040905174028] 
[MEvent -> MidiFile.Event, removed Midi-M from some identifiers
haskore@henning-thielemann.de**20040905175531] 
[Fractals needs no HaskoreExamples, only Basics
haskore@henning-thielemann.de**20040905181648] 
[import qualified Performance
haskore@henning-thielemann.de**20040905182126] 
[sorted imports
haskore@henning-thielemann.de**20040905182906] 
[writeMidi: moved from TestMidi to WriteMidi
haskore@henning-thielemann.de**20040905183100] 
[Music -> Music.T; untested
haskore@henning-thielemann.de**20040905204816] 
[Basics -> Music; untested
haskore@henning-thielemann.de**20040905205101] 
[Music.T works now
haskore@henning-thielemann.de**20040905212239] 
['case' without curly braces
haskore@henning-thielemann.de**20040905213614] 
[+:+ -> Serial, =:= -> Parallel in explanation
haskore@henning-thielemann.de**20040905213729] 
[formatting
haskore@henning-thielemann.de**20040905214033] 
[Trill no longer exports Music
haskore@henning-thielemann.de**20040905214350] 
[rewrite rules are only correctly parsed if -fglasgow-exts is set
haskore@henning-thielemann.de**20040910084217] 
[Flipping tone sequence - a new example of algorithmic music
haskore@henning-thielemann.de**20040910091122] 
[avoid warnings in Player
haskore@henning-thielemann.de**20040910092919] 
[generalized number flipping to more than two numbers, can be nicely used as bassline or similar
haskore@henning-thielemann.de**20040910171041] 
['rtof' and 'float' generalized to type variables, unfortunately it's not so easy to make this for Music.T since this would break all type signatures containing Music.T
haskore@henning-thielemann.de**20040910204646] 
[import Dur type qualified from Music
haskore@henning-thielemann.de**20040910204835] 
[Performance.DurT -> Performance.Dur
haskore@henning-thielemann.de**20040910205613] 
[alternative implementations of flipSeq
haskore@henning-thielemann.de**20040911131802] 
[keep the most concise implementations of flipSeq
haskore@henning-thielemann.de**20040911132852] 
[mapped the generated numbers to changing chords
haskore@henning-thielemann.de**20040911140124] 
[more ideas about abstract data types
haskore@henning-thielemann.de**20040912122303] 
[standard volume is 1
haskore@henning-thielemann.de**20040912122522] 
[MIDI tempo was double as slow as it should
haskore@henning-thielemann.de**20040912145536
 I fixed that by reducing the factor 4.0 in WriteMidi.toDelta to 2.0,
 though there is also the factor MidiFile.defltDurT = 2 which looks strange.
 But the connected MidiFile.defltST is written
 to the MIDI files so I didn't change that for now.
] 
[writeMidi is enclosed in verbatim environment
haskore@henning-thielemann.de**20040912145908] 
[MidiFile.resampleTime allows changing time grid
haskore@henning-thielemann.de**20040912183914
 The default tempo is divided by some strange factor defltDurT=2.
 I wanted to change that to defltDurT=1 (and also
  WriteMidi.toDelta t = round (t * 2.0 * float division)
 but this would lead to a coarser sampling of event times.
 Further on it breaks all midi test files generated so far.
 One could fix this in the test routines
 similarly to the hacks of velocity.
] 
[(1,A) is now mapped to 440 Hz by all back-ends
haskore@henning-thielemann.de**20040914222113] 
[removed many warnings in the Midi back-end
haskore@henning-thielemann.de**20040915140931] 
[replaced some occurences of Atom by calls to the function 'note'
haskore@henning-thielemann.de**20040915154942] 
[Instr -> setInstrument, Trans -> transpose in order to stay independent from the structure of Music.T
haskore@henning-thielemann.de**20040918141424] 
[Phrase -> phrase, Tempo -> changeTempo, in order to stay independent from the structure of Music.T
haskore@henning-thielemann.de**20040918142212] 
[sub structure Control of Music.T simplifies handling of Tempo, Instrument, Transpose, Player, Phrase
haskore@henning-thielemann.de**20040918152110] 
[Use general type Media.T as base structure for Music.T
haskore@henning-thielemann.de**20040918210339
 There was a problem because NewResolution relies on the precedence of (+:+) over (=:=) but this was lost when redefining these operators in Music.lhs
] 
[uncurry note function since this is the only way it is invoked so far
haskore@henning-thielemann.de**20040918211401] 
[new test for checking the precedence of =:= and +:+
haskore@henning-thielemann.de**20040918212621] 
[check consistency of 'dur' and 'cut' using a random tree of Music.T
haskore@henning-thielemann.de**20040918215729] 
[Performance.perf is more readable when implemented for binary Serial composition
haskore@henning-thielemann.de**20040918223420] 
[cycle flipSong forever, flipSong2 with additional bass line to help the listener stay synchronous
haskore@henning-thielemann.de**20040918234906] 
[moved some finished topics from NOTES to Discussion.tex
haskore@henning-thielemann.de**20040919122315] 
[Two alternative implementations of Media; Temporal class for handling duration and zero duration objects
haskore@henning-thielemann.de**20040919142938
 MediaBin uses binary composition constructors,
 MediaList uses List data structures for composition.
 Though Performance.merge should output a unique event ordering
 the tests fail because of reordered performance events.
] 
[Dur = Ratio Integer (Rational) instead of Ratio Int should avoid overflows
haskore@henning-thielemann.de**20040919145003] 
[Flip: added a new Music which consists of only one chord to demonstrate the principle
haskore@henning-thielemann.de**20040923193148] 
[module PerformanceContext allow for abstraction of the implementation of the Context of a performance
haskore@henning-thielemann.de**20040923214833] 
[export all MIDI processing modules by Midi.lhs
haskore@henning-thielemann.de**20040924193944] 
[split CSound into CSoundScore and CSoundOrchestra
haskore@henning-thielemann.de**20040924194952] 
[Discussion of design decisions
haskore@henning-thielemann.de**20041017223419] 
[serialToList -> serialS, parallelToList -> parallelS
haskore@henning-thielemann.de**20041017225202] 
[common tempo definitions
haskore@henning-thielemann.de**20041018223111] 
[signature for fst3, snd3, thd3
haskore@henning-thielemann.de**20041019214420] 
[Ritardando and Accelerando are changes in tempo rather than attributes of the dynamics
haskore@henning-thielemann.de**20041019220456] 
[I hope that all top-level identifiers got a signature now
haskore@henning-thielemann.de**20041020205641] 
[decided not to change the signature of PhraseFun to (T, Dur) -> (T, Dur)
haskore@henning-thielemann.de**20041020213856] 
[Functions for application of some common phrases
haskore@henning-thielemann.de**20041020221543] 
[now Phrase allows only one phrase per call to make the order of application transparent to the user
haskore@henning-thielemann.de**20041020222746] 
[define 'float' in terms of fromIntegral
haskore@henning-thielemann.de**20041023102201] 
[replaced 'float' by 'fromIntegral'
haskore@henning-thielemann.de**20041023103928] 
[replaced 'rtof' by 'fromRational'
haskore@henning-thielemann.de**20041023104905] 
[some TeX macros for referencing
haskore@henning-thielemann.de**20041023111850] 
[avoid comments in embedded Haskell code
haskore@henning-thielemann.de**20041023124238] 
[Thoughts about the algebraic structure of Media.T
haskore@henning-thielemann.de**20041023124928] 
[proofs of literal equivalence now use the definition of Tempo using rational Dur type
haskore@henning-thielemann.de**20041023145459] 
[relative times in Performance.T allow infinite performances
haskore@henning-thielemann.de**20041024100224] 
[removed sortEvents' since it changes the order of events where no default order is sensible
haskore@henning-thielemann.de**20041024101739] 
[dynamics phrases are mapped to velocities now, this makes sense with natural instruments
haskore@henning-thielemann.de**20041024112456] 
[simplified implementation of Player.fancyInterpPhrase.stretch
haskore@henning-thielemann.de**20041024113534] 
[changed a factor in ReadMidi.diff such that readMidi can retrieve some songs written by writeMidi (but not all)
haskore@henning-thielemann.de**20041024143919] 
[signature for TestMidi.play
haskore@henning-thielemann.de**20041024155002] 
[CSoundTutorial.play plays through a pipe with Sox' play command, 'csound -o dac' should do the same but doesn't work here
haskore@henning-thielemann.de**20041024163744] 
[Csound 4.24.1 as installed here doesn't like to read from stdin
haskore@henning-thielemann.de**20041024180852] 
[test cases for the FlipSong
haskore@henning-thielemann.de**20041024183520] 
[analysis of common infixes in Media
haskore@henning-thielemann.de**20041024210336] 
[music structure analysis now uses a dictionary of the replaced infixes
haskore@henning-thielemann.de**20041024224720] 
[new section for processing and analysis of Music
haskore@henning-thielemann.de**20041025200130] 
[don't use [Media.T a] but decent into Serial and Parallel of Media.T
haskore@henning-thielemann.de**20041026131003] 
[also consider infixes in infixes, i.e. process the entire dictionary not only the main music
haskore@henning-thielemann.de**20041026214326] 
[StructureAnalysis.expand turns a grammar back into a Media.T
haskore@henning-thielemann.de**20041027082849
 The TestSuite got a new function that checks if a stream remains literally equivalent if it is turned into a Grammar and back.
 It uses the Flip.song for that purpose.
] 
[StructureAnalysis.expandAll expands all macros
haskore@henning-thielemann.de**20041027085446] 
[StructureAnalysis.condense: foldListFlat can replaced by a simpler invocation of foldList
haskore@henning-thielemann.de**20041027090225] 
[contribution for the Haskell community and activity report
haskore@henning-thielemann.de**20041028212830] 
[format a grammar from StructureAnalysis as nice Haskell code, though we still need a parser for this purpose
haskore@henning-thielemann.de**20041028220959] 
[dotted, doubleDotted
haskore@henning-thielemann.de**20041029085427] 
[made Report friendly for hunk patch
haskore@henning-thielemann.de**20041029195139] 
[for pretty printing build a HsExp manually
haskore@henning-thielemann.de**20041029195258] 
[StructureAnalysis: replace Serials and Parallels with only one member by their member
haskore@henning-thielemann.de**20041029233234] 
[pretty print Music.T with convenient note and rest functions
haskore@henning-thielemann.de**20041029233643] 
[put negative numeric literals into parentheses
haskore@henning-thielemann.de**20041030083011] 
[prepared StructureAnalysis.Grammar for cyclic infices
haskore@henning-thielemann.de**20041030111627] 
[MusicFormat: now the Haskell code is created by string construction, again
haskore@henning-thielemann.de**20041030122011
 The string is then parsed and pretty printed.
 Constructing Syntax objects was very cumbersome and probably made too many assumptions about the internals of Language.Haskell.Syntax
] 
[detection and replacement of loops; since we allow the insertion of parts of a loop (with 'take'), things become quite complicated
haskore@henning-thielemann.de**20041030150952] 
[remove the special handling of cycling infixes which makes things considerably simpler
haskore@henning-thielemann.de**20041030162924] 
[StructureAnalysis -> ContextFreeGrammar, condenseThres -> fromMedia, expand -> toMedia
haskore@henning-thielemann.de**20041031131558] 
[by organizing Kantate147 trackwise instead of blockwise, larger structures can be discovered by the Grammar analyser
haskore@henning-thielemann.de**20041031141013] 
[MusicFormat.music formats pure music
haskore@henning-thielemann.de**20041031150350] 
[homogenous interface to examples with functions 'song', 'midi', 'main'
haskore@henning-thielemann.de**20041031152239] 
[infinite MidiFile.T
haskore@henning-thielemann.de**20041031182648
 The data structure can be infinite, but the binary data file cannot.
 splitbyInst uses a more sophisticated custom implementation of 'partition'.
 performToMidi doesn't try to fix errors in a UserPatchMap and thus doesn't need to know all used instruments.
 New functions specialised to General MIDI became necessary.
] 
[module HaskoreSupport collects all functions that are not only of interest for Haskore
haskore@henning-thielemann.de**20041031184922] 
['merge' can't be used for mixing NoteOn and NoteOff events
haskore@henning-thielemann.de**20041031190524] 
[splitByInst uses unfoldr
haskore@henning-thielemann.de**20041031192029] 
[(Music.T, Context.T, UserPatchMap) -> (UserPatchMap, Context.T, Music.T) because this more friendly to currying
haskore@henning-thielemann.de**20041031193855] 
[UserPatchMap is a new module which defines the corresponding data type
haskore@henning-thielemann.de**20041031203100] 
[joined HaskoreSupport to HaskoreUtils
haskore@henning-thielemann.de**20041031210356] 
[SaveMidi can use Control.Monad.Writer instead of the custom Output monad, removed module Monads
haskore@henning-thielemann.de**20041031223009] 
[bug in readMidi: the tracks must be composed in parallel not in sequence
haskore@henning-thielemann.de**20041102220430] 
[use 'replicate' and 'sequence' to load a number of MIDI chunks
haskore@henning-thielemann.de**20041102223521] 
[LoadMidi: EndOfTrack is removed from the end of each track, because it is redundant and different from what performToMidi generates
haskore@henning-thielemann.de**20041102231624] 
[don't merge tracks with mergeTrack but merge the resulting music with 'parallel' composition
haskore@henning-thielemann.de**20041103224312] 
[(+:+) and (=:=) ready for infinite application
haskore@henning-thielemann.de**20041108063712] 
[alternative mergeTracks based on a binary mergeTracks2
haskore@henning-thielemann.de**20041108073223] 
[readTrackFromStart is a wrapper for readTrack for handle MIDI tracks that don't start at time 0
haskore@henning-thielemann.de**20041108081959] 
[GHC for performing the automatic tests
haskore@henning-thielemann.de**20041108205809
 With GHC the tests run faster.
 ReadMidi can be tested for NewResolution and Kantate147, where Hugs runs out of memory. Does this indicate a memory leak? It could not be provoked by starting readMidiPure with a simple (replicate 100000 somenote).
 Some CSound files had to be adapted since GHC chooses exponential format for some numbers, where Hugs uses fixed point format.
] 
[NewResolution: resolved ambiguity of Marimba
haskore@henning-thielemann.de**20041108214645
 There was Marimba and marimba.
 These led to two different tracks that were merged to single one after one readMidi-writeMidi cycle.
 Both of these instruments used overlapping notes of the same pitch. In this case ReadMidi.search cannot assign a NoteOff to the corresponding NoteOn properly.
] 
[explain mergeTracks variants
haskore@henning-thielemann.de**20041108215940] 
[MIDI tracks are no longer merged at the MIDI level but at the Music.T level
haskore@henning-thielemann.de**20041108220538] 
[readNote encapsulates the functionality for converting a MidiEvent to a Music.T note
haskore@henning-thielemann.de**20041108223943] 
[ReadMidi: Use an array for looking up program numbers of General midi instruments
haskore@henning-thielemann.de**20041108232421] 
[ReadMidi: extracted 'relTime' from 'search'
haskore@henning-thielemann.de**20041108234142] 
[ReadMidi.getFirst simplified, no need for 'reverse'
haskore@henning-thielemann.de**20041110204544] 
[ReadMidi.splitBy simplified, no need for 'reverse'
haskore@henning-thielemann.de**20041110212256] 
[ReadMidi.getRest: factored out a 'map'
haskore@henning-thielemann.de**20041110213523] 
[ReadMidi.getFirst -> moveTempoToHead, only moves tempo event to head rather than returning a pair (remaining track, first tempo)
haskore@henning-thielemann.de**20041110215916] 
[ReadMidi.makeUPM simplified, could be even simpler with UserPatchMap implemented by FiniteMap, I assume
haskore@henning-thielemann.de**20041110222341] 
[ReadMidi internally converts UserPatchMap to FiniteMap
haskore@henning-thielemann.de**20041110225030] 
[ReadMidi: 'newTracks' and 'search' work on continuous tracks, 'splitBy isTempoChg' is performed after 'newTracks'
haskore@henning-thielemann.de**20041111205225] 
[ReadMidi: 'search' doesn't 'reverse'
haskore@henning-thielemann.de**20041111211522] 
[ReadMidi: cleaned up 'readTrack'
haskore@henning-thielemann.de**20041111213718] 
[ReadMidi: bundle NoteOn and NoteOff in a RichEvent
haskore@henning-thielemann.de**20041111222955
 newTracks -> mergeNotes
 search -> searchNoteOff
] 
[Chords.Chord -> Chord.T
haskore@henning-thielemann.de**20041113201230] 
[define common intervals and chords
haskore@henning-thielemann.de**20041113214702] 
[more declarative TeX file names: Equivalence.tex, Introduction.tex
haskore@henning-thielemann.de**20041113215705] 
[HaskoreExamples doesn't export other modules
haskore@henning-thielemann.de**20041113222135] 
[repeatM without M
haskore@henning-thielemann.de**20041113223426] 
[Drums.DrumSound -> Drum.T
haskore@henning-thielemann.de**20041113224628] 
[Bits -> BitOperation, use qualification for Bit operations, use functions from Data.Bits where possible
haskore@henning-thielemann.de**20041114093814] 
[LoadMidi: prefixed MidiReader function names with 'get'
haskore@henning-thielemann.de**20041114103000] 
[added Fractal to the TestSuite, unfortunately it makes problems with ReadMidi.searchNoteOff
haskore@henning-thielemann.de**20041114114921] 
[we must remove notes of zero duration in order to let the Fractal example work
haskore@henning-thielemann.de**20041114124522] 
[revM -> Music.reverse
haskore@henning-thielemann.de**20041114132651] 
[reduced shadowing of global identifiers
haskore@henning-thielemann.de**20041114133921] 
[factored event time out off MidiFile.Event data structure
haskore@henning-thielemann.de**20041114150259] 
[merged MidiFile.Event and LoadMidi.MidiFileEvent
haskore@henning-thielemann.de**20041114152503] 
[factored MidiFile.Channel out off MidiFile.MidiEvent
haskore@henning-thielemann.de**20041114155536] 
[MidiFile.KeyName -> Key
haskore@henning-thielemann.de**20041114175032] 
[relative MIDI event times in writeMidi, loadMidi, saveMidi
haskore@henning-thielemann.de**20041114221606] 
[relative MIDI event times in readMidi
haskore@henning-thielemann.de**20041115230232] 
[KDevelop: main language is Haskell
haskore@henning-thielemann.de**20041115230348] 
[readTrack: handle relative times properly, readNote, readTrackFromStart no longer necessary
haskore@henning-thielemann.de**20041116000353] 
[Markov chains
haskore@henning-thielemann.de**20041117225405] 
[MusicFormat uses ShowS, respects operator precedences and parentheses
haskore@henning-thielemann.de**20041117230041] 
[removed discussion topics from table of contents
haskore@henning-thielemann.de**20041120183806] 
[remove .aux, .out, .toc files because they are automatically generated and interfere with commutation of patches
haskore@henning-thielemann.de**20041120185739] 
[subsections and TOC item for Drum and Trill
haskore@henning-thielemann.de**20041120190027] 
[moved 'metro', definitions of standard tempos and polyrhythms to new module Tempo
haskore@henning-thielemann.de**20041120190328] 
[MidiFile.Type turned into Enum
haskore@henning-thielemann.de**20041121164040] 
[WriteMidi.performToMidiBase provides the base functionality for performToGeneralMidi and performToMidi
haskore@henning-thielemann.de**20041121180251] 
[move commas and periods out of quotes
haskore@henning-thielemann.de**20041121193130] 
[WriteMidi.performToMEvs can now change the program within a track
haskore@henning-thielemann.de**20041121211003
 This is essential for tracks of mixed instruments,
 which in turn essential for infinite music.
] 
[infinite binary midi files with bad chunk size can be created, but 'timidity' seems to read the file until the end before playing
haskore@henning-thielemann.de**20041121224253] 
[removed type related suffixes from the main functions of LoadMidi and SaveMidi
haskore@henning-thielemann.de**20041122214907] 
[condense ideas about generalized instruments and MIDI controllers
haskore@henning-thielemann.de**20041123094926] 
[exclusive use of \figref
haskore@henning-thielemann.de**20041123181347] 
[exclusive use of \secref
haskore@henning-thielemann.de**20041123183952] 
[index for Tutorial, turned some \em into \keyword
haskore@henning-thielemann.de**20041123210521] 
[Macros.tex: specialized versions of \code for functions, types, and expressions
haskore@henning-thielemann.de**20041123214201] 
[separate module for Pitch handling
haskore@henning-thielemann.de**20041123215958] 
[perform -> Performance.fromMusic
haskore@henning-thielemann.de**20041123222421] 
[removed CSound prefixes from identifiers in CSoundScore
haskore@henning-thielemann.de**20041123224140] 
[Haddock documentation
haskore@henning-thielemann.de**20041124161938] 
[readMidi -> ReadMidi.toMusic
haskore@henning-thielemann.de**20041124230539] 
[writeMidi -> WriteMidi.fromMusic
haskore@henning-thielemann.de**20041124234107] 
[performToMidi -> Performance.fromMidi
haskore@henning-thielemann.de**20041124235102] 
[some thoughts about UserPatchMaps
haskore@henning-thielemann.de**20041125101053] 
[Haddock documentation generation added to darcs' tests
haskore@henning-thielemann.de**20041125213831] 
[new module for MML parser
haskore@henning-thielemann.de**20041125214602] 
[WriteMidi.splitByInst -> Performance.slice
haskore@henning-thielemann.de**20041125223512] 
[UserPatchMap: simplifications
haskore@henning-thielemann.de**20041125230631] 
[UserPatchMap.T consists of pairs of pairs rather triples
haskore@henning-thielemann.de**20041126222657] 
[ReadMidi.splitBy using List.groupBy
haskore@henning-thielemann.de**20041126225926] 
[UserPatchMap.T maps from instrument name to channel and program number.
haskore@henning-thielemann.de**20041126235234
 It contains no longer the GeneralMidi name
 because there might be instruments which don't have one.
] 
[specialization of Media.foldBinFlat: Music.foldBinFlat
haskore@henning-thielemann.de**20041127123536] 
[specialization of Media.mapList: Music.mapList
haskore@henning-thielemann.de**20041127152551] 
[Music.cut -> Music.take, Music.cutList -> Music.takeLine
haskore@henning-thielemann.de**20041127155100] 
[specialization of Media.foldList: Music.foldList
haskore@henning-thielemann.de**20041127171804] 
[MML: avoid use of Music.Atom and Music.Rest constructors
haskore@henning-thielemann.de**20041127173329] 
[Music.drop
haskore@henning-thielemann.de**20041127195604] 
[currently don't know how to get CSound playing in realtime, thus commented out things in PlayCSound
haskore@henning-thielemann.de**20041127204231] 
[Music.take accelerated to linear time
haskore@henning-thielemann.de**20041127205441] 
[revised NOTES about future improvements: generalized instruments, controllers/modulators
haskore@henning-thielemann.de**20041127210754] 
[Optimization.tempo need no longer constructors of Music.T
haskore@henning-thielemann.de**20041202232333] 
[Optimization.transpose
haskore@henning-thielemann.de**20041202235250] 
[removed low-level stuff from definition of 'trill', thus making it even more flexible
haskore@henning-thielemann.de**20041205224323] 
[Optimization.mergeControl is now more aggressive, it also combines controllers if they are not adjacent
haskore@henning-thielemann.de**20041205223337] 
[Temporal.Temporal -> Temporal.Class
haskore@henning-thielemann.de**20041205232757] 
[Media.T -> Media.Class
haskore@henning-thielemann.de**20041205233556
 No longer use a module import to select the wanted underlying data structure (List based or based on binary operators), but use a type class to do that.
 This requires that no constructors of the data structures are accessed.
 Unfortunately, since the data structure based on binary operators can represent neither empty sequences nor empty parallel compositions, it needs Temporal.Class primitives to be able to insert a rest of zero duration. Thus a Temporal.Class context must be added to the signature of the 'serial' and 'parallel' methods.
] 
[CSoundOrchestra.Expression: bundle comparisons in one constructor
haskore@henning-thielemann.de**20041206001353] 
[CSoundOrchestra.Expression: bundle constructors for binary operators
haskore@henning-thielemann.de**20041206002844] 
[CSoundOrchestra.Expression: bundle constructors for unary functions
haskore@henning-thielemann.de**20041207005641] 
[CSoundOrchestra: removed Orc infixes
haskore@henning-thielemann.de**20041209215443] 
[CSoundOrchestra: write* -> *toString
haskore@henning-thielemann.de**20041209231320] 
[CSoundScore: write* -> *toString
haskore@henning-thielemann.de**20041210222429] 
[separate build directory for each platform, allows for simultaneous compiling on different systems
haskore@henning-thielemann.de**20041210230957] 
[moved flattenTuple functions from CSound to HaskoreUtils
haskore@henning-thielemann.de**20041216221650] 
[play music via MIDI from NEdit
haskore@henning-thielemann.de**20041227212717] 
[Drum: explicit exports, drumLine using 'map'
haskore@henning-thielemann.de**20050103144555] 
[notes about a class for pitch depend objects
haskore@henning-thielemann.de**20050106184008] 
[randomPermute -> shuffle, uses partition instead of filter twice
haskore@henning-thielemann.de**20050114143820] 
[shuffle: TestSuite -> HaskoreUtils
haskore@henning-thielemann.de**20050114144415] 
[replaced verbatim by lstlisting environments because they support syntax highlighting
haskore@henning-thielemann.de**20050123180931] 
[new directory src/Haskore as preparation for the hierarchical module structure; Makefile in the root directory
haskore@henning-thielemann.de**20050123193115] 
[moved TeX files to src/Doc
haskore@henning-thielemann.de**20050123200046] 
[new directory Media for modules related to temporal media
haskore@henning-thielemann.de**20050123203753] 
[merged directories FrontEnd and BackEnd to Interface; FrontEnd/MML.lhs -> Interface/MML.lhs
haskore@henning-thielemann.de**20050123210207] 
[CSound: moved to hierarchical name space
haskore@henning-thielemann.de**20050123213750] 
[MIDI: moved to hierarchical name space
haskore@henning-thielemann.de**20050125210606] 
[realtime play works now via a named pipe and 'system'
haskore@henning-thielemann.de**20050201231852
 
 I could not setup a pipeline with Shell-Haskell
 I could not use stdin and stdout, but a named pipe instead.
 The play doesn't start reliably. It seems to start and fail alternatingly. :-)
] 
[Test/TestSuite -> Test/Suite
haskore@henning-thielemann.de**20050206102301] 
[CSound.Tutorial: pureToneTable = fromIntegral pureToneTN
haskore@henning-thielemann.de**20050206104108] 
[General: new part in hierarchical name space
haskore@henning-thielemann.de**20050206112005
 
 Contains: Bit, Utility, MarkovChain
] 
[GHC/IOExtensions removed from hierarchical module space
haskore@henning-thielemann.de**20050206114554] 
[Process: new part in hierarchical name space
haskore@henning-thielemann.de**20050206115827] 
[Test removed from hierarchical module space
haskore@henning-thielemann.de**20050206130031] 
[HaskoreExamples -> Miscellaneous
haskore@henning-thielemann.de**20050206131130] 
[Haskore.lhs removed from hierarchical module space
haskore@henning-thielemann.de**20050206133101] 
[Example: moved to hierarchical name space
haskore@henning-thielemann.de**20050206134129] 
[Music: new part in hierarchical name space, first citizen: Haskore.Music.Format
haskore@henning-thielemann.de**20050206135730] 
[Player, Performance, PerformanceContext -> Music directory
haskore@henning-thielemann.de**20050206141829] 
[Music.lhs: moved to hierarchical name space
haskore@henning-thielemann.de**20050206144954] 
[Basic: new part in hierarchical name space
haskore@henning-thielemann.de**20050206153047
 
 Contains: Chord, Drum, Interval, Pitch, Tempo, Trill
] 
[import all modules from hierarchical standard library rather than from Haskell 98 library
haskore@henning-thielemann.de**20050206160314] 
[CSound accepts only control rate for 'line'
haskore@henning-thielemann.de**20050206174204] 
[read "???" :: StdGen    ->    mkStdGen
haskore@henning-thielemann.de**20050206214644] 
[Makefile: hugs-ext -> hugs, removed hugs-all
haskore@henning-thielemann.de**20050207095003] 
[MIDI.Load.Parser: bundled all types for the state in a triple
haskore@henning-thielemann.de**20050310223945] 
[MIDI.Load: use replicateM to parse multiple bytes
haskore@henning-thielemann.de**20050310233202] 
[Music.Format.enclose using showParen
haskore@henning-thielemann.de**20050313091414] 
[Performance.C' -> Performance.Cons'
haskore@henning-thielemann.de**20050314094456] 
[MidiFile.C -> MidiFile.Cons
haskore@henning-thielemann.de**20050314094938] 
[Media.Class -> Media.C
haskore@henning-thielemann.de**20050314100844] 
[Media.Temporal.Class -> Media.Temporal.C
haskore@henning-thielemann.de**20050314101631] 
[new: MonadParser, extracted from MIDI.Load
haskore@henning-thielemann.de**20050318204215] 
[notes: Cabal, Testing, IDE
haskore@henning-thielemann.de**20050424121336] 
[type variable 'quant' for times and volumes in Performance.T
haskore@henning-thielemann.de**20050424163357
 
 Every day use needs efficiency. In this case 'quant=Float' is a good choice.
 Property testing needs accuracy. In this case 'quant=Rational' is a good choice.
 
 The type variable makes things more complicated
 but I don't see an easier alternative.
] 
[replaced MIDI overview as verbatim ASCII image by a crappy Inkscape graphic
haskore@henning-thielemann.de**20050424190923] 
[(curry id) -> (,)
haskore@henning-thielemann.de**20050425215846] 
[AutoTrack: initial version from 2000-04-30
stefan.ratschan@gmx.at**20050207211840] 
[AutoTrack: executable is compiled with 'ghc --make'
autotrack@henning-thielemann.de**20050207214827] 
[AutoTrack: song names start with capital
autotrack@henning-thielemann.de**20050207215020] 
[AutoTrack joined to Haskore tree
haskore@henning-thielemann.de**20050207215553] 
[AutoTrack: added note about the origin in each file
autotrack@henning-thielemann.de**20050207221020] 
[AutoTrack: some simplifications
autotrack@henning-thielemann.de**20050207223906] 
[AutoTrack: simplified remLen and musicDur
autotrack@henning-thielemann.de**20050207230827] 
[AutoTrack: musicDur without recursion
autotrack@henning-thielemann.de**20050207231627] 
[AutoTrack: adapted to current state of Haskore
haskore@henning-thielemann.de**20050208122746
 
 Since the interpretation of pitch has changed
 the generated MIDI files have too high pitch now
] 
[AutoTrack: verbatim -> haskelllisting environment
haskore@henning-thielemann.de**20050208125122] 
[AutoTrack.Scales -> Haskore.Basic.Scale
haskore@henning-thielemann.de**20050208130348] 
[AutoTrack/Utils.repeatMN -> Haskore.Music.replicate
haskore@henning-thielemann.de**20050208135605] 
[moved some general functions from AutoTrack/Utils to Haskore.General.Utility
haskore@henning-thielemann.de**20050208135932] 
[AutoTrack.rhythm: (sort l == l) is quite an expensive monotony check
haskore@henning-thielemann.de**20050212130829] 
[AutoTrack.Rhythm: createRhythm should now work with infinite rhythms, too
haskore@henning-thielemann.de**20050212131636] 
[AutoTrack.Rhythm: Rhythm.Rhythm -> Rhythm.T, removed 'rhythm' prefix from functions
haskore@henning-thielemann.de**20050212134330] 
[Utility: select
haskore@henning-thielemann.de**20050212135427] 
[AutoTrack.Rhythm: handle all cases in countInR
haskore@henning-thielemann.de**20050212135713] 
[AutoTrack: divided Charts into ChartBar, ChordChart, EventChart, ScaleChart
haskore@henning-thielemann.de**20050220220158] 
[AutoTrack: Styles.splitToDur simplified
haskore@henning-thielemann.de**20050220221148] 
[AutoTrack: Instruments -> Instrument
haskore@henning-thielemann.de**20050221222357] 
[AutoTrack: Styles -> Style
haskore@henning-thielemann.de**20050221225124] 
[AutoTrack: changed order of parameters of Options.exit
haskore@henning-thielemann.de**20050221225456] 
[AutoTrack: manual also in postscript
haskore@henning-thielemann.de**20050221225742] 
[AutoTrack: ChordSym -> ChordSymbol
haskore@henning-thielemann.de**20050221231117] 
[AutoTrack: Options -> Option
haskore@henning-thielemann.de**20050225130306] 
[AutoTrack: Rhythm.Rhythm -> Rhythm.T, again - why was this reverted?
haskore@henning-thielemann.de**20050310215848] 
[AutoTrack.ChordSymbol: simplify parsing with State monad
haskore@henning-thielemann.de**20050311182809] 
[AutoTrack: ChartBar, ChordChart, EventChart, ScaleChart, Style: C -> Cons
haskore@henning-thielemann.de**20050314114920] 
[AutoTrack: moved to hierarchical name space
haskore@henning-thielemann.de**20050318192619] 
[AutoTrack: moved filterMusic from Utils to Style, since it is only used there
haskore@henning-thielemann.de**20050318193503] 
[AutoTrack.Style: eliminated compiler warnings with respect to unhandled patterns
haskore@henning-thielemann.de**20050318194505] 
[AutoTrack: check generation of documentation
haskore@henning-thielemann.de**20050318200148] 
[AutoTrack: Utils -> Transposeable, it contains only the modulo-transposition class now
haskore@henning-thielemann.de**20050318201656] 
[AutoTrack: Style.playToString -> playToStream
haskore@henning-thielemann.de**20050410160822] 
[AutoTrack: experimentally added 'harmonic' style
haskore@henning-thielemann.de**20050423193633] 
[manual restructuring: merged Music, Performance, Player into one section
haskore@henning-thielemann.de**20050424171015] 
[added QuickCheck properties for the axioms in Equivalence.tex and test them in the test suite
haskore@henning-thielemann.de**20050425091430] 
[present QuickCheck test functions as alternative form of the axioms
haskore@henning-thielemann.de**20050427080926] 
[limit the size for music trees computed with the QuickCheck.Arbitrary instance for Music.T
haskore@henning-thielemann.de**20050430111749] 
[test algebraic properties only with notes of positive duration
haskore@henning-thielemann.de**20050430135957
 
 I detected a pathological counterexample for parallel commutativity for notes of length zero.
 Namely:
 m0 = d 0 0 []
 m1 = d 0 0 [] +:+ c 0 0 []
 Performance.fromMusic (m0 =:= m1) -> [d, d, c]
 Performance.fromMusic (m1 =:= m0) -> [d, c, d]
] 
[moved from Hugs 2002-11 to 2005-03
haskore@henning-thielemann.de**20050430151755] 
[run QuickCheck tests within HUnit
haskore@henning-thielemann.de**20050430171843] 
[run MIDI and CSound tests in the HUnit framework
haskore@henning-thielemann.de**20050430181743] 
[use also transposition, tempo changes, and instrument changes for the construction of random music
haskore@henning-thielemann.de**20050501145451
 
 The problem is that 'arbitrary' carries the size information
 and makes everything smaller,
 even values which are not related to music size
 such as the tempo ratio.
 If the size parameter is too small
 (untilM (0<) arbitrary) runs forever.
] 
[toMaybe
haskore@henning-thielemann.de**20050501174240] 
[maximum0 allow computation of durations of empty parallel compositions
haskore@henning-thielemann.de**20050501182839] 
[Music.dropLine': nothing can be dropped from an empty list
haskore@henning-thielemann.de**20050501193155] 
[Optimization.composition removes empty parallel and serial compositions
haskore@henning-thielemann.de**20050501202514] 
[check Music.take and Music.drop with QuickCheck
haskore@henning-thielemann.de**20050501202938] 
[adopt TeX version of the HCAR article
haskore@henning-thielemann.de**20050501210300] 
[HCAR article updated for 2005 spring issue
haskore@henning-thielemann.de**20050501210436] 
[quickCheck for optimizations and Music.reverse
haskore@henning-thielemann.de**20050503085527] 
[now all tests run within HUnit, including infinite music, precedence, grammar, format
haskore@henning-thielemann.de**20050503103715] 
[replace Atom data type by Maybe Note
haskore@henning-thielemann.de**20050516182545] 
[Temporal instances for Media.List and Media.Binary don't need instance extensions anymore
haskore@henning-thielemann.de**20050613195203] 
[parametrize Music.T with the note type
haskore@henning-thielemann.de**20050614211714
 
 Two note instances are provided:
   A simple note containing of pitch and attributes (Music.Melody)
   A note equipped with an instrument (Music.Standard)
 
 'setInstrument' is now 'StdMusic.fromMelody'.
 Thus the type checker verifies that only one instrument is assigned to each note.
] 
[note definition moved to module Melody
haskore@henning-thielemann.de**20050615184421] 
[new instance of Music, namely Music.MIDI, supports predefined instruments and drums
haskore@henning-thielemann.de**20050615194534] 
[parametrize Melody with note attribute
haskore@henning-thielemann.de**20050616192342] 
[partitionMaybe based on foldr
haskore@henning-thielemann.de**20050617213247] 
[StdMusic: replaced [NoteAttribute] by record items 'velocity' and 'pfields'
haskore@henning-thielemann.de**20050617213429] 
[fix IOExtensions and move to Haskore.IO
Sarah_Eisenstat@brown.edu**20050620172133] 
[removed GHC directory and adapt Makefile to Haskore.IO
haskore@henning-thielemann.de**20050622182709] 
[MIDI patches suggested by Bo Herlin
Sarah_Eisenstat@brown.edu**20050620172436] 
[rewrite CSound.Orchestra and documentation
Sarah_Eisenstat@brown.edu**20050620172312] 
[fix CSound Tutorial code
Sarah_Eisenstat@brown.edu**20050620172351] 
[changes CSound Orchestra to use a table of function names and argument counts
Sarah_Eisenstat@brown.edu**20050621144200] 
[add "=" to the list of CSound functions
Sarah_Eisenstat@brown.edu**20050623183552] 
[changes Tutorial Pfield references
Sarah_Eisenstat@brown.edu**20050623183619] 
[CSound tutorial: fix problems reported by the test suite
haskore@henning-thielemann.de**20050626132114
 
 pluck: changed third argument from 0 to (pchToHz notePit)
 delay: updated prototype orchestra files
 
] 
[CSound: added signatures
haskore@henning-thielemann.de**20050626141704] 
[CSound.OrchestraFunction (module name in singular), some simplifications
haskore@henning-thielemann.de**20050626150129] 
[CSound.Orchestra: LineFunctionDef stores the definition of a signal
haskore@henning-thielemann.de**20050626155633] 
[parametrise Performance with the note type
haskore@henning-thielemann.de**20050624204300
 
 The default players support only StdMusic.Note so far.
] 
[simplified Functor instance of Media, foldBin preserves structure
haskore@henning-thielemann.de**20050625134410] 
[Media.mapM, Music.foldBin
haskore@henning-thielemann.de**20050625174228] 
[conversion from Music to Performance with the State monad with (performance, duration) as result and Context as state
haskore@henning-thielemann.de**20050625175801
 
 replaced T' by PState
 replaced T'' by TLastDur
 
] 
[Performance.fromMusic with foldList, simplified fancyPlayer
haskore@henning-thielemann.de**20050625210451] 
[fancyPlayer: interpretation of Slurred was improperly converted to event time differences
haskore@henning-thielemann.de**20050626123737] 
[class Music.Playable.C allows to fetch pitch and velocity from any note type
haskore@henning-thielemann.de**20050701141759
 
 We store the context data 'transposition' and 'velocity' in Performance.Events
 and update this when interpreting phrases.
 The final pitch and velocity is computed
 using the new class when it comes to an backend.
] 
[CSound.Score.getId -> List.lookup, NameMap parametrized with intrument type, RandDist
haskore@henning-thielemann.de**20050705203128] 
[CSound.Score.statementFromEvent does not need Playable class any longer
haskore@henning-thielemann.de**20050706203637
 
 Conversion of notes of arbitrary type to back-end specific data is too complex for type classes.
] 
[CSound.Tutorial: 'scored' includes conversion from Melody; instrument functions have PFields as parameters
haskore@henning-thielemann.de**20050708105238] 
[Haskore.IO -> Haskore.General.IO
haskore@henning-thielemann.de**20050710162924] 
[CSound.Tutorial: resolved merge conflicts in 'scored'
haskore@henning-thielemann.de**20050710174221] 
[CSound.Tutorial: applyPFields
haskore@henning-thielemann.de**20050710175738] 
[PerformanceContext: eliminated restriction to StdMusic
haskore@henning-thielemann.de**20050710220717] 
[Note ordering decoupled from ordering of note record fields
haskore@henning-thielemann.de**20050710220908] 
[CSound.Tutorial: custom note attribute type replacing PFields for more type safety
haskore@henning-thielemann.de**20050711164930] 
[Melody: Split module into Melody (with note attribute type parameter) and Melody.Standard (with fix NoteAttribute type)
haskore@henning-thielemann.de**20050712113525] 
[CSound.Tutorial bug: tut18 provides one instrument but score5 needs two of them
haskore@henning-thielemann.de**20050712200620
 
 Replaced score5 by score3. This leads to the same binary sound output.
 
] 
[CSound.Tutorial: more consistency checks for instruments in the Music and in the CSound score
haskore@henning-thielemann.de**20050712201901] 
[Haskore.Performance: new directory containing Performance.Context, Player
haskore@henning-thielemann.de**20050712205123
 
 The directory Music is now reserved for different instances of Music.T.
 
] 
[MIDI.Render: remove 'test' prefix from function names
haskore@henning-thielemann.de**20050924221422] 
[CSound.Score.fromMusicStd now returns a score rather than IO
haskore@henning-thielemann.de**20051002164442] 
[StdMusic: re-export note lengths and other basic stuff from Music
haskore@henning-thielemann.de**20051002164815
 
 For simple song it should now suffice
 to import Melody.Standard and Music.Standard unqualified.
 For more advanced songs Melody or Music can be imported qualified.
] 
[HCAR report Nov 2005, included changes from the editor
haskore@henning-thielemann.de**20051019162648] 
[incorporated Paul Hudak's modifications to the Nov 2005 report
haskore@henning-thielemann.de**20051020105149] 
[Re-recorded patch of Sarah Eisenstat: CSound.Orchestra with type parameter for the number of output channels
haskore@henning-thielemann.de**20051030153840] 
[named fields in InstrBlock
haskore@henning-thielemann.de**20051030155618] 
[CSound.Orchestra.Orc -> Orchestra.Cons
haskore@henning-thielemann.de**20051030160234] 
[getChannelCount works also for undefined values of their type
haskore@henning-thielemann.de**20051030162837] 
[simplified monadic code for Delay lines and the Orc monad
haskore@henning-thielemann.de**20051030175730] 
[CSound.Orchestra: CSound listings reverted to 'verbatim' environment; fixed typesetting of listings with non-executable code
haskore@henning-thielemann.de**20051030180154] 
[UNIX shell script for executing all CSound examples
haskore@henning-thielemann.de**20051030193328] 
[CSound.Tutorial: Arguments of delay were flipped
haskore@henning-thielemann.de**20051030200539
 
 With the right argument order tut17 can be fixed.
 tut20 remains broken because it expects that the delay time of 'delay'
 can be controlled in time.
 Neither CSound V4 nor V5 seems to support that.
] 
[CSound.Tutorial: use Mono output where only mono instruments where played
haskore@henning-thielemann.de**20051030202821] 
[Player: PasHandler -> PhraseInterpreter
haskore@henning-thielemann.de**20051031113228] 
[StandardMusic: distinguish between melody instrument and drum notes
haskore@henning-thielemann.de**20051102083407] 
[simplified UserPatchMap.partialMatch
haskore@henning-thielemann.de**20051101215909] 
[UserPatchMap.deflt defined with GeneralMidi.Instrument
haskore@henning-thielemann.de**20051101222803] 
[MIDI: replaced Event type names containing primes, instead SchedEvent for events with time information
haskore@henning-thielemann.de**20051113143301] 
[Utility: zipWithMatch, zipWithMatch3 for lists of equal length; application to midi event lists in MIDI.Write
haskore@henning-thielemann.de**20051113145016] 
[Utility: 'limit' is a combination of 'min' and 'max'
haskore@henning-thielemann.de**20051113162553] 
[uniform order of velocity and pitch in function arguments and records
haskore@henning-thielemann.de**20051113181555] 
[MIDI.Load: simplifications using liftM and liftM2
haskore@henning-thielemann.de**20051116230603] 
[new module: TimeOrderedList generalises MIDI event list
haskore@henning-thielemann.de**20051120170226] 
[use TimeOrderedList.T for performance
haskore@henning-thielemann.de**20051120193848] 
[simplified TimeOrderedList.partition using pairMap
haskore@henning-thielemann.de**20051120213808] 
[TimeOrderedList: discretizing of times, simplifies MIDI.Write.eventsFromPf
haskore@henning-thielemann.de**20051130102847] 
[simplified MIDI.UserPatchMap.fromInstruments
haskore@henning-thielemann.de**20051204134440] 
[MidiFile: defined normalVelocity, maximumVelocity
haskore@henning-thielemann.de**20051204183321] 
[Performance.BackEnd: new module providing an interim performance structure which contains a back end specific representation of notes
haskore@henning-thielemann.de**20051204184348] 
[moved MIDI.Read.splitBy to General.Utility
haskore@henning-thielemann.de**20051210125031] 
[MIDI.Read: use TimeOrderedList for RichEvents
haskore@henning-thielemann.de**20051210132117] 
[MIDI.Read: simplified some top-level pattern matching using 'case'
haskore@henning-thielemann.de**20051210143829] 
[MIDI.Read: use MidiNote.T in definition of RichEvent
haskore@henning-thielemann.de**20051210180915] 
[MIDI.Read: readTrack does now process a back-end performance
haskore@henning-thielemann.de**20051210230833] 
[TimeOrderList.partition & slice: predicate depends on event body only
haskore@henning-thielemann.de**20051210231841] 
[MIDI.Read: separated conversion from MidiNote to StdNote from readTrack
haskore@henning-thielemann.de**20051211072133] 
[MidiFile: extracted sorting of coinciding events to TimeOrderedList
haskore@henning-thielemann.de**20051211112320] 
[Utility: new flipPair
haskore@henning-thielemann.de**20051211130708] 
[MIDI.Read: generic conversion from performance to music moved to Performance.BackEnd
haskore@henning-thielemann.de**20051211130941] 
[General.Utility: extracted new modules General.String and General.Monad
haskore@henning-thielemann.de**20051211134809] 
[MIDI.Read: UserPatchMap -> ChannelPatchMap
haskore@henning-thielemann.de**20051211145646] 
[MIDI.Read: distinguish between generic toMusic and specialized toMusicGM (General MIDI)
haskore@henning-thielemann.de**20051211153319] 
[class Playable removed
haskore@henning-thielemann.de**20051211154615] 
[Music.Rhythmic: generalisation of Music.Standard with type parameter for instrument and drum
haskore@henning-thielemann.de**20051211170117] 
[MIDI.UserPatchMap with instrument type parameter
haskore@henning-thielemann.de**20051211182529] 
[to avoid redundancy use the HUnit package shipped with Hugs-2005-03
haskore@henning-thielemann.de**20050527165536] 
[MIDI.Write: use true functions instead of UserPatchMap.T
haskore@henning-thielemann.de**20051216183952] 
[test suite: start tkdiff only if contents differ
haskore@henning-thielemann.de**20051223185618] 
[RhyMusic: switched order of type parameters 'instr' and 'drum'
haskore@henning-thielemann.de**20051223191119] 
[module Music.GeneralMIDI is an instance of Music.Rhythmic with enumerations for Drum and Instr, replaced most occurences of StdMusic by MidiMusic
haskore@henning-thielemann.de**20051223201417] 
[MIDI.General: cleaned up instrument and drum related definitions
haskore@henning-thielemann.de**20051223234133] 
[UserPatchMap -> InstrumentMap, provides both instrument and drum map, now
haskore@henning-thielemann.de**20051225120657] 
[MidiFile.drumKey -> GeneralMidi.drumMinKey
haskore@henning-thielemann.de**20051225154451] 
[InstrumentMap: distinguish between conversion from and to MIDI parameters
haskore@henning-thielemann.de**20051225154647] 
[MIDI: moved conversion between MidiNote and MidiEvent to MIDI.Note; simplified ReadMidi.searchNoteOff
haskore@henning-thielemann.de**20051226213825] 
[Music.Rhythmic.Note: removed pFields because they are CSound specific and instrument specific
haskore@henning-thielemann.de**20051227100341
 
 Additional parameters should be carried in 'instr' data types.
 Replaced PFields constructor in NoteAttributes by Vibrato and Tremolo.
 They are still unused.
] 
[Performance.BackEnd: new fromPerformance
haskore@henning-thielemann.de**20051227112230] 
[CSound.Score: assemble statement lines with 'unwords'
haskore@henning-thielemann.de**20051227113352] 
[CSound: new modules InstrumentMap and Note, analogous to MIDI
haskore@henning-thielemann.de**20051227113533] 
[MIDI.Note.velocityFromStd: velocity parameter with type Rational
haskore@henning-thielemann.de**20051227152210] 
[CSound.Tutorial: based on Music.Rhythmic, no longer a custom note definition
haskore@henning-thielemann.de**20051228104338] 
[CSound.Generator: separated generator definitions from Score module
haskore@henning-thielemann.de**20051228111741] 
[Performance: eDur -> eventDur, eNote -> eventNote, eVelocity -> eventDynamics, etc.
haskore@henning-thielemann.de**20051231110844] 
[Performance: cDur -> contextDur, cKey -> contextTranspose, cVelocity -> contextDynamics
haskore@henning-thielemann.de**20051231113329] 
[MIDI.Render: play songs with automatically generated patch map using General MIDI instruments
haskore@henning-thielemann.de**20060101162133] 
[Chord.fromIntervals got a parameter for inversion
haskore@henning-thielemann.de**20060101163527] 
[WhiteChristmas: demonstrates usage of chords and drums
haskore@henning-thielemann.de**20060101164125] 
[Scale.continue: continues a scale to all octaves
haskore@henning-thielemann.de**20060101164717] 
[Chord: for a sequence of chords compute a sequence of inversions such that the pitches of the chords vary minimally
haskore@henning-thielemann.de**20060102092001] 
[WhiteChristmas: use automatic inversion planning
haskore@henning-thielemann.de**20060102092438] 
[Chord, inversion planning: construct the notes from scratch
haskore@henning-thielemann.de**20060102103737] 
[WhiteChristmas: chords without octave specification
haskore@henning-thielemann.de**20060102104411] 
[Chord, inversion planning: specify trend by the center pitch instead of the inversion of the boundary chords
haskore@henning-thielemann.de**20060102111005] 
[WhiteChristmas: specify trend by the center pitch instead of the inversion of the boundary chords
haskore@henning-thielemann.de**20060102111253] 
[Cabalize Haskore
Gabriel Ebner <ge@gabrielebner.at>**20051204003315] 
[ChordSymbol: parse and format Jazz chord symbols
haskore@henning-thielemann.de**20060105105200] 
[ChordSymbol.typeToChord: put relative and absolute pitch specifications into one list
haskore@henning-thielemann.de**20060105140614] 
[Basic.ChordType: new module extracted from AutoTrack/ChordSymbol.lhs; handles chord types like minor, major and its modifications
haskore@henning-thielemann.de**20060105205737] 
[specialised signatures for {Midi,Std}Music.fromMelody and fromMelodyIgnoreAttr
haskore@henning-thielemann.de**20060304214550] 
[LoopTreeTagged: data structure for an arbitrary(?) directed graph represented as tree with feedback
haskore@henning-thielemann.de**20060305163910] 
[LoopTreeTagged: simplified unwind by using a list of collected tags, instead of doing this implicit by the construction of a cascaded comparison function
haskore@henning-thielemann.de**20060305165417] 
[LoopTreeTagged: check for multiple definition of a tag
haskore@henning-thielemann.de**20060305182901] 
[new module LoopTreeRecursive: similar to LoopTreeTagged but more comfortable to use
haskore@henning-thielemann.de**20060305183152] 
[LoopTreeRecursive: toTagged and fromTagged with flexible tag type
haskore@henning-thielemann.de**20060306112354] 
[LoopTreeRecursive: toTaggedUnique assigns globally unique labels
haskore@henning-thielemann.de**20060306113913] 
[comments on the Rhythmic Music data type and related changes in Drum and MIDI handling
haskore@henning-thielemann.de**20060307115524] 
[the value of Staccato is interpreted as reciprocal by the FancyPlayer
haskore@henning-thielemann.de**20060307143105] 
[Player: added functions for absolute interpretation of Staccato, Legato, Slurred
haskore@henning-thielemann.de**20060307170908] 
[Player: make absolute interpretation of Staccato, Legato, Slurred default
haskore@henning-thielemann.de**20060307174540] 
[CSound.Tutorial: replace fromIntegral by the specialised function tableNumber in order to discriminate table numbers from floating point numbers
haskore@henning-thielemann.de**20060308105010] 
[TestSuite: separate the actions on CCSound examples (verify, diff, update) from the generation of the contents
haskore@henning-thielemann.de**20060308120122] 
[CSound.Orchestra: new SigExp constructor TableNumber should be prefered to encoding table numbers with floating point numbers, as in constructor Const
haskore@henning-thielemann.de**20060308125202] 
[CSound.Orchestra: several function definitions by extensive pattern matching replaced by 'case's
haskore@henning-thielemann.de**20060308140533] 
[Utility.mapInit: alternative implementation using foldrf
haskore@henning-thielemann.de**20060308144241] 
[Utility.mapInit: another implementation using plain foldr
haskore@henning-thielemann.de**20060308145521] 
[CSound.Tutorial: play failed for stereo sounds, fixed that by using AIFF output of CSound
haskore@henning-thielemann.de**20060308152338] 
[CSound.Tutorial: replaced some \tt commands by more specific ones, e.g. \function
haskore@henning-thielemann.de**20060308154636] 
[CSound.Tutorial: modified reverb examples such that the effects can be perceived clearly, use of legato effect
haskore@henning-thielemann.de**20060308154912] 
[CSound.Tutorial: fixed tut20 by replacing 'delay' by 'vdelay'
haskore@henning-thielemann.de**20060308182702] 
[CSound.Tutorial: added tut21 and tut22which demonstrate the use of general feedback loops
haskore@henning-thielemann.de**20060308183312] 
[CSound.Orchestra: reordered arguments of signal processors to a more Haskellish way, replaced \tt by more specific macros
haskore@henning-thielemann.de**20060309140330] 
[new modules: LoopTreeRecursiveGen, LoopTreeTaggedGen for trees with loops but a structure of sub-trees which is hidden in nodes of generic type
haskore@henning-thielemann.de**20060309191118] 
[LoopTreeRecursiveGen, LoopTreeTaggedGen: define instances for Eq and Show, which require undecidable instance and cause instance context reduction loops when used in CSound.Orchestra.SigExp
haskore@henning-thielemann.de**20060310113824] 
[LoopTree*Gen: avoid undecidable instances and other difficulties by the classes CollEqual and CollShow
haskore@henning-thielemann.de**20060311221011
 
 They allow for implementation of Eq and Show instances for collections
 without having instances for the members.
 However coding instances for these type classes is boring.
] 
[CSound.Orchestra: build SigExp on top of LoopTreeRecursiveGen
haskore@henning-thielemann.de**20060311221550
 
 The same data placed in a LoopTreeTaggedGen is used for output.
 That is the former runFix is replaced by the conversion
 from LoopTreeRecursiveGen to LoopTreeTaggedGen.
] 
[CSound.Orchestra: reduced indirections in Index and MultiDef constructor, thus eliminated warnings about unhandled cases
haskore@henning-thielemann.de**20060311231142] 
[new: Example.Guitar demonstrates simulation of playing chords on a guitar
haskore@henning-thielemann.de**20060312171027] 
[CSound.Orchestra: CollShow and CollEq instances of SigTerm can re-use Show and Eq instances since the signature of collShowsPrec and collEqual are now specialised to LoopTreeTagged.T
haskore@henning-thielemann.de**20060313093230] 
[Port Shell to ghc-6.4's GHC.Handle API
Gabriel Ebner <ge@gabrielebner.at>**20051204003012] 
[adaption to GHC-6.4.1: remove Data.FunctorM
haskore@henning-thielemann.de**20060326210406] 
[adaption to GHC-6.4.1: use HUnit from GHC libraries
haskore@henning-thielemann.de**20060326211413] 
[adaption to GHC-6.4.1: replace Data.FiniteMap by Data.Map
haskore@henning-thielemann.de**20060326222123
 
 Wrapper Haskore.General.Map provides
 more convenient signatures for lookup functions.
] 
[adaption to GHC-6.4.1: reduced redundant imports
haskore@henning-thielemann.de**20060326224639] 
[adaption to GHC-6.4.1: Debug.QuickCheck -> Test.QuickCheck
haskore@henning-thielemann.de**20060326224846] 
[initial support for SuperCollider
haskore@henning-thielemann.de**20060329074359] 
[ChildSong6: use 'loudness' instead of 'velocity' for bassline
haskore@henning-thielemann.de**20060329075352] 
[SuperCollider.example: gimmick - lowpass filtered frequency control results in a glissando effect
haskore@henning-thielemann.de**20060329214206] 
[SuperCollider: start a new sound for each note
haskore@henning-thielemann.de**20060330054910] 
[SuperCollider: pass sound parameters immediately to s_new
haskore@henning-thielemann.de**20060330072910] 
[generator for unique ids with recycling
haskore@henning-thielemann.de**20060330204956] 
[SuperCollider.Play: support of polyphonic music
haskore@henning-thielemann.de**20060330205924] 
[Utility: equalField, equalRecord for easy implementation of Eq instances
haskore@henning-thielemann.de**20060331074310] 
[SuperCollider: play music with multiple instruments
haskore@henning-thielemann.de**20060331074557] 
[removed SuperCollider.Play from Hugs modules, because Hugs has problems with the casting tricks of the SuperCollider wrapper
haskore@henning-thielemann.de**20060331075234] 
[Schedule: new module for running IO actions according to a time table
haskore@henning-thielemann.de**20060331082211] 
[Basic.Schedule: threadDelay seems to wait one tick too long, manually reduced waiting time
haskore@henning-thielemann.de**20060402204241] 
[SuperCollider.Play: use multiSet method instead of multiple set
haskore@henning-thielemann.de**20060402205048] 
[SuperCollider.Play: separated Example module
haskore@henning-thielemann.de**20060402222819] 
[SuperCollider: added server startup code to the Makefile
haskore@henning-thielemann.de**20060402223044] 
[SuperCollider.Performance: new module extracted from SuperCollider.Play
haskore@henning-thielemann.de**20060403095948] 
[SuperCollider.Play: open the network file handle only once per performance
haskore@henning-thielemann.de**20060403103308] 
[SuperCollider.InstrumentMap added
haskore@henning-thielemann.de**20060403132845] 
[TimeOrderedList: splitByTime, flatten, mapCoincident
haskore@henning-thielemann.de**20060403150146] 
[Performance: better support for trailing rests
haskore@henning-thielemann.de**20060403173713] 
[SuperCollider.Play: playing now also includes the trailing rest
haskore@henning-thielemann.de**20060403174220] 
[SuperCollider.Example: more complex example based on Rhythmic music with custom instruments
haskore@henning-thielemann.de**20060403211448] 
[CSound.Note: Pitch is wrapped with Maybe
haskore@henning-thielemann.de**20060404101502] 
[TimeOrderedList: split into TimeOrderedList and TimeOrderedListPad
haskore@henning-thielemann.de**20060404110708] 
[Notes: some remarks on GHC-6.4.1, generalized instruments
haskore@henning-thielemann.de**20060404111404] 
[Music.Format -> Process.Format
haskore@henning-thielemann.de**20060404111958] 
[SuperCollider.Example: add drum sounds and rhythm
haskore@henning-thielemann.de**20060404124122] 
[Haskore.cabal: included SuperCollider interface
haskore@henning-thielemann.de**20060411164658] 
[adapted files to extra wishes of the unlit invoked by 'Setup.lhs haddock'
haskore@henning-thielemann.de**20060411220129
 
 expanded TABs to spaces
 replaced some blank lines by > sign
 
] 
[attach interpreter info to Setup
haskore@henning-thielemann.de**20060412110339] 
[only import modules from the hierarchy
haskore@henning-thielemann.de**20060412110848] 
[Cabal: added test suite as executable
haskore@henning-thielemann.de**20060412111224] 
[HCAR article updated for 2006 spring issue
haskore@henning-thielemann.de**20060421142212] 
[TimeList: mapBody, mapTime, FunctorM instance added
haskore@henning-thielemann.de**20060502181715] 
[adapt to changes in SuperCollider.UId
haskore@henning-thielemann.de**20060520185136] 
[Utility.splitInit added, roundDiff generlized to Integral types
haskore@henning-thielemann.de**20060520185337] 
[Schedule: added routines which always check system time in order to keep in sync
haskore@henning-thielemann.de**20060520190630] 
[update Readme
haskore@henning-thielemann.de**20060712122234] 
[remove Shell module and import it from the new ShellPipe package
haskore@henning-thielemann.de**20060719080035] 
[adapt to recent changes in the SuperCollider wrapper Hsc
haskore@henning-thielemann.de**20060828091540] 
[example song: Heute wollen wir das Rnzlein schnren
haskore@henning-thielemann.de**20060914183906] 
[Raenzlein: added chord accompaniment
haskore@henning-thielemann.de**20060914190810] 
[SuperCollider interface: adapt to Sound.SC3 module naming scheme
haskore@henning-thielemann.de**20060916144147] 
[IO: use 'bracket' for file access
haskore@henning-thielemann.de**20060922134745] 
[MonadParser, MIDI.Load: replaced parser monad by a State transformer on top of Maybe
haskore@henning-thielemann.de**20060929123214] 
[Readme: how to start a SuperCollider example
haskore@henning-thielemann.de**20061108135731] 
[NOTES: flexible instruments are implemented now
haskore@henning-thielemann.de**20061110210218] 
[Schedule: split into modules Timer and Timer.Thread
haskore@henning-thielemann.de**20061112002416
 
 moved TimeList specific parts to TimeOrderedList and TimeOrderedListPad
] 
[Timer: made waitUntil a generic routine
haskore@henning-thielemann.de**20061112095811] 
[Timer.wait with Integer number of microseconds implemented by repeated waitInt
haskore@henning-thielemann.de**20061112103840] 
[Timer.Posix: timer based on Unix' sleep, it is as inaccurate as threadDelay though
haskore@henning-thielemann.de**20061112112107] 
[Chord interval-pitch conversions: eliminated 'head' by case handling
haskore@henning-thielemann.de**20061117084528] 
[Utility.headWithDefault: reduces usage of 'head', which is a partial function
haskore@henning-thielemann.de**20061117090106] 
[TimeList: add runTimeStamp
haskore@henning-thielemann.de**20061205072239
 
 runTimeStamp passes the favorized execution time to the action
 
 generalized schedule functions to IO like monads
 in appreciation to UDPMonad
] 
[SuperCollider: play music with time-stamped messages, this does still not work as expected
haskore@henning-thielemann.de**20061205072818] 
[MonadParser: module removed
haskore@henning-thielemann.de**20061205074842] 
[moved untilM to Haskore.General.Monad
haskore@henning-thielemann.de**20061205080712] 
[LoopTreeRecursive: use MonadState class instead of fixed State type
haskore@henning-thielemann.de**20061227230947] 
[Graph: generalizes LoopTrees by a sharing mechanism
haskore@henning-thielemann.de**20061228110443] 
[LoopTree*: trees have branches, not nodes
haskore@henning-thielemann.de**20061228141526] 
[TagDictionary: manage branch points in a graph
haskore@henning-thielemann.de**20061228141816] 
[RhyMusic.noteFromMelodyNote allows conversion from melodies with arbitrary attributes to rhythmic music
haskore@henning-thielemann.de**20061229195527] 
[RhyMusic.fromMelody -> RhyMusic.fromStdMelody
haskore@henning-thielemann.de**20061229201147] 
[RhyMusic.fromMelody added, converts from general melodies
haskore@henning-thielemann.de**20061229202850] 
[SuperCollider.Performance: simplified eventsFromNotes
haskore@henning-thielemann.de**20070103211324] 
[TimeList.runTimeStampGrouped: groups after quantization and thus avoids ordering errors by SuperCollider
haskore@henning-thielemann.de**20070103213309] 
[TimeList.runTimeStampGrouped passes the original times to the event actions
haskore@henning-thielemann.de**20070103231804] 
[perform formatting test with GHC because Hugs seems to convert our binary MIDI files to UTF-8
haskore@henning-thielemann.de**20070104112858] 
[MIDI files: use [Word8] instead of String
haskore@henning-thielemann.de**20070104113912] 
[SuperCollider.Play: adapt to multi-parameter messages s_new, n_set
haskore@henning-thielemann.de**20070128193522] 
[IdGenerator: different implementations for testing
haskore@henning-thielemann.de**20070129084357] 
[SuperCollider.InstrumentMap/Note: unliterated
haskore@henning-thielemann.de**20070129085616] 
[SuperCollider.InstrumentMap: more sophisticated table of instrument names and SuperCollider graphs
haskore@henning-thielemann.de**20070129100657] 
[SuperCollider.InstrumentMap: simplified construction of associations
haskore@henning-thielemann.de**20070129110835] 
[SuperCollider.InstrumentMap: added support for drums
haskore@henning-thielemann.de**20070130093954] 
[SuperCollider: use new instrument map with parameters
haskore@henning-thielemann.de**20070130100322] 
[HCAR article updated for 2006 autumn issue
haskore@henning-thielemann.de**20070315063711] 
[SuperCollider.InstrumentMap, Example: simplifications
haskore@henning-thielemann.de**20070315082310] 
[Notes: SuperCollider.InstrumentMap
haskore@henning-thielemann.de**20070315084201] 
[SuperCollider.InstrumentMap: type synonym for tables of instruments without parameters
haskore@henning-thielemann.de**20070315085101] 
[CSound.SoundMap: copy of SuperCollider.InstrumentMap, allows instrument with parameters
haskore@henning-thielemann.de**20070315095338] 
[CSound.Tutorial: test voice (phoneme) signal generator
haskore@henning-thielemann.de**20070315095603] 
[SuperCollider.InstrumentMap: in accordance with CSoundTutorial support instruments with 4 parameters
haskore@henning-thielemann.de**20070315095913] 
[example song: Heut ist ein besondrer Tag
haskore@henning-thielemann.de**20070315100106] 
[CSound.Tutorial -> CSound.TutorialCustom
haskore@henning-thielemann.de**20070317102936] 
[CSound.Tutorial re-added with less custom code
haskore@henning-thielemann.de**20070317103940] 
[CSound.Tutorial: removed custom code
haskore@henning-thielemann.de**20070317111723] 
[CSound.Instr: replaced by newtype Instrument
haskore@henning-thielemann.de**20070317150639] 
[CSound.SoundMap: make noteDur a parameter of InstrumentSigExp
haskore@henning-thielemann.de**20070317152650] 
[CSound.SoundMap: creation of InstrBlock taken from Tutorial
haskore@henning-thielemann.de**20070317194442] 
[CSound.Orchestra: more efficient and clean handling of global signals
haskore@henning-thielemann.de**20070317195104] 
[CSound.Orchestra: build orchestra file in a line oriented manner
haskore@henning-thielemann.de**20070317213224] 
[MidiFile: converted ControlNum to an enumeration
haskore@henning-thielemann.de**20070318105530] 
[MIDI: turn Program, Channel, Pitch, Velocity from Int to types with range checking constructors
haskore@henning-thielemann.de**20070318135709] 
[MidiNote: order of fields adapted to CSound.Note and SuperCollider.Note
haskore@henning-thielemann.de**20070318202936] 
[Test: show numbers of atomic tests if requested
haskore@henning-thielemann.de**20070318205800] 
[TimeList: avoid 'head' by 'case'
haskore@henning-thielemann.de**20070318210109] 
[TimeList: 'case' -> listToMaybe
haskore@henning-thielemann.de**20070318212725] 
[Notes: instrument maps
haskore@henning-thielemann.de**20070319070922] 
[Parser: module re-added, re-introduce 'force' for more laziness on parsing
haskore@henning-thielemann.de**20070521062021] 
[SuperCollider: adapt to Transport type class
haskore@henning-thielemann.de**20070625064543] 
[SuperCollider.Example: string sound with computed random values
haskore@henning-thielemann.de**20070625071456] 
[SuperCollider.Life: module for simplified life music performance
haskore@henning-thielemann.de**20070630180850] 
[Makefile: try to start JACK in a real-time-proof manner
haskore@henning-thielemann.de**20070630181249] 
[SuperCollider.InstrumentMap: factor out parameter handling - withXParameters
haskore@henning-thielemann.de**20070701095257] 
[SuperCollider.scheduleMusic -> performance
haskore@henning-thielemann.de**20070701102635] 
[SuperCollider.Life -> InstallPlay
haskore@henning-thielemann.de**20070703081544] 
[SuperCollider.Life: re-added with functions that work immediately in the IO monad
haskore@henning-thielemann.de**20070703091306] 
[SuperCollider.Life: support global effects on instruments
haskore@henning-thielemann.de**20070705081952] 
[SuperCollider.Life: interactive playing of tones
haskore@henning-thielemann.de**20070705095208] 
[SuperCollider.Life.playKeyboard: show names of played notes
haskore@henning-thielemann.de**20070705100829] 
[Process.Format: separate functions for formatting notes and rests
haskore@henning-thielemann.de**20070706151110] 
[Interface.MED.Text: import print-out from OctaMED
haskore@henning-thielemann.de**20070706152054] 
[SuperCollider.Life: bass for Air song
haskore@henning-thielemann.de**20070706162618] 
[SuperCollider.Life: fixed handling of velocities
haskore@henning-thielemann.de**20070707152910] 
[SuperCollider.Music.mapDurNote added, map a note inclusively of its duration
haskore@henning-thielemann.de**20070707210950] 
[SuperCollider.Life.air: with global effects, rhythm, melody
haskore@henning-thielemann.de**20070707211709] 
[SuperCollider.Performance: use type synonym
haskore@henning-thielemann.de**20070707213207] 
[SuperCollider.Life: factor out Example.Air and Play.Channel
haskore@henning-thielemann.de**20070708111805] 
[SuperCollider.Play.Channel: distinct InstrumentParameters and DrumParameters types
haskore@henning-thielemann.de**20070708114944] 
[SuperCollider.InstallPlay -> SuperCollider.Play.Install
haskore@henning-thielemann.de**20070708115848] 
[SuperCollider.Play.Install: Channel management moved to several small modules
haskore@henning-thielemann.de**20070708173230] 
[SuperCollider.Play.melody: add 'out' UGen to instrument
haskore@henning-thielemann.de**20070708173949] 
[SuperCollider.Example.Air: xylophone, new chords
haskore@henning-thielemann.de**20070708181153] 
[SuperCollider.Example.Air: random pikes in introduction
haskore@henning-thielemann.de**20070708194659] 
[MIDI.Render: play by Timidity with JACK
haskore@henning-thielemann.de**20070709091026] 
[SuperCollider.Air: simplified chords at the end
haskore@henning-thielemann.de**20070715153407] 
[Makefile, start of Jack&SuperCollider: sudo should be applied outside 'make'
haskore@henning-thielemann.de**20070715153828] 
[Readme: how to start Jack&SuperCollider
haskore@henning-thielemann.de**20070715154047] 
[HCAR article updated for 2007 spring issue; mainly references to other projects were removed
haskore@henning-thielemann.de**20070715154403] 
[Timer.Immediate: a timer that doesn't wait and can be used for non-real-time application
haskore@henning-thielemann.de**20070715170339] 
[SuperCollider.Play: the final stop message is also send with a time stamp
haskore@henning-thielemann.de**20070715172417] 
[Timer.waitUntilSeconds added
haskore@henning-thielemann.de**20070721112153] 
[Timer.getClockTime: turned into a method of the Timer record
haskore@henning-thielemann.de**20070721121141] 
[SuperCollider.Play: the installation of sounds is also send as message in the performance
haskore@henning-thielemann.de**20070721164253] 
[SuperCollider.Play: prepend initial 'reset' message to the stream of messages
haskore@henning-thielemann.de**20070808151158] 
[Haskore.cabal: use supercollider-ht package
haskore@henning-thielemann.de**20070810154727] 
[SuperCollider: adapt to recent changes in hsc3
haskore@henning-thielemann.de**20070812181155] 
[SuperCollider.Example.glissando: soften reverb
haskore@henning-thielemann.de**20070814080209] 
[SuperCollider.Play.melody: generate a lazy list of OSC messages instead of writing them to a file immediately
haskore@henning-thielemann.de**20070814081842] 
[SuperCollider.Example.glissandoToFile: render audio file for the glissando example
haskore@henning-thielemann.de**20070814082137] 
[SuperCollider.Play: separate initialization (synchronous) and playing phase (asynchronous)
haskore@henning-thielemann.de**20070816104856] 
[SuperCollider.Example.glissando: 'lag' is the right choice for smoothening the frequency control
haskore@henning-thielemann.de**20070816123656] 
[SuperCollider.Play: use Score data type for both kinds of music (melody and general music)
haskore@henning-thielemann.de**20070816144411] 
[SuperCollider.Schedule: module extracted from Play for generation of collections of OpenSoundControl messages for a SuperCollider performance
haskore@henning-thielemann.de**20070817080327] 
[SuperCollider, MIDI.Render, CSound: rhyMusic -> rhythmicMusic, make NoParam variant the default one
haskore@henning-thielemann.de**20070817103845
 
 SuperCollider.InstrumentMap -> SoundMap
] 
[SuperCollider.Schedule: generate schedules for rhythmic music
haskore@henning-thielemann.de**20070817165949] 
[SuperCollider.Render: support for non-realtime synthesis
haskore@henning-thielemann.de**20070817175427] 
[SuperCollider.Example: provide schedules for all examples, thus they can be rendered to disk
haskore@henning-thielemann.de**20070817183812] 
[SuperCollider.Example.strings: lfSaw allows start phases different from zero, random phases eliminate strong attack of the string sound
haskore@henning-thielemann.de**20070817185139] 
[SuperCollider: allocate unique NodeId for global effects
haskore@henning-thielemann.de**20070818204110] 
[SuperCollider: factor out handling of instruments with and without parameters from Schedule.fromMusic
haskore@henning-thielemann.de**20070819184657] 
[SuperCollider.Schedule.Install+Channel: create schedules from songs without sound maps, similar to the Play/* modules
haskore@henning-thielemann.de**20070820094609] 
[SuperCollider.Life -> SuperCollider.Play.Life
haskore@henning-thielemann.de**20070821063538] 
[SuperCollider.Schedule.fromMusicGlobalEffect: make it working
haskore@henning-thielemann.de**20070821091317
 
 separate attachment of UGen parameters and output channel assignment
 avoid cascaded application of SCIO.replaceOut and SCIO.out
] 
[SuperCollider.Schedule.fromRhythmicMusicSoundEffects: allows instrument specific effects for common rhythmic musics
haskore@henning-thielemann.de**20070822124539] 
[SuperCollider: fixed import and export lists
haskore@henning-thielemann.de**20070823093332] 
[Utility.splitBy: implement using segmentBefore, because we relied on a particular implementation of groupBy which may change
haskore@henning-thielemann.de**20070830070821] 
[SuperCollider.Example: capitalized file names
haskore@henning-thielemann.de**20070909111437] 
[SuperCollider.Example: explicitly clip signal
haskore@henning-thielemann.de**20070909111837
 
 We must clip in order to prevent wrap-around high values when writing to an Int16 file.
 Respect unconventionial parameter order of clip2
] 
[PlayCSoundExamples.sh: keep the rendered songs
haskore@henning-thielemann.de**20070910083439] 
[Performance.Fancy, Default: provide conversions from music to performance with default parameters
haskore@henning-thielemann.de**20070910133152
 
 turn more RhyMusic into RhythmicMusic
] 
[Performance.fromMusic with initial changes on the context
haskore@henning-thielemann.de**20070910142946] 
[Haskore.cabal: more details
haskore@henning-thielemann.de**20070910161604] 
[Basic.Duration: new module for definition of note durations and formatting
haskore@henning-thielemann.de**20070911095710] 
[AutoTrack.Rhythm.withDrum, withMusic: switched parameter order
haskore@henning-thielemann.de**20070912082937] 
[Haskore.Composition: new directory for composition support
haskore@henning-thielemann.de**20070912095841] 
[Readme: explain usage of SuperCollider.playKeyboard
haskore@henning-thielemann.de**20070913101641] 
[SuperCollider.SoundMap: use a phantom type parameter for distinction of Instrument and Drum
haskore@henning-thielemann.de**20070913102152
 
 now we need only one version of most instrument functions while maintaining type safety
] 
[SuperCollider: unify more *Instr* and *Drum* function pairs to *Sound* functions
haskore@henning-thielemann.de**20070913190720] 
[SuperCollider.Schedule.Install,Channel: custom Environment type  Channel: automatic reservation of the channels for the audible output
haskore@henning-thielemann.de**20070913202936] 
[ContextFreeGrammar: use maximumKey
haskore@henning-thielemann.de**20070916075413] 
[Media: note on FunctorM -> Traversable
haskore@henning-thielemann.de**20070916081543] 
[SuperCollider.Performance.eventsFromNotes: try a different approach, which does not need Either
haskore@henning-thielemann.de**20070916192915] 
[SuperCollider.Performance: support instruments with duration dependent sound
haskore@henning-thielemann.de**20070916200745
 
 This alone is not of much use,
 because the example sounds we have dependent both on duration and on overlap,
 but overlap is still specified as tempo dependent 'legato'.
] 
[revised Notes and discussion of earlier modifications
haskore@henning-thielemann.de**20070923133738] 
[ShellPipe -> shell-pipe
haskore@henning-thielemann.de**20070930111552] 
[TimeListPad.append, concat: added
haskore@henning-thielemann.de**20070930162301] 
[Performance: replace State monad by Reader monad
haskore@henning-thielemann.de**20070930163631
 
 Actually we don't even need Monad functionality but only Applicative
] 
[fancy player: split handling of several types of phrases
haskore@henning-thielemann.de**20070930171623] 
[Media.fold*Flat -> switch*
haskore@henning-thielemann.de**20071002091550] 
[Medium.Controlled, Medium.LabeledControlled: types of media which integrate functionality which was added by Music so far
haskore@henning-thielemann.de**20071002092941] 
[Music: use Medium.Controlled as basis for the Music datatype
haskore@henning-thielemann.de**20071003202849] 
[Optimization of controllers: use partitionMaybe and cumulation of controllers
haskore@henning-thielemann.de**20071003211734] 
[ContextFreeGrammer for Medium.Controlled: re-use functions from the corresponding module for plain Medium
haskore@henning-thielemann.de**20071004093048] 
[Music.filter, partition, partitionMaybe added
haskore@henning-thielemann.de**20071005085032] 
[TimeList: filter, partition, foldr
haskore@henning-thielemann.de**20071019102354] 
[Performance: preserve rests temporarily in order to make conversion to Performance more lazy
haskore@henning-thielemann.de**20071019103133
 
 This allows certain recursive musics like
  mel = a 0 wn () +:+ b 1 wn ()  =:=  rest qn +:+ mel
] 
[CSound, SuperCollider: distinguish between Parameter and Attribute
haskore@henning-thielemann.de**20071020160227
 
 Parameters are frequency, velocity, duration
 Attributes are optional information
 
 replace Parameter by Attribute in many identifiers,
 especially SuperCollider.Note.fromRhyNoteNoParam
] 
[SuperCollider.SoundMap: turn the Sound type from a pure black box into a function which maps a parameter black box to a UGen
haskore@henning-thielemann.de**20071020162828
 
 Currently parameters in the parameter black box cannot be modified and
 thus it is safely implemented as 'undefined' :-)
] 
[SuperCollider.SoundMap: equip InstrumentParameters and DrumParameters with values
haskore@henning-thielemann.de**20071020180727
 
 SoundParameter class added
] 
[TimeOrderedList: use event-list package
haskore@henning-thielemann.de**20071021101533] 
[TimeOrderedList, MIDI: use EventList abstractions, avoid constructors
haskore@henning-thielemann.de**20071024140221] 
[SuperCollider: use EventList abstractions, avoid constructors
haskore@henning-thielemann.de**20071025195910] 
[Performance: use EventList abstractions, avoid constructors
haskore@henning-thielemann.de**20071026102626] 
[Performance: remove SchedEvent type synonym for more abstraction
haskore@henning-thielemann.de**20071026133756] 
[CSound.Score: use EventList abstractions, avoid constructors
haskore@henning-thielemann.de**20071026141526] 
[TimeList: hide Event structure
haskore@henning-thielemann.de**20071026143003] 
[TimeList: hide list structure
haskore@henning-thielemann.de**20071103214616] 
[SuperCollider: automated tests
haskore@henning-thielemann.de**20071103220036] 
[Player: use TimeListPad.map* functions
haskore@henning-thielemann.de**20071104094650] 
[TimeListPad: hide list structure
haskore@henning-thielemann.de**20071109075626] 
[TimeList.segmentBefore: re-added because it doesn't fit into EventList package
haskore@henning-thielemann.de**20071109102929] 
[MidiRead.prepareTrack avoids code duplication
haskore@henning-thielemann.de**20071109104017] 
[TimeOrderedList: custom data structure for event lists with absolute time stamps
haskore@henning-thielemann.de**20071110170549] 
[TimeOrderListPad: no longer use TimeOrderedList.runCore, put more service into TimeOrderedList.runCore for the TimeOrderedList.run functions
haskore@henning-thielemann.de**20071110171435] 
[SuperCollider.Example.Morph for Abi95 video
haskore@henning-thielemann.de**20071115224120] 
[HCAR article updated for 2007 autumn issue
haskore@henning-thielemann.de**20071128144633] 
[adapt to event-list-0.0.4:
haskore@henning-thielemann.de**20071203080618
 
 distinct types for relative and absolute event lists
 type for non-negative values
 SuperCollider.Note without type parameter
] 
[Duration.T: turn into a NonNegative.Wrapper.Rational
haskore@henning-thielemann.de**20071203201635] 
[extracted MIDI definitions to a separate package and import it
haskore@henning-thielemann.de**20071204132610] 
[General.MIDI: extracted and imported from package 'midi'
haskore@henning-thielemann.de**20071204154950] 
[Test suite: use Random instance of GeneralMIDI.Instrument and GeneralMIDI.Drum
haskore@henning-thielemann.de**20071204155551] 
[notes on local effects
haskore@henning-thielemann.de**20071204160229] 
[adapt to midi-0.0.3: NonNeg.Integer values for MIDI times
haskore@henning-thielemann.de**20071205113556] 
[MarkovChain: extracted into separate package and imported
haskore@henning-thielemann.de**20071207111123] 
[adapt to non-negative package
haskore@henning-thielemann.de**20071212151911] 
[Performance.Fancy: defltMap -> fancyMap, was a copy&paste mistake
haskore@henning-thielemann.de**20071212202223] 
[Guitar: replaced negative durations by values of type Duration.Offset, added this type to Duration
haskore@henning-thielemann.de**20071212203658] 
[use EventList.fromPairList, toPairList
haskore@henning-thielemann.de**20071221100014] 
[Basic.Dynamics added
haskore@henning-thielemann.de**20071221102007] 
[update package dependencies to SuperCollider packages 0.1 from Hackage and supercollider-ht with Transport.File
haskore@henning-thielemann.de**20080220162658] 
[replace Shell.launch by System.Process.runInteractiveProcess
haskore@henning-thielemann.de**20080221035042] 
[General.ShellPipe: separate module for calling shell commands with pipe connection, because Hugs has no System.Process
haskore@henning-thielemann.de**20080221042657] 
[Makefile.ghci: check package dependencies with Cabal
haskore@henning-thielemann.de**20080221133344] 
[Notes: problem with MIDI notes with overlap
haskore@henning-thielemann.de**20080221153914] 
[Data.FunctorM -> Data.Traversable using GHC-6.4 compatibility package
haskore@henning-thielemann.de**20080226093726] 
[make Medium data types instances of Traversable, Foldable, Functor
haskore@henning-thielemann.de**20080226094532] 
[Performance.sequenceReader based on Traversable.sequenceA
haskore@henning-thielemann.de**20080226102336] 
[Media -> Medium
haskore@henning-thielemann.de**20080226105825] 
[AirMain for stand-alone executable
haskore@henning-thielemann.de**20080226133234] 
[SuperCollider.Play.Life.germanKeyboard: replace umlauts by escape codes
haskore@henning-thielemann.de**20080226143553
 however the keyboard input will be broken, if the umlauts in the terminal are encoded differently as in the program code
] 
[SuperCollider.Play: wait for response on _every_ synchronous message
haskore@henning-thielemann.de**20080226144139] 
[Cabal-1.2 configuration which works on both GHC 6.4.1 and 6.8.2
haskore@henning-thielemann.de**20080226144837] 
[version ranges for package dependencies
haskore@henning-thielemann.de**20080310201407] 
[Example.Raenzlein -> Cabal
haskore@henning-thielemann.de**20080404152113] 
[StdMelody: list of 'NoteAttribute's converted to 'NoteAttributes' record with Accessor functions
haskore@henning-thielemann.de**20080404163327] 
[StdMelody.fromMelodyIgnoreAttr restricted to () attribute type
haskore@henning-thielemann.de**20080406132556] 
[Melody.Note record with Accessor functions
haskore@henning-thielemann.de**20080406133021] 
[fromMelodyIgnoreAttr -> fromMelodyNullAttr
haskore@henning-thielemann.de**20080406135958] 
[crescendo, diminuendo: additive change independent from current dynamics
haskore@henning-thielemann.de**20080406141713
 
 this poses problems with non-negative type and must still be fixed
] 
[loudness -> loudness1 in appreciation of zero-based logarithmically scaled notion of velocity
haskore@henning-thielemann.de**20080406142355] 
[pairMap -> mapPair; mapFst, mapSnd added
haskore@henning-thielemann.de**20080406161338] 
[Performance: separate type variables for time and dynamics, since time is non-negative and dynamics can be negative in future
haskore@henning-thielemann.de**20080407082006] 
[MIDI.Render: play via pmidi and ALSA
haskore@henning-thielemann.de**20080407093109] 
[Player: moved default and fancy player definitions to respective modules
haskore@henning-thielemann.de**20080407102928] 
[Music.StdLoudness removed
haskore@henning-thielemann.de**20080407104159] 
[HCAR article updated for 2008 spring issue
haskore@henning-thielemann.de**20080428144628] 
[Notes on different design of music
haskore@henning-thielemann.de**20080411163011] 
[Revised new design of music, drop performance context
haskore@henning-thielemann.de**20080411170621] 
[SuperCollider.Example.bassDrumNoisy: improved bass drum sound
haskore@henning-thielemann.de**20080531185739] 
[SuperCollider.Play: hints about synchronous messages
haskore@henning-thielemann.de**20080531190416] 
[Example.Detail: randomized chord pattern with controlable level of details
haskore@henning-thielemann.de**20080619094625] 
[Makefile: jack-stop, supercollider-stop
haskore@henning-thielemann.de**20080626053750] 