Neatbo.

MIDI note timeline query

Convert local SMF 0/1 ticks through the full tempo map into note seconds, then query a time range, track and channel and save every original event and note.

Browser-local processingInputSMF 0/1 PPQN .mid / .midiOutputComplete timeline JSON / all-note CSVUp to 5 MiB per file · File limit: 1
  1. 1Add input
  2. 2Adjust settings
  3. 3Get your result

Tool input and files are processed in this browser without being uploaded.

Your input

Inputs are kept temporarily in this tab when switching tools. Refreshing or closing clears them; large results may need to be regenerated.

⌘ / Ctrl + Enter to run

or drag and drop it here

Files stay on this device. Your originals stay unchanged.

.mid · .midi

Up to 5 MiB per file · File limit: 1

    Options

    Complete the required options first. You can keep the defaults for the rest.

    Matches a note span that overlaps the range; start is inclusive.

    End is exclusive and must be after start when supplied.

    Use an existing track index, not a MIDI channel number.

    0–15; channel labels 1–16 in other software correspond to these minus one.

    Preparing the tool…

    Before you start

    Find the notes overlapping a specific second in an exported MIDI file. Changes of tempo affect every later tick, so the report integrates the complete global tempo map before applying your filters.

    How to use this tool

    1. Select an original SMF 0/1 PPQN MIDI file.
    2. Optionally set start/end seconds, track or channel; leave a field blank to keep it unconstrained.
    3. Review selected note spans and warnings, then save the complete JSON and all-note CSV.

    Supported inputs and limits

    One .mid or .midi up to 5 MiB; SMF 0/1 with a positive PPQN division, at most 64 tracks, 50,000 events and 25,000 notes. Cumulative ticks in each track are at most 4,294,967,295. Type 2, SMPTE/drop-frame division, SYX dumps, truncated chunks, invalid running status and missing final end-of-track reject.

    All tempo changes contribute to one global tick-to-second map, with a default 500,000 microseconds per quarter note. Different tempos at one tick across different tracks reject; identical changes collapse. Multiple changes within the same track and tick use the last source event.

    Time queries use the half-open interval [start, end). Notes are selected when their key-release spans overlap that interval; zero-length notes use their start point. Blank start/end/track/channel fields impose no corresponding constraint. Track and channel numbers start at 0; track indices must exist. Filters never remove events or duplicate notes in downloads: each complete note carries selected true/false.

    Repeated pitch on one track/channel closes FIFO. Velocity-zero note-on means note-off. Unmatched note-offs produce a warning and no note; unclosed note-ons end at their own track end with a warning. CC64 is preserved as an event and does not extend note duration. Program state is scoped to each track/channel; no sound synthesis, score rendering or acoustic duration is inferred.

    Complete JSON and CSV combined are limited to 24 MiB and reject atomically if exceeded. The table shows the first 200 selected notes; text and copy show the summary and first 20 selected notes. Downloads retain all source events, track totals, tempo points, notes, warning details and filter flags. No MIDI device or network service is accessed.

    Worked example

    Example input

    Select tempo.mid
    Example options
    {"params":{"startSeconds":0.25,"endSeconds":1,"track":1,"channel":0}}

    Example output

    {
      "format": 1,
      "ppqn": 480,
      "trackCount": 2,
      "eventCount": 9,
      "noteCount": 2,
      "selectedNoteCount": 1,
      "endSeconds": 2.5,
      "tempoPointCount": 2,
      "warningCount": 0,
      "query": {
        "from": 0.25,
        "to": 1,
        "track": 1,
        "channel": 0
      },
      "preview": [
        {
          "track": 1,
          "channel": 0,
          "pitch": 60,
          "velocity": 90,
          "program": 7,
          "startTick": 0,
          "startSeconds": 0,
          "endTick": 960,
          "endSeconds": 1.5,
          "endPolicy": "key-release",
          "selected": true
        }
      ]
    }

    When something does not work

    Re-export a complete SMF 0/1 file with PPQN timing. Resolve conflicting simultaneous tempos or malformed events at the producer. Use existing 0-based track/channel indices and a positive end-after-start interval; clear filters to inspect all notes. Reduce the input if count or combined-output limits are exceeded.

    Frequently asked questions

    Why does multiplying ticks by one tempo give the wrong seconds?

    Every tempo change alters the conversion for the following tick interval. The complete map is integrated before querying notes.

    Are sustained notes extended until the pedal is released?

    No. Durations represent note-on to note-off, with explicit handling of unmatched events. Pedal control events remain in the complete report.

    Does the CSV contain only matching notes?

    No. The CSV contains every note once with selected true/false. The page table contains matching notes only.

    Documentation & further reading

    Related tools