Redistributing Core Module Responsibilities
Much of the responsibility distribution to core modules took place during the very early days of the program. With time, many problems related to the expansion and improvement of core module capabilities have cropped up. With the recent creation of the first coordination module, the responsibilities of core modules can no longer go unexamined. Tasks must be redistributed, particularly between the structure and coordination modules.
Here's a proposed distribution:
There are only a few major changes immediately evident. Perhaps the largest change suggested by this scheme lies in the reallocation of part-instruction writing to the coordination modules. I feel that it makes a good bit more sense for the coordination module to handle, well, "coordinating" the playing time of the instruments. Furthermore, part allocation seems slightly less abstract than general structure molding, and I am trying to keep strictly to a method of working from higher-order, abstract structures down to the lower-order details.
The structure module, meanwhile, picks up the task of providing tempo, time signature, and meter data. Combined, these pieces of information make up what I feel to be the largest cavity in the current data structure, which provides for none of the aforementioned. Listeners may have noticed that all the samples to date have been rendered at a 100 BPM tempo. I feel that all of this information is absolutely crucial to the rest of the process. One certainly cannot adequately place effective accents or chords without knowing the time signature!
Finally, the above scheme proposes a minor change in order: coordination before progression. This idea came about as I toyed with schemes in which the coordination module provided time signature data - which would, of course, require the progression module to run after, rather than before it. Though I now believe that the structure module should handle the task of time signature writing, I still think this order swap is necessary. Chord-writing is essentially as close to real composition data as one can get without writing actual notes, which suggests placement immediately before the generative modules. Though the coordination and progression modules will, for now, remain independent of each other (neither utilizes the data provided by the other), I see this minor swap as a profitable one.
It is worth noting that, though the initial tempo instructions will be controlled by the structure module, all generative modules will, at some point in the future, have a method of overwriting tempo data. This is necessary, for example, for a composition written with only a single piano part. While the core modules would still handle most higher-order aspects, the generative module would need access to tempo data to sync the tempo with the piano playing in order to achieve realistic undulations in the tempo, which occur during human performances (especially in solos).