Difference between revisions of "MIDI file parsing homework"

From CCARH Wiki
Jump to navigation Jump to search
Line 3: Line 3:
 
# Find a MIDI file on the web.  Tip: include <em>[https://www.google.com/search?q=filetype%3Amidi&lr=lang_en filetype:midi]</em>or <em>[https://www.google.com/search?q=filetype%3Amid&lr=lang_en filetype:mid]</em>  when searching for MIDI files in Google searches.
 
# Find a MIDI file on the web.  Tip: include <em>[https://www.google.com/search?q=filetype%3Amidi&lr=lang_en filetype:midi]</em>or <em>[https://www.google.com/search?q=filetype%3Amid&lr=lang_en filetype:mid]</em>  when searching for MIDI files in Google searches.
 
# Save the MIDI file to your desktop and open it (usually double-clicking to open with the default MIDI playing program on your computer).  [[Quicktime | Here are instructions for installing an older version of Quicktime in OS X]] which plays MIDI files.
 
# Save the MIDI file to your desktop and open it (usually double-clicking to open with the default MIDI playing program on your computer).  [[Quicktime | Here are instructions for installing an older version of Quicktime in OS X]] which plays MIDI files.
# If it plays correctly, drag and drop the MIDI file from your desktop into the box below: <html><iframe style="overflow: hidden; width:750px; height:650px;" src="http://www.ccarh.org/software/binasc/"></iframe></html>
+
# If it plays correctly, drag and drop the MIDI file from your desktop into the box below: <html><iframe style="overflow: hidden; width:750px; height:700px;" src="http://www.ccarh.org/software/binasc/"></iframe></html>
 
# Parse the resulting display of the MIDI file's hexadecimal bytes by hand.  Make note of the number of tracks in the file; whether it is type-0 or type-1 (or type-2), and how many ticks per quarter note are used for basic timing in the file.
 
# Parse the resulting display of the MIDI file's hexadecimal bytes by hand.  Make note of the number of tracks in the file; whether it is type-0 or type-1 (or type-2), and how many ticks per quarter note are used for basic timing in the file.
 
# Parse at least 20 delta-time/message pairs in one of the tracks of the MIDI File.  Note that type-1 files only stores meta messages such as tempo changes in the first track.  If your file  is a type-1 file, try parsing a few of these meta messages, and then switch to another track with notes.
 
# Parse at least 20 delta-time/message pairs in one of the tracks of the MIDI File.  Note that type-1 files only stores meta messages such as tempo changes in the first track.  If your file  is a type-1 file, try parsing a few of these meta messages, and then switch to another track with notes.

Revision as of 23:00, 29 January 2018

Assignment

  1. Find a MIDI file on the web. Tip: include filetype:midior filetype:mid when searching for MIDI files in Google searches.
  2. Save the MIDI file to your desktop and open it (usually double-clicking to open with the default MIDI playing program on your computer). Here are instructions for installing an older version of Quicktime in OS X which plays MIDI files.
  3. If it plays correctly, drag and drop the MIDI file from your desktop into the box below:
  4. Parse the resulting display of the MIDI file's hexadecimal bytes by hand. Make note of the number of tracks in the file; whether it is type-0 or type-1 (or type-2), and how many ticks per quarter note are used for basic timing in the file.
  5. Parse at least 20 delta-time/message pairs in one of the tracks of the MIDI File. Note that type-1 files only stores meta messages such as tempo changes in the first track. If your file is a type-1 file, try parsing a few of these meta messages, and then switch to another track with notes.
  6. Give the basic meaning of MIDI messages (such as this is a note-on messages for pitch A4, or this is a tempo meta message).
  7. Does the MIDI file use "running status"? Running status would result in the first byte of a MIDI message in any (delta-time/message) pair to be a data byte rather than a command-byte (and the last command-byte in the track would be the inferred command byte).
  8. Decoding VLVs for delta timings is optional.
  9. Extra Credit: If decoding the VLV values, does the MIDI file look like it was performed live, or does it represent proportional time? In other words, if the ratio of time values looks like integers, such as 2:1 for quarter-note:eighth note, then it could not possibly be performed so accurately.
  10. Extra Credit: Write your own Standard MIDI File parser which will do this homework for you.
  11. Email MIDI file and your parsing to you know whos.

Example

Here is the simple example done in class using File:Twinkle.mid. Converting bytes into a list of hexadecimal numbers with binasc online:

4d 54 68 64 00 00 00 06 00 00 00 01 00 80 4d 54 72 6b 00 00 00 8c 00 ff 58  
04 04 02 30 08 00 ff 59 02 00 00 00 90 3c 28 81 00 90 3c 00 00 90 3c 1e 81 
00 90 3c 00 00 90 43 2d 81 00 90 43 00 00 90 43 32 81 00 90 43 00 00 90 45 
2d 81 00 90 45 00 00 90 45 32 81 00 90 45 00 00 90 43 23 82 00 90 43 00 00 
90 41 32 81 00 90 41 00 00 90 41 2d 81 00 90 41 00 00 90 40 32 40 90 40 00 
40 90 40 28 40 90 40 00 40 90 3e 2d 40 90 3e 00 40 90 3e 32 40 90 3e 00 40 
90 3c 1e 82 00 90 3c 00 00 ff 2f 00

Basic parsing:

4d 54 68 64                    ; ASCII characters "MThd"
00 00 00 06                    ; Number of bytes in header to follow: 6
00 00                          ; MIDI file type: 0
00 01                          ; Number of tracks: 1
00 80                          ; Ticks per quarter note: 128

4d 54 72 6b                    ; ASCII characters "MTrk"
00 00 00 8c                    ; Number of bytes in track to follow: 140
00                             ; 0 ticks
       ff 58 04 04 02 30 08    ; time signature meta event
00                             ; 0 ticks
       ff 59 02 00 00          ; key signature meta event
00                             ; 0 ticks
       90 3c 28                ; note-on C4
81 00                          ; 128 ticks
       90 3c 00                ; note off C4
00                             ; 0 ticks
       90 3c 1e                ; note-on C4
81 00                          ; 128 ticks
       90 3c 00                ; note off C4
00                             ; 0 ticks
       90 43 2d                ; note-on
81 00                          ; 128 ticks
       90 43 00                ; note-off
00                             ; 0 ticks
       90 43 32                ; note-on
81 00                          ; 128 ticks
       90 43 00                ; note-off
00                             ; 0 ticks
       90 45 2d                ; note-on
81 00                          ; 128 ticks 
       90 45 00                ; note-off
00                             ; 0 ticks
       90 45 32                ; note-on
81 00                          ; 128 ticks
       90 45 00                ; note-off
00                             ; 0 ticks
       90 43 23                ; note-on
82 00                          ; 256 ticks
       90 43 00                ; note-off
00                             ; 0 ticks
       90 41 32                ; note-on
81 00                          ; 128 ticks
       90 41 00                ; note-off
00                             ; 0 ticks
       90 41 2d                ; note-on
81 00                          ; 128 ticks
       90 41 00                ; note-off
00                             ; 0 ticks
       90 40 32                ; note-on
40                             ; 64 ticks
       90 40 00                ; note-off
40                             ; 64 ticks
       90 40 28                ; note-on
40                             ; 64 ticks
       90 40 00                ; note-off
40                             ; 64 ticks
       90 3e 2d                ; note-on
40                             ; 64 ticks
       90 3e 00                ; note-off
40                             ; 64 ticks
       90 3e 32                ; note-on
40                             ; 64 ticks
       90 3e 00                ; note-off
40                             ; 64 ticks
       90 3c 1e                ; note-on
82 00                          ; 256 ticks
       90 3c 00                ; note-off
00                             ; 0 ticks
       ff 2f 00

Example of more detailed parsing:

4d 54 68 64      MIDI header chunk marker ("MThd")
00 00 00 06      Bytes to follow in header chunk (6)
00 00            file format: Type-0 (0 == single track format)
00 01            number of tracks (1)
00 80            ticks per quarter note (128)

First (and only track):

4d 54 72 6b       MIDI track chunk marker ("MTrk")
00 00 00 8c       Bytes to follow in track chunk (140 bytes)


VLV     MIDI message
============================================
0       ff 58 '4 4 2 30 8       Meta-message for time signature 4/; 48 ticks per metronome click;  8 32nds per beat
0       ff 59 '2 0 0            Meta-message for key signature: C major
0       90 '60 '40              Note on, C4
128     90 '60   0               Note off, C4
0       90 '60 '30              etc.
128     90 '60   0
0       90 '67 '45
128     90 '67   0
0       90 '67 '50
128     90 '67   0 
0       90 '69 '45
128     90 '69   0
0       90 '69 '50
128     90 '69   0
0       90 '67 '35
256     90 '67   0
0       90 '65 '50
128     90 '65   0
0       90 '65 '45
128     90 '65   0
0       90 '64 '50
64      90 '64   0
64      90 '64 '40
64      90 '64   0
64      90 '62 '45
64      90 '62   0
64      90 '62 '50
64      90 '62   0
64      90 '60 '30
256     90 '60   0
0       ff 2f 0                Meta-message for end-of-track

Notice that this MIDI file was clearly not performed live. The delta-time durations are: 0, 64, 128, and 265 which are all multiples of two from each other (representing eighth notes, quarter notes and half notes).