To say that the new grammatical multi-state engine blows previous analysis engines clear out of the water is an understatement.
Here are a few of gMSE's numerous powerful features:
- Variable timescale analysis
- Adjustable quanta
- Adjustable grouping width
- Adjustable abstract counters
- Power-based reconstruction
- Single parameter controls variability
- Relative chord analysis
- Reads chord and key data from MIDI file
- Records words in offset form
- Records chord state data in parallel with the other analysis factors
- Reconstructed patterns behave differently based on the progression
- Absolute pitch analaysis
- Percussive instruments
- Disregards chord and key information
- Completely scalable and expandable analysis factors
- n-th order analysis
- Only limit on analysis factors is CPU time
- Simultaneous multi-track analysis
- Can perform analysis on an arbitrary number of tracks, storing information unique to each
- Represents the first multi-channel plugin ever to grace mGen's plugin library
- Great for multiple-hand piano parts, multiple-instrument auxiliary percussion, etc.
With gMSE having all of this power, it has become very clear to me that the bottlenecks in mGen are now the structure and progression modules which are both, at the moment, fixed in a 4/4 time signature. This glaring, repetitive time signature doesn't do justice to the aforementioned variable timescale capabilities. These two plugin types will be my next target for re-writing in c++. They will require expansion of the new mGN library to allow saving of complete MainBlock data, rather than just loading.
All in all, I'm very excited about gMSE's performance over the past week and have a strong feeling about its future as both a percussive and melodic plugin.
Last night, gMSE was put to use for the first time. The engine did a fantastic job and far exceeded my expectations! I used it to analyze several drum loops similar to those that GGrewve used as training material. The engine was able to reproduce the loops exactly.
Reproducing the loops may not seem like a big deal - since the same result could be achieved with a program that simply records the input pattern and spits it back out. But it's actually a huge triumph, because that's not how gMSE works. It breaks the pattern into small grammatical fragments, contextually analyzes each piece, and then reconstructs the pattern in the context of the composition. This method allows great flexibility in modifying the reconstruction of fragments.
Even more exciting is the fact that the reconstruction function takes one paramater - called power - that can be used to affect how much contextual score influences the output. Setting the function to a high power, such as 5 or 6, causes the input pattern to be reconstructed with no variation. A low power, like 1, causes the pattern to be very loosely reconstructed - with lots of (tasteful) variations. Numbers in between, like 2.5 or 3, tend to give a nice output pattern that isn't a replica of the input pattern, but doesn't go too crazy with variations. In effect, the entire "tightness" of the engine can be controlled with a single variable!
gMSE is also fast. Very fast. It performs a whole lot faster than I would have thought, considering how intensive the underlying MSE analysis is. At first, the engine was taking 7-8 seconds to generate all parts for a composition. After doing some serious optimizing of several core components of the MSE and mGN library, however, I managed to get the average runtime down to about 300 milliseconds - an extremely impressive feat! This speed means that I will be able to add more complex analysis factors without bogging down the engine.
A month of work on MSE and gMSE has finally paid off!
Both the multi-state engine and the Markov engine have been finished in the past week. Now, to tackle a new implementation of GGrewve with maximum ease-of-use, I've dreamed up yet another type of engine. It's a rather simple hybrid type that will combine grammar with multi-state analysis. Not surprisingly, I will call it gMSE (grammatical multi-state engine).
One can think of gMSE as being a valuation dictionary based on a plurality of states. The gMSE answers queries of the form "What quantitative value would [word] receive based on past analysis and given that the current state is [state plurality]?" Perhaps more importantly, gMSE can answer queries of the form "Which word would received the highest/lowest quantitative score based on past analysis and given that the current state is [state plurality]?" In this way, the grammatical multi-state engine embeds grammatical data in the analysis of state pluralities.
This new engine will, ideally, make a newer and better version of GGrewve quite easy to create. Since GGrewve is based on probabilistic grammar analysis, it is easy to see how gMSE could accommodate the GGrewve engine plus added levels of depth thanks to the multi-state analysis. All of this can be accomplished with just a single object: a gMSE space. The gMSE space itself contains a grammar dictionary, an MSE space, and an MSE statestream, all wrapped into a single, easily-manageable object.