On Thu, 17 Jun 2004, Chris Cannam wrote:
music, I might get two staffs with eight or nine
voices on each. Not
ideal for piano music, then. That's not too problematic because the
default mode in NoteEdit appears to be to edit all voices at once,
right? Can I merge selected voices as well?
Just now I created Beethoven's Sonata No.8 in C-, Op.13 'Pathetique'
(530 measures) from:
http://www.stormloader.com/users/beethoven/midi.htm
The result is: 2 staff with 4 voices each.
I used the TSE3 --> Merge... feature because the MIDI file has
5(!) tracks.
(Unfortunataly, this feature doesn't work in noteedit-2.6.0. I'll fix
this together with Dave Phillips' problems)
The main parts are playable. The problem is the MIDI file:
Beethoven wrote:
|\ |\ |\ |\ |\ |\
---------|\------------|\------------|\------------|\------------|\------------|\---
---------|-------------|-------------|-------------|-------------|-------------|----
--|\----/-------|\----/-------|\----/-------|\----/-------|\----/-------|\----/-----
--|\------------|\------------|\------------|\------------|\------------|\----------
--|-------------|-------------|-------------|-------------|-------------|-----------
/ / / / / /
But on MIDI file is:
|\ |\ |\ |\ |\ |\
---------|\------------|\------------|\------------|\------------|\------------|\---
----\----|-------------|-------------|-------------|-------------|-------------|----
---\/---/-------------/-------------/-------------/-------------/-------------/-----
---/--------------------------------------------------------------------------------
------------------------------------------------------------------------------------
\ \ \ \ \ \
| | | | | |
| | | | | |
|-------------|-------------|-------------|-------------|-------------|
actually distributed over 2 staves. Of course, NoteEdit cannot comprehend this
and computes 2 voices :-(
The reason for the:
NMidiTimeScale::findPathsInChunk" Error Code is: 1"
is certainly the the TSE3 sustain problem, because the 'Pathetique'
is certainly a good test example.
How do you decide whether to run this algorithm at
all? I mean, how
can you know at the outset whether a track is expected to contain
one, two, or several voices? I imagine you could find a division
into "voices" of pretty much any MIDI track with chords in it.
(pause while I try out the feature)
Yes, it looks like it runs on every MIDI file --
Yes, indeed: But if all works(?) there shouldn't be unnessesary
voices. Imagine the events are so:
pitch 4: |---ev2--| |--ev6--|
pitch 3: |--ev1 --| |--ev5--|
pitch 2:
pitch 1: |--ev4----------|
pitch 0: |--ev3--|
| | | | | | | --> time
0 4 8 16 24 32 40
And PITCH_DIST_COST_FAC = 2 and START_DIST_FAC = 20 then
according to:
if (MidiOnTime(j) - (MidiOffTime(i) < 0) {
costs(i, j) = infinity
}
else {
costs(i, j) = PITCH_DIST_COST_FAC * |(pitch(i) - pitch(j))| +
START_DIST_FAC * (MidiOnTime(j) - (MidiOffTime(i))
}
the cost matrix is:
To: | 1 | 2 | 3 | 4 | 5 | 6 |
--------|------|------|------|------|------|------|
from: 1 |infty | 2 | 86 | 244 | 560 | 722 |
--------|------|------|------|------|------|------|
from: 2 |infty |infty | 8 | 166 | 482 | 640 |
--------|------|------|------|------|------|------|
from: 3 |infty |infty |infty | 2 | 326 | 488 |
--------|------|------|------|------|------|------|
from: 4 |infty |infty |infty |infty | 4 | 166 |
--------|------|------|------|------|------|------|
from: 5 |infty |infty |infty |infty |infty | 2 |
--------|------|------|------|------|------|------|
from: 6 |infty |infty |infty |infty |infty |infty |
--------|------|------|------|------|------|------|
The first event is evt1, the last evt6. As you can see the shorest path
from evt1 to evt6 is:
evt1 --> evt2 --> evt3 --> evt4 --> evt5 --> evt6
The sum is: 2 + 8 + 2 + 4 + 2 = 18
There is certainly no shorter path from evt1 to evt6
in the graph:
|------- e1 \----------
| / | |
| -- e2--|-- e5 ---- |
| | | \ | / | | |
| | | / - \ | | |
|--|- e3 -|-- e6-----|-|
| \ | / /
\ --- e4 -------
And this computes Dijkstra's shortest path algorithm. Because all
notes are marked in first loop there is no need for a 2nd
loop and all events belong to the one-and-only (and 1st) voice.
As explained above: (If all works correctly) the algorithm computes
multiple voices only if the MIDI events
overlap. If so, such score is produced:
|\
-----|--------------
-----/--------------
--------------------
--------------------
-----\--------------
|
|
How can I merge this ? Such a way:
|\
-----|----------------
----/|---------|\-----
-----|---------|------
-----|---------|------
----/---------/-------
\-----/
Ok, but how to merge this:
|\ |\ |\ |\ |\ | |\
| | | |\ | | |
---|--/----/----/----/----/.-------/----/---|----
---|----------------------------------------|----
---|----------------------------------------|----
---|----------------------------------------|----
---|--\---------\-------------\.--------\---|----
| | | |
| | | |/
btw, how does NoteEdit quantize on MIDI import?
Dynamically! The snap value is computed from MIDI note length.
--
J.Anders, Chemnitz, GERMANY (ja(a)informatik.tu-chemnitz.de)