Copperbox revision 3034.
I've added a new note list fragment builder (Legato) that improves on Advance.
Although Advance is conceptually fairly simple, it is not so musically useful. Because it places events end-to-end it cannot account for staccato phrases - notes sounding for shorter than their notated durations - and legato / sostenuto phrases - notes sustained for longer than their notated duration. Despite being called Legato (for want of a name) the new fragment builder enables both.
Wednesday, November 27, 2013
majalan
Copperbox revision 3033.
I've changed the representation of PchEvent to be a function : pitch x duration -> Event rather than pitch -> Event. This eliminates yesterday's worry about needing a DrnEvent (now unnecessary) and allows a fairly consistent note list style if I use the redundant note combinator.
I've changed the representation of PchEvent to be a function : pitch x duration -> Event rather than pitch -> Event. This eliminates yesterday's worry about needing a DrnEvent (now unnecessary) and allows a fairly consistent note list style if I use the redundant note combinator.
Tuesday, November 26, 2013
majalan
Copperbox revision 3032.
I've implemented trill as a combinator rather than a so called - by me - "constructor". Also I've tidied up Demo02 a little.
I'm wondering if Majalan needs object DrnEvent (wrapping : duration -> Event) as a intermediary between PchEvent > DrnEvent > Event. The chordal and trill combinators already use an unwrapped version and the unwrapped-ness adds clutter to user code.
I've implemented trill as a combinator rather than a so called - by me - "constructor". Also I've tidied up Demo02 a little.
I'm wondering if Majalan needs object DrnEvent (wrapping : duration -> Event) as a intermediary between PchEvent > DrnEvent > Event. The chordal and trill combinators already use an unwrapped version and the unwrapped-ness adds clutter to user code.
Monday, November 25, 2013
majalan
Copperbox revision 3031.
I've added a PchEvent object (a newtype wrapped function : pitch -> Event) and implemented chordal as a combinator. PchEvent should allow other combinators for trills, arpeggios etc. and solve the scaling problem of the previous post.
I've added a PchEvent object (a newtype wrapped function : pitch -> Event) and implemented chordal as a combinator. PchEvent should allow other combinators for trills, arpeggios etc. and solve the scaling problem of the previous post.
majalan
Copperbox revision 3030.
First attempt at trills.
It looks like the idiom used yesterday for chords (defining a new event constructor) isn't really going to be scalable once I start to account for chords, trills, arpeggios etc. It looks like I am going to need a special version of Event for pitched events...
First attempt at trills.
It looks like the idiom used yesterday for chords (defining a new event constructor) isn't really going to be scalable once I start to account for chords, trills, arpeggios etc. It looks like I am going to need a special version of Event for pitched events...
Sunday, November 24, 2013
majalan
Copperbox revision 3029.
First test of chords in a score. At the moment I define an second chord version of an instrument's event constructor - as pitch is one parameter out of several for an instrument (in some cases instruments may even be unpitched) I'm not sure a can write a chord combinator that takes an event and applies it to a list of pitches.
First test of chords in a score. At the moment I define an second chord version of an instrument's event constructor - as pitch is one parameter out of several for an instrument (in some cases instruments may even be unpitched) I'm not sure a can write a chord combinator that takes an event and applies it to a list of pitches.
Friday, November 22, 2013
majalan
Copperbox revision 3027.
I've updated chord construction to use major and minor triads plus chord transformers (removing further chord constructors). My current reading of Francois Pachet's paper makes me believe I can implement the chord grammar with just the initial two constructors (M | m triads) plus a bag of transformers.
The module is still incomplete though, I need to do some research to fill out the lexicon of chord and interval names.
I've updated chord construction to use major and minor triads plus chord transformers (removing further chord constructors). My current reading of Francois Pachet's paper makes me believe I can implement the chord grammar with just the initial two constructors (M | m triads) plus a bag of transformers.
The module is still incomplete though, I need to do some research to fill out the lexicon of chord and interval names.
Thursday, November 21, 2013
majalan
Copperbox revision 3026.
I've switched Chords to use a representation that allows manipulation. This means I should be able to implement something close to Francois Pachet's chord building grammar, the stumbling block at the moment is differentiating which of Pachet's functions are chord constructors and which are chord transformers.
I've switched Chords to use a representation that allows manipulation. This means I should be able to implement something close to Francois Pachet's chord building grammar, the stumbling block at the moment is differentiating which of Pachet's functions are chord constructors and which are chord transformers.
majalan
Copperbox revision 3025.
I've added initial work building chords. The current representation will be insufficient to represent the Pachet chord building grammar (Francois Pachet - An Object-Oriented Representation of Pitch-Classes, Intervals, Scales and Chords), so likely it will need revising.
Also, I've fixed a long-standing, unnoticed bug with adding intervals to pitches. I seems hard (for me) to keep track of octaves in an (octave x Z12) pitch representation for equal temperament - much easier to go via in integer representation that corresponds to MIDI pitch values.
I've added initial work building chords. The current representation will be insufficient to represent the Pachet chord building grammar (Francois Pachet - An Object-Oriented Representation of Pitch-Classes, Intervals, Scales and Chords), so likely it will need revising.
Also, I've fixed a long-standing, unnoticed bug with adding intervals to pitches. I seems hard (for me) to keep track of octaves in an (octave x Z12) pitch representation for equal temperament - much easier to go via in integer representation that corresponds to MIDI pitch values.
Sunday, November 17, 2013
majalan
Copperbox revision 3024.
Initial work on a new example.
I intend that the new example should be somewhat musical, so I've been testing the builtin Csound instruments. I've found three from the STK collection that I think I like enough, though they could do with some tweaking. Also I'll have to establish the gamut in which they sound good enough for composition - synthesized sounds seem to have a disappointingly small range over which they sound attractive.
Also I've corrected a long standing bug in the formatting of the score output. A mix up of the pretty print combinators hcat and hsep.
Initial work on a new example.
I intend that the new example should be somewhat musical, so I've been testing the builtin Csound instruments. I've found three from the STK collection that I think I like enough, though they could do with some tweaking. Also I'll have to establish the gamut in which they sound good enough for composition - synthesized sounds seem to have a disappointingly small range over which they sound attractive.
Also I've corrected a long standing bug in the formatting of the score output. A mix up of the pretty print combinators hcat and hsep.
Wednesday, November 13, 2013
majalan
Copperbox revision 3023.
I've added some elementary concat combinators. At the moment there is a name clash between the Event and EventList modules, though I don't know whether I want to resolve it with a typeclass or favour EventList.
I haven't tested concatenation yet, but I'm concerned ImpulseMaps won't do the right thing...
I've added some elementary concat combinators. At the moment there is a name clash between the Event and EventList modules, though I don't know whether I want to resolve it with a typeclass or favour EventList.
I haven't tested concatenation yet, but I'm concerned ImpulseMaps won't do the right thing...
Tuesday, November 12, 2013
Monday, November 11, 2013
majalan
Copperbox revision 3021.
I've properly implemented bracket and processors in Majalan2. This means processors - e.g filters, delay, etc. - can be applied to event lists without knowing the details of onset and duration in the score (Majalan calculates these).
Also I've added LICENSE, cabal and Setup files so Cabal will build the Haddock docs.
I've properly implemented bracket and processors in Majalan2. This means processors - e.g filters, delay, etc. - can be applied to event lists without knowing the details of onset and duration in the score (Majalan calculates these).
Also I've added LICENSE, cabal and Setup files so Cabal will build the Haddock docs.
Sunday, November 10, 2013
majalan
Copperbox revision 3020.
I've added a module Shim.CSD to create Csound CSD files and to run them as a process. This means Majalan2 finally makes a sound.
At some point the Shim layer should provide a single module import for all the "user" functionality in Majalan.Core.
I've added a module Shim.CSD to create Csound CSD files and to run them as a process. This means Majalan2 finally makes a sound.
At some point the Shim layer should provide a single module import for all the "user" functionality in Majalan.Core.
Saturday, November 9, 2013
majalan
Copperbox revision 3018.
I've moved all the "implementation" modules into Majalan.Core (majalan2) - this is a prelude to adding the Symbolic modules from the original Majalan.
Also, I've changed vertical concatenation of EventLists - vertical concat no longer concatenates ImpulseMaps, only the top impulse map is taken, the lower impulse map is dropped. This allows concatenation of EventLists with different typed ImpulseMaps (obviously) and avoids saturating the time line.
I've moved all the "implementation" modules into Majalan.Core (majalan2) - this is a prelude to adding the Symbolic modules from the original Majalan.
Also, I've changed vertical concatenation of EventLists - vertical concat no longer concatenates ImpulseMaps, only the top impulse map is taken, the lower impulse map is dropped. This allows concatenation of EventLists with different typed ImpulseMaps (obviously) and avoids saturating the time line.
Wednesday, November 6, 2013
majalan
Copperbox revision 3017.
I've changed the EventList accumulator to build both a Tree and an ImpulseMap rather than just a Tree.
In practice this will need some refining as I think I will need to allow impulse labels to have different types (for different "systems").
I've changed the EventList accumulator to build both a Tree and an ImpulseMap rather than just a Tree.
In practice this will need some refining as I think I will need to allow impulse labels to have different types (for different "systems").
majalan
Copperbox revision 3016.
I've extracted the TimeSpan code out of Majalan.Base into its own module. Also I've implemented retrograde on ImpulseMap.
At the moment I'm not sure where to store ImpulseMaps within the syntax tree, so although ImpulseMaps are now implemented they are unused.
I've extracted the TimeSpan code out of Majalan.Base into its own module. Also I've implemented retrograde on ImpulseMap.
At the moment I'm not sure where to store ImpulseMaps within the syntax tree, so although ImpulseMaps are now implemented they are unused.
Tuesday, November 5, 2013
majalan
Copperbox revision 3015.
I've redesigned ImpulseMap so it will support transformations. Scale and displacement are implemented, retrograde (reverse) is to do.
To allow a sensible retrograde, ImpulseMap needs a timespan (a frame). As the frame size isn't known until the Phrase or Advance group is built I need a separate data type ImpulseList to represent an ImpulseMap during its construction (before its frame size is known).
I've redesigned ImpulseMap so it will support transformations. Scale and displacement are implemented, retrograde (reverse) is to do.
To allow a sensible retrograde, ImpulseMap needs a timespan (a frame). As the frame size isn't known until the Phrase or Advance group is built I need a separate data type ImpulseList to represent an ImpulseMap during its construction (before its frame size is known).
Monday, November 4, 2013
Sunday, November 3, 2013
majalan
Copperbox revision 3013.
I've added an accumulating impulse map to the EventList structures - this should work in a similar manner to anchors in Wumpus (which in turn took them from TikZ).
I haven't yet tidied up the Answer type - a better thing to do looks like adding a general Writer-State monad instead. This should be a better opportunity to factor some code as all the EventList monads can be built with a Writer-State monad.
I've added an accumulating impulse map to the EventList structures - this should work in a similar manner to anchors in Wumpus (which in turn took them from TikZ).
I haven't yet tidied up the Answer type - a better thing to do looks like adding a general Writer-State monad instead. This should be a better opportunity to factor some code as all the EventList monads can be built with a Writer-State monad.
Subscribe to:
Posts (Atom)
Blog Archive
About Me
- Stephen Tetley
- Disambiguating biog as there are a few Stephen Tetley's in the world. I'm neither a cage fighter or yachtsman. I studied Fine Art in the nineties (foundation Bradford 1992, degree Cheltenham 1992 - 95) then Computing part-time at Leeds Met graduating in 2003. I'm the Stephen Tetley on Haskell Cafe and Stackoverflow.