I've made some programs for generating microtonal music in the past - mostly 5-limit just intonation, with some limited forays into higher limits. I'm planning to write a much better program that can go up to 23-limit just intonation, and I'm planning out how it should represent music.
A piece will be made of musical sections.
Sections will be made of chord onset events, possibly with measure markers sprinkled in.
Chord onset events are made of notes/rests for multiple voices. I think a rest will be a different kind of object than a note, but maybe it'll just be a note with a special pitch. If a piece has 6 voices, maybe every chord onset event will have rests/notes listed for all six voices? I think so.
Notes have pitch and duration, and a property that tells you whether the note is voiced at the onset time veruss suspended from a previous note with the same pitch. I think notes will have pointers to the previous note in the same voice. Possibly they'll have pointers to the next note as well, so that a voice could be thought of as a double linked list of notes.
Sections are represented in terms of chord onset events, but that's not how they're composed/generated. Sections are composed from melodies. A secontion retains an edit history of the melodic addition events that were used to compose it.
I think adding melodic content will look like this - perhaps we'll call it a melodic or motivic occurence event:
Add (invert(Motive-X)), at time T2, in voice W)
"Invert" is a determinstic transform that generates a new melody from a given one. Deterministic transforms include [transpose, invert, reverse, augment rhythm (e.g. double note lengths), diminish rhythm].
There are also going to be transforms like "compose countermelody to a given melody, heavy in contrary motion". Maybe these can depend determinstically on a random seed value, so that composition can be variable but also reproducible. But I don't really see how. Maybe it's not important - the edit history can just include "compose counter melody // psst: here's the countermelody generated".
I think applying ornaments and diminutions will also be a deterministic affair. You can choose which ones to apply randomly in composition, but there has to be a history of edits that reproducibly generates the song. This will let you edit previously generated content at different levels of abstractions: you can change the ornaments, you can change the amount of transposition, maybe other things. This will mostly be used for doing things like this: The soprano gets a frilly bit while the middle voices are doing slow notes, maybe then a middle voice responds while the soprano has slow notes.
I haven't thought much about how to generate a response melody from a call melody, but that's as important as generating simultaenous countermelodies, and will have to be addressed.
I hope this will work. I think there's a chance that it will.
After composing adding enough motivic content enough we have a skeleton of chord onset events for all voices (or at least two successive chord onset events for all voices), then we'll have the option to try adding suspensions, passing tones, and neighbor notes in multiple voices simultaneously between those chords. I think these will still be applied in the melodic-addition edit history, from which chord-onset events are generated, but it will be convenient to have full voiced chords sequences to decide which extra notes can be used - which combinations make unacceptable dissonances, and which make bold but acceptable passing dissonances while moving between consonant chords.
Obviously I'm trying to design this so that it can make imitative counterpoint, but hopefully it will also be general enough to make many kinds of music.
No comments:
Post a Comment