---
name: "smfsh"
section: "1"
platform: "linux"
package: "libsmf"
version: "1.3-13"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/smfsh"
---

# smfsh(1)

SMF shell

## NAME

smfsh - SMF shell

## SYNOPSIS

**smfsh** \[ **-V** \] \[ *file* \]

## OPTIONS

- **-V**

  Print libsmf version and exit.

- *file*

  Load the file.

## DESCRIPTION

**smfsh**, an "SMF shell", is an interactive, command-driven frontend to libsmf, useful for modifying MIDI files by hand.  It started its life as a debugging aid for libsmf.

There are four groups of commands: SMF level, track level, event level, and others.

## SMF LEVEL COMMANDS

SMF level commands display or change properties of smf (i.e. the MIDI file) as a whole.

- **save** *file*

  Save a file.  If the *file* name is not given, the last file name is used.

  Note that this will not ask for confirmation.

- **load** *file*

  Load a file.  If the *file* name is not given, the last file name is used.

  Instead of using "load", you can pass the file name on the command line.

- **ppqn** *new-ppqn*

  Show (if used without parameter) or change PPQN (Pulses Per Quarter Note, aka Division).

- **format** *new-format*

  Show (if used without parameter) or change format.

- **tempo**

  Show tempo map.  Tempo map is computed automatically from the SMF contents - to modify a tempo, just add a Tempo Change event using "add" command.

- **length**

  Show total length of the song.  Just like the tempo map, file length is computed from the SMF contents.

## TRACK LEVEL COMMANDS

Track level commands display or change properties of tracks.  SMF may contain one or more tracks.

- **tracks**

  Show the list of tracks in the SMF.

- **track** *track-number*

  Show details of a track (if called without parameter), or select track with a given number - for example in order to display ("events") the events it contains.

- **trackadd**

  Create new track.

- **trackrm** *track-number*

  Remove the track.  If the track number is not given, this will remove the track currently selected.

## EVENT LEVEL COMMANDS

Event level commands display or change properties of events.  Events are grouped into tracks. Track may contain any number of events, including zero.

- **events**

  Show the list of events in the current track.

- **event** *event-number*

  Show information about a current event (if used without parameter) or select the event.

- **add** *time-in-seconds* *midi-message-as-hex*

  Add new event to the currently selected track.

- **rm** *event-number*

  Remove the event.  If the event number is not given, this will remove the event currently selected.

## OTHER COMMANDS

There are three commands in the "other" category - "help", "version", and "exit".  Their meaning should be self expanatory.
