Connexions

You are here: Home » Content » [ mini-project ] Parse and analyze a standard MIDI file
Content Actions
Lenses

What is a lens?

Lenses

A lens is a custom view of Connexions content. You can think of it as a fancy kind of list that will let you see Connexions through the eyes of organizations and people you trust.

What is in a lens?

Lens makers point to Connexions materials (modules and collections), creating a guide that includes their own comments and descriptive tags about the content.

Who can create a lens?

Any individual Connexions member, a community, or a respected organization.

This content is ...
In these lenses
  • This module is included inLens: Digital Signal Processing with NI LabVIEW and the National Instruments Platform
    By: Sam ShearmanAs a part of collection:"Musical Signal Processing with LabVIEW (All Modules)"

    Comments:

    "This online course covers signal processing concepts using music and audio to keep the subject relevant and interesting. Written by Prof. Ed Doering from the Rose-Hulman Institute of Technology, […]"

    Click the "NI Signal Processing" link to see all content selected in this lens.

    NI Signal Processing
Tags

(?)

These tags come from the endorsement, affiliation, and other lenses that include this content.

[ mini-project ] Parse and analyze a standard MIDI file

Module by: Ed Doering

Summary: This mini-project will develop your ability to interpret the binary file listing of a standard MIDI file. You will first parse the file into its component elements (headers, MIDI messages, meta-events, and delta-times), and then analyze your results.

Objective

MIDI files consist of three types of data: (1) MIDI events, (2) timing information, and (3) file structure information (file header and track headers). Your task in this mini-project is to parse a MIDI file by hand by examining the individual bytes of the file. Once you can successfully parse a file, you will be well-positioned to write your own software applications that can create standard MIDI files directly, or even to read the file directly (a challenge!).
If you have not done so already, please study the pre-requisite modules, MIDI Messages and Standard MIDI Files. You will need to refer to both of these modules in order to complete this activity.

Part 1: Parse the File

The file to be parsed is available here: parse_me.mid (MIDI files are binary files, so right-click and choose “Save As” to download the file). If you wish, you can use a hexadecimal editor such as XVI32 to display the bytes, otherwise you can refer to the XVI32 screenshot below:
graphics1.png
Figure 1: Hexadecimal listing of the 'parse_me.mid' file
The byte position (address) is shown on the far left panel, the hexadecimal representation of each byte in the file is shown in the central panel, and the ASCII representation of each byte is shown in the right panel. Most of the ASCII characters look like gibberish, but important landmarks such as the track chunk ID (MTrk) are easily visible.
Interpret each part of the file, and list your results in tabular format, like this (use hexadecimal notation for the “Starting Address” column):
tabular_listing.png
Remember, a byte value of 0xFF signifies the beginning of a meta-event. Also, remember the concept of running status, so be on the lookout for MIDI messages whose first byte is NOT a status byte, i.e., whose MSB is clear. Take a look at the following video if you need some assistance:
midi_parse-me-walkthru.html
Figure 2: [video] Walk through the MIDI file "parse_me.mid" at a high level, then show some parsing examples at the beginning of the file.

Part 2: Analyze Your Results

Determine the following information for the MIDI file:
  • File format (Type 0, 1, or 2)
  • Number of tracks
  • Number of distinct channels used
  • Number of distinct voices (instruments) used (look for Program Change messages)
  • Number of ticks per quarter note
  • Shortest two non-zero delta times, reported both in ticks and in microseconds (hint: the timing information you need here is derived from information in two distinct places)
  • Top two longest delta times, both in ticks and in microseconds
  • Minimum non-zero note-on velocity, and its channel and note number
  • Maximum note-on velocity, and its channel and note number
  • Total number of meta-events
If you have not done so already, listen to parse_me.mid (click the link to launch your default music player application). How do your parsing and analysis results compare to what you hear?

Comments, questions, feedback, criticisms?

Send feedback