Musical Information (Mus 253/CS 275A)
Kern to MIDI Lab

How to generate a MIDI file from **kern data

  • Humdrum Toolkit programs used in this lab: humdrum, proof, assemble.
  • Humdrum Toolkit Extra programs used in this lab: hum2mid, transpose.
  • Other unix programs: cp, less.
  1. Find or create a Humdrum **kern file. For example, copy and paste this data into a file called test.krn:

      Graphical form of the music being represented in the **kern data to the left:

  2. If you just inputted the file, run the humdrum command to check the basic syntax of the file with the following command (click on the command for more information):
       humdrum test.krn
    If the command does not reply with any messages, then the basic spine structure of the file is correct. Chapter 5 from the Humdrum User's Guide describes the Humdrum file format in detail.

    To do a more careful syntax check of the file, try this command:

       proof test.krn
    If the command does not reply with any messages, then the musical content of the **kern spines in the Humdrum file seem to be correct. In this case there was no key signature, so the proof command gives the following warning:
       proof: Warning: No key or key signature declaration for spine 1

  3. Use the smf command to create a MIDI file from the file test.krn will the following command:
       smf file.krn -o file.mid
    The -o option in the smf command indicates the file name to which the MIDI file contents will be written. If you do not specify the output file, the MIDI file will be printed in a ASCII format similar to the contents of a MIDI file:
       smf file.krn | less
      Number of Tracks: 2
      Time method: 1 (Absolute timing)
      Divisions per Quarter Note: 120
      Track 0   +++++++++++++++++++++++++++++++++++++++++++++++++++
      0	0xff 81 3 7 161 32 
      2039	0x90 0 0 
      2040	0xff 47 0 
      Track 1   +++++++++++++++++++++++++++++++++++++++++++++++++++
      0	0x90 60 72 
      120	0x80 60 72 
      120	0x90 60 64 
      240	0x80 60 64 
      240	0x90 67 67 
      360	0x80 67 67 
      360	0x90 67 61 
      480	0x80 67 61 
      480	0x90 69 64 
      600	0x80 69 64 
      600	0x90 69 59 
      720	0x80 69 59 
      720	0x90 67 65 
      960	0x80 67 65 
      960	0x90 65 65 
      1080	0x80 65 65 
      1080	0x90 65 69 
      1200	0x80 65 69 
      1200	0x90 64 68 
      1320	0x80 64 68 
      1320	0x90 64 68 
      1440	0x80 64 68 
      1440	0x90 62 63 
      1560	0x80 62 63 
      1560	0x90 62 59 
      1680	0x80 62 59 
      1680	0x90 60 68 
      1920	0x80 60 68 
      2039	0x90 0 0 
      2040	0xff 47 0 

  4. Now that you have a MIDI file (hopefully), you will want to hear it. In the Lab, the easiest way to do this is to copy the MIDI file into your home directory into the www subdirectory which is your publically accessible webpage:
       cp test.mid ~/www/test.mid

  5. Here are other options which can be used with the smf program:
      -C Don't include Humdrum comments as text in the MIDI file.
      -D Ignore dynamic markings in file.
      -T Don't display non-kern spines as lyrics in the MIDI file.
      -0 Create a Type-0 (single track) MIDI file.
      --plus Create a MIDI+ compliant MIDI file.
      -v # Set the default volume of notes to a number in the range from 1 to 127.
      -t # Scale the tempo by the given factor. 0.5 is twice as long, 2 is twice as fast.
      -I Don't include any instrument specifications.
      -c # Set the output MIDI channel (from 0 to 15).


  1. Choose a song from the list to encode in Humdrum **kern data format.

  2. Change the instrumentation of the example file. By default the MIDI file does not include an instrumentation code, so it usually will default to piano sounds. Choose a new instrument by specifying a Humdrum instrument somewhere at the top of the **kern data spine. Try some of the following:
          *Icemba        = harpsichord
          *Icello        = cello
          *Iorgan        = organ
          *Ivioln        = violin
          *Iclars        = clarinet
    More instruments can be found on the instrumental code reference webpage. If there is a code on this page which does not produce an instrument which is listed in the General MIDI specification, email me the code and which General MIDI instrument it should map to, and I will add it to the smf program.

  3. Change the tempo in your MIDI file by altering the *MM120 line in the example Humdrum file. MM120 indicates that there are 120 beats per minute. MM60 would be twice as slow, and MM240 would be twice as fast.

  4. Try adding a few articulations to the **kern data. For example, staccato marks are indicated with an apostorphe (') and accent marks are indicated with carets (^):

  5. Add dynamics to your file and listen to the resulting MIDI file:

  6. Use the transpose command to transpose the music. Here is a command which will transpose the music up a minor third:
       transpose -t m3 test.krn > test2.krn
    The contents of test2.krn should be:

    Try the following commands and listen to the final output:

         transpose -t P5 test.krn > test2.krn
         assemble test.krn test2.krn > test3.krn
         hum2mid test3.krn -o ~/www/test3.mid

    Try also following commands and listen to the final output:

         transpose -t m2 test.krn > test2.krn
         assemble test.krn test2.krn > test3.krn
         hum2mid test3.krn -o ~/www/test3.mid

  7. For homework, choose 2 examples from the SCORE Assignment #1 examples to encode in Humdrum **kern data format. After entering the music, run the file through the humdrum and proof commands. Also, listen to the melody by converting it to a MIDI file before emailing it to Rob.

  8. For more **kern encoding exercises, go to the webpage:

    Also, you should read the second chapter of the Humdrum User's Guide which gives an explanation of basic **kern data encoding of music. A more detailed description of **kern encoding can be found on the webpage: Everything You Need to Know About The Humdrum "**kern" Representation.

Revised: 7 March 2005