English
中文
日本語
Español
Deutsch
MIDI to JSON Converter

Professional MIDI to JSON Converter for Tone.js & Web Audio Developers

How to Convert MIDI to CSV (Examples + Common Issues)

March 2, 2026 10 min read
How to Convert MIDI to CSV (Examples + Common Issues)

Need to analyze MIDI data in Excel, Google Sheets, or Python? Converting your MIDI files to a note-level CSV is probably the fastest way to get started. This guide walks you through the exact steps, explains what you'll find in the CSV, and answers the most common "wait, why does this look like that?" questions.

The good news: MidiEasy handles MIDI to CSV conversion right in your browser—nothing gets uploaded. Your files never leave your device.

Converter: /midi-to-csv
Inspector (for debugging MIDI structure): /midi-inspector


Quick start for Sheets/Excel users

Step 1 — Open the converter

Head over to: /midi-to-csv

(Insert screenshot: the upload area and Convert/Download buttons.)

MidiEasy MIDI to CSV converter upload area and convert buttons

Step 2 — Upload your MIDI files

Just drag and drop one or more .mid files, or click Select MIDI files.

  • Free tier: batch conversion supports up to 20 files / 100MB total
  • Pro: built for larger batches (higher limits + faster processing)

Step 3 — Convert and download

Hit Convert, then download your file(s):

  • CSV if you uploaded a single file
  • ZIP if you uploaded multiple files
Downloading CSV and ZIP results after converting MIDI files

Open the CSV in Excel or Google Sheets and you're good to go.


What the CSV actually looks like

MidiEasy gives you note-level rows—one row per note event.

Here's a simplified example:

track,channel,pitch,note_name,start_seconds,duration_seconds,velocity
1,0,60,C4,12.480,0.250,96
1,0,64,E4,12.480,0.250,92
1,10,36,C2,12.500,0.125,110
Example MIDI to CSV output showing track, channel, pitch, timing, and velocity columns

What each column means

  • track: The MIDI track index in the file
  • channel: The MIDI channel (often used to separate different instruments or parts)
  • pitch / note_name: The note pitch (for example, 60 = C4)
  • start_seconds: When the note starts (in seconds)
  • duration_seconds: How long the note lasts (in seconds)
  • velocity: How hard the note is played (ranges from 0–127)

Common issue #1: "Why is the track column always 1?"

This is totally normal in most cases.

A lot of MIDI files are single-track files (format Type 0, or files that have been exported/merged). When that's the case, all the events live inside one track chunk—so the track value stays 1 for every single row.

What to do: Focus on the channel column instead (and sometimes instrument/program info) to tell different parts apart.

MIDI Inspector showing a single-track MIDI file where track stays 1 and channels vary

Want to double-check your MIDI file's structure? Use: /midi-inspector


Working with Google Sheets / Excel

Group notes by channel

Create a Pivot Table:

  • Rows: channel
  • Values: COUNT of rows (or SUM of duration, depending on what you need)

This instantly shows you which channels have the most activity.

Find the loudest notes

Sort by velocity in descending order, or try:

  • Filter: velocity > 100
  • Conditional formatting to highlight high-velocity notes

See which notes appear most often

Build a pivot table with:

  • Rows: note_name (or pitch)
  • Values: count

That gives you a pitch histogram.


Working with Python (pandas)

Load the CSV

import pandas as pd

df = pd.read_csv("your_file.csv")
df.head()

Count notes per channel

df.groupby("channel").size().sort_values(ascending=False)

Calculate total note duration per channel

df.groupby("channel")["duration_seconds"].sum().sort_values(ascending=False)

See which pitches are used most

df.groupby("note_name").size().sort_values(ascending=False).head(20)

Add an end time column

df["end_seconds"] = df["start_seconds"] + df["duration_seconds"]

Common issue #2: "Why are there so many channels?"

That's expected for MIDI files with multiple parts.

Here's what you'll typically see:

  • Channel 10 is usually reserved for drums (though not always—it's just a common convention)
  • Other channels represent different instruments or parts

If you want to see exactly which programs/instruments are assigned to which channels, check out:
/midi-inspector


Common issue #3: "The timing seems off"

When the timing doesn't match what you expected, it's usually because of:

  • Tempo changes throughout the song
  • Time signature changes
  • An unusual MIDI file structure

Here's what you can try:

  1. Check the tempo and time signature in /midi-inspector
  2. Make sure your analysis is working in seconds (this CSV uses start_seconds and duration_seconds)
  3. Keep in mind that DAWs often display timing differently (ticks vs. seconds), so there might be a visual mismatch

Common issue #4: "Some of my files won't convert"

This can happen with:

  • Corrupted or malformed MIDI files
  • Files containing unusual or unsupported event types
  • Edge-case file encodings

Try these steps:

  • Convert files one at a time to figure out which one's causing trouble
  • Open the problematic file in /midi-inspector to check for quality issues or unknown events

If you're doing a lot of batch conversions, Pro includes retry tools that help you quickly recover from failed conversions.


Is Pro worth it? (Lifetime $9.90)

If you're regularly converting batches of MIDI files, Pro is designed for exactly that:

  • Higher batch limits: Free tier caps at 20 files / 100MB; Pro raises the soft limit to around 200 files / 1GB
  • Faster processing: 3 workers (Pro) vs 1 (Free)
  • Retry tools: Easily retry failed conversions, either in batches or file-by-file
  • report.json export: Pro lets you download report.json files (and automatically includes them in ZIP downloads)