Subject: Re: [linux-audio-user] NoteEdit 2.6.0: MIDI-->multiple voices per staff
From: Joerg Anders (j.anders_AT_informatik.tu-chemnitz.de)
Date: Thu Jun 17 2004 - 17:28:39 EEST
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_AT_informatik.tu-chemnitz.de)
This archive was generated by hypermail 2b28 : Thu Jun 17 2004 - 17:22:50 EEST