[linux-audio-user] NoteEdit 2.6.0: MIDI-->multiple voices per staff

Joerg Anders j.anders at informatik.tu-chemnitz.de
Thu Jun 17 10:28:39 EDT 2004


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)



More information about the Linux-audio-user mailing list