Lyrics / PolyText

No, I have not developed a Midi (Karaoke) Player myself. One reason being that it has no sense to reinvent the wheel in the first place.
There does exist a whole bunch of free & shareware players on the Word Wide Web. This is one of the best:
Click for a free download!
Get vanBasco's Karaoke Player NOW - totally FREE!

The player does not deal, though, with real polyphony (J.S. Bach for example).
Current midi-karaoke players, even the excellent ones, cannot handle multiple texts - PolyText - as is common especially in classical music.

Only lyrics defined by the Meta Lyric event will be supported in future versions of the software (i.e. standard
set by Tune 1000). Wish list: real polyphony. And a midi karaoke player that displays e.g. SATB texts properly.

Perhaps the most well-known truly polyphonic song here in the Netherlands is Vader Jacob. It's not only PolyPhonic - melodies mixed - but it's also PolyTextual - texts mixed - as exemplified in:

Va-    der     Ja- cob, | va-    der     Ja- cob,
slaapt gij     nog,     | slaapt gij     nog?
Alle   klokken lui-den, | alle   klokken lui-den:
bim,   bam,    bom,     | bim,   bam,    bom.

KAN extension

Let's display the first measure of the above fragment in an updated home-made PianoRoll
KAN (Klavar Ascii Notation) format:
  478  : :  : : : 9: :4 :2: :  : :  : : :  | 8=Va 4=Slaapt_ 2=Al 1=Bim_
    2  : :  : : : 9: :4 : : :  : :  : : :  |
  478  : :  : : : 9: :4 : :2:  : :  : : :  | 2=le_
    2  : :  : : :  : :  : : :  : :  : : :  |
  478  : :  :1: :  :8: 4:2: :  : :  : : :  | 8=der_ 4=gij_ 2=klok 1=bam_
    2  : :  :1: :  :8: 4: : :  : :  : : :  |
  478  : :  :1: :  :8: 6: : :  : :  : : :  | 2=ken_
    2  : :  : : :  : :  : : :  : :  : : :  |
  958  : :  : : : 1: :A :4: :  : :  : : :  | 8=Ja 4=nog_ 2=lui 1=bom_
    2  : :  : : : 1: :  :4: :  : :  : : :  |
  958  : :  : : : B: :  :4: :  : :  : : :  | 8=cob_ 2=den_
    2  : :  : : :  : :  : : :  : :  : : :  |
This needs some explanation, right? The clue is that text shall be encoded in exactly the same way as it is done with the notes. Essentially as it has been accomplished for years with KlavarScribo, hence the name Klavar Ascii Notation (KAN). In our case, we have 4 voices and 4 texts. These might be labeled as 0,1,2,3. But two voices can be unisono (same note) and two texts can be the same as well. In order to prevent confusion with notes and to save effort with texts, instead of the 0,1,2,3 labeling, we do the following:
0 => 1 (= 20)
1 => 2 (= 21)
2 => 4 (= 22)
3 => 8 (= 23)
Because then all possible combinations of the note parts can be created, and they are unique:
0   1   1   1   1   1   1   1   1
1     2 2     2 2     2 2     2 2
2         4 4 4 4         4 4 4 4
3                 8 8 8 8 8 8 8 8
-----------------------------------------------
  0 1 2 3 4 5 6 7 8 9 A B C D E F
Now take a look again at the above KAN fragment and mind the notation '9' where '8' and '1' are unisono, '6' where '4' and '2' are unisono, 'A' where '8' and '2' are unisono, 'B' where '8' and '2' and '1' are unisono.
It's time for trying to understand the full KAN score for our Vader Jacob canon. In this KAN score it is also demonstrated how equal texts are handled. At the end of the song we have arranged that all voices have the same notes and the same text as well:
  958  : :  : : : F: :  : : :  : :  : : :  | F=Bim_
    2  : :  : : :  : :  : : :  : :  : : :  | 
  958  : :  :F: :  : :  : : :  : :  : : :  | F=bam_
    2  : :  : : :  : :  : : :  : :  : : :  | 
 1918  : :  : : : F: :  : : :  : :  : : :  | F=bom_
    2  : :  : : :  : :  : : :  : :  : : :  | 
For the sake of completeness, there is also a track for defining instruments and properties like volume, bending, sustain, etcetera. And it's handsome to create the final midifile by a script instead of typing the same commands by hand every time again.

META proposal

So far so good, but how does all this translate into a midifile, especially the PolyText part? With current (2017) midi-karaoke players, the Midi Meta Event Lyric is (commonly but not exclusively) employed for lyrics. It has the following format:
$FF <type> <length> <text>
$FF  $05   <length> <text>
There has not been defined a Midi Meta Event for PolyText, but upon carefully reading the above specifications it will be seen that the following Meta Events are not yet defined:
<type> = $10 ... $1F
$FF $10 , $FF $11 , $FF $12 , $FF $13 , $FF $14 , $FF $15 , $FF $16 , $FF $17
$FF $18 , $FF $19 , $FF $1A , $FF $1B , $FF $1C , $FF $1D , $FF $1E , $FF $1F
In order to preserve the idea that a note can be in 16 channels, we have opted for giving a similar meaning to these hitherto unemployed Meta Events:
$FF        <type>         <length> <text>
$FF $1<channel>(PolyText) <length> <text>
Then the translation of the above Vader Jacob fragment into a textual equivalent of the midifile's content is rather straightforward. It is noticed that the channels of the PolyText events are an exact match with the channels of the corresponding notes, as intended by our design. (And in case somebody cares, here is the real hex-dump of this part of the midifile too):
Meta $13(PolyText) Va
Meta $12(PolyText) Slaapt_
Meta $11(PolyText) Al
Meta $10(PolyText) Bim_
Note ch$0 60(C5) 120
Note ch$1 67(G5) 120
Note ch$2 64(E5) 120
Note ch$3 60(C5) 120
478
Note ch$1 67(G5) 0
2
Meta $11(PolyText) le_
Note ch$1 69(A5) 120
478
Note ch$3 60(C5) 0
Note ch$2 64(E5) 0
Note ch$1 69(A5) 0
Note ch$0 60(C5) 0
2
Meta $13(PolyText) der_
Meta $12(PolyText) gij_
Meta $11(PolyText) klok
Meta $10(PolyText) bam_
Note ch$0 55(G4) 120
Note ch$1 67(G5) 120
Note ch$2 65(F5) 120
Note ch$3 62(D5) 120
478
Note ch$1 67(G5) 0
2
Meta $11(PolyText) ken_
Note ch$1 65(F5) 120
478
Note ch$3 62(D5) 0
Note ch$2 65(F5) 0
Note ch$1 65(F5) 0
Note ch$0 55(G4) 0
2
Meta $13(PolyText) Ja
Meta $12(PolyText) nog_
Meta $11(PolyText) lui
Meta $10(PolyText) bom_
Note ch$0 60(C5) 120
Note ch$1 64(E5) 120
Note ch$2 67(G5) 120
Note ch$3 64(E5) 120
958
Note ch$3 64(E5) 0
Note ch$1 64(E5) 0
2
Meta $13(PolyText) cob_
Meta $11(PolyText) den_
Note ch$1 60(C5) 120
Note ch$3 60(C5) 120
958
Note ch$3 60(C5) 0
Note ch$2 67(G5) 0
Note ch$1 60(C5) 0
Note ch$0 60(C5) 0
2
With the present approach, as explained above, PolyText is represented by our generalized Lyric event, hence corresponding with at most 16 polyphonic midi channels, exactly as with the voices in music. So a major advantage of the META proposal is that there is a clear one-to-one mapping between text and voice :
 MIDI <channel>   <==>   META <type>
This makes it easy, for example, to mute a channel together with its text. However, there is not yet a midi player who can display such PolyText. In order to display songtext with existing midi-karaoke players, a program (app) called POLY2LY has been developed. Just define the part that you want to sing, and the accompanying song text shall be properly displayed by the player. Only one part at a time, though:   part 0 (1) , part 1 (2) , part 2 (4) , part 3 (8) . Looks like this (for part 0):

LilyPond solution

But there is another way. In general, there are two sorts of midi music packages: (1) main purpose is audio: midi music (2) main purpose is visual: music score. With the latter, the need for PolyText always has been more urgent than with the former. With music score, PolyText has been present for quite some time and the problem of its presence has been solved in a different way. Instead of assigning a different channel to a different text, as has been done with our META proposal, different tracks are assigned to PolyText. Though it is a common feature of many music score oriented packages, we shall call this the LilyPond solution for future reference.
Having said all this, let's dive into the deep and compose an input file for LilyPond, thus obtaining free music score for everyone's "Vader Jacob": Execution of the above .LY file as input within the LilyPond system results in music score (PDF) output looking like this:

And in a midifile as well. The structure of this midifile becomes obvious from its textual (DTN) representation. It is seen that the PolyText lyrics are indeed scattered into different tracks, 2,4,6,8 in our case.

A major drawback of the LilyPond solution is that there is no clear one-to-one mapping between text and voice (such as is provided with the META proposal). Looking like this:

Track 0
Tempo events etc.
Track 1
Melody part 1
Track 2
Text part 1
Track 3
Melody part 2
Track 4
Text part 2
Track 5
Instrumental
etcetera
It difficult - if not impossible, for example to mute a channel together with its text. There is an easy remedy for this, namely putting lyrics and accompanying melody into the same track:
Track 0
Tempo events e.d.
Track 1
Melody part 1
Text part 1
Track 2
Melody part 2
Text part 2
Track 3
Instrumental
etcetera
Though this is slightly different from the LilyPond solution.

KPlay prototype

However, the content of the midifile can be heard and seen nowadays by means of a prototype PolyText player (yes!) that understands the LilyPond solution. The prototype player, called KPlay, has been developed by the
music composer and program developer Edwin van Veldhoven. Output of KPlay is looking like this:

Still Another Proof of Concept

The above is all nice and easy, but there exist other ways of visualizing the lyrics. Like this:
========================================================================
Vader Jacob Vader Jacob Slaapt gij nog     Slaapt gij nog     Al_____le 
                        Va_____der Ja__cob Va_____der Ja__cob Slaapt    
                                                              Va________
                                                                        
========================================================================
klokken lui_den Al_____le klokken lui_den Bim       bam     bom     Bim 
gij     nog     Slaapt    gij     nog     Al_____le klokken lui_den Al__
der     Ja__cob Va________der     Ja__cob Slaapt    gij     nog     Slaa
                                          Va________der     Ja__cob Va__
========================================================================
      bam     bom     Va________der     Ja__cob Va________der     Ja__co
___le klokken lui_den Bim       bam     bom     Bim       bam     bom   
pt    gij     nog     Al_____le klokken lui_den Al_____le klokken lui_de
______der     Ja__cob Slaapt    gij     nog     Slaapt    gij     nog   
========================================================================
b Slaapt    gij     nog     Slaapt    gij     nog     Al_____le klokken 
  Va________der     Ja__cob Va________der     Ja__cob Slaapt    gij     
n Bim       bam     bom     Bim       bam     bom     Va________der     
  Al_____le klokken lui_den Al_____le klokken lui_den Bim       bam     
========================================================================
lui_den Al_____le klokken lui_den Bim       bam     bom     Bim       ba
nog     Slaapt    gij     nog     Al_____le klokken lui_den Al_____le kl
Ja__cob Va________der     Ja__cob Slaapt    gij     nog     Slaapt    gi
bom     Bim       bam     bom     Va________der     Ja__cob Va________de
========================================================================
m     bom     Bim       bam     bom     Bim       bam     bom     Bim   
okken lui_den Bim       bam     bom     Bim       bam     bom     Bim   
j     nog     Al_____le klokken lui_den Al_____le klokken lui_den Bim   
r     Ja__cob Slaapt    gij     nog     Slaapt    gij     nog     Al__le
========================================================================
 bam     bom     Bim    bam     bom     Bim bam bom Bim bam bom 
 bam     bom     Bim    bam     bom     Bim bam bom Bim bam bom 
 bam     bom     Bim    bam     bom     Bim bam bom Bim bam bom 
 klokken lui_den Al__le klokken lui_den Bim bam bom Bim bam bom 
========================================================================

More examples

Back to my HomePage.