rumor(1) program for transcripting simple music played on (MIDI) keyboard to Lilypond text notation.


rumor [-lDfsv?V][-gN][-mP[/]Q][-tBPM][-w[BEAT]][-aNUM]
            [-k NOTE] [--flat] [--grain=N] [--legato] [--meter=P[/]Q]
            [--no-chords] [--tempo=BPM] [--wait[=BEAT]] [--accidentals=NUM]
            [--absolute-pitches] [--no-dots] [--explicit-durations] [--full]
            [--key=NOTE] [--lang={ne,en,en-short,de,no,sv,it,ca,es}] [--strip]
            [--sample-sheet] [--verbose] [--alsa[=[IC:IP,]OC:OP]] [--kbd]
            [--oss[=DEV]] [--script=FILE] [--help] [--usage] [--version]


This manual page explains the rumor program. It is a realtime monophonic (with chords) MIDI keyboard to Lilypond converter. It receives MIDI events, quantizes them according to its metronome on the fly and outputs handwritten-like corresponding Lilypond notation. Tempo, meter, key and other parameters can be set via command-line options


Default start-up values are --alsa=64:0,65:0 --tempo=100 --meter=44 --grain=16 --key=c.

Set minimum time resolution to the NUMth note. Only powers of two are valid, from 1 up to 128.
Ignore any rests between notes. Every note terminates upon the start of the next one.
Do not use dotted notes (dotted rests are always disallowed).
Set time signature. Bar will have P beats of duration of the Qth note. Metronome will sound every beat. (thus e.g. 4/4 and 8/8 will give the same output, only metronome behavior will change).

Q must be a power of two. Slash may be omited if P and Q are both smaller than 10.

Metronome speed will be BPM beats per minute. Note that what is considered a beat is determined by --meter.
Start metronome upon arrival of the first MIDI note, at the beginning of bar (BEAT=1) unless overridden.
Output only pitches as you play, no lengths. Metronome will not be started.
Disables chords (groups of notes pressed and released "simultaneously", with regard to quantization). Enabled by default.
Output duration indication after every note, even if it remains the same as preceedingly.
Do not use Lilypond relative notation. Instead, all pitches have their octave indicated by (possibly zero) tics or commas.
LANG can be one of ne (default: ces, c, cis, ...), en, en-short, de, no, sv, it, ca, es. Languages match those used by Lilypond (not necessarily the version you have installed, though). Note that pitch names can be always overridden by rumor-pitches (see section 5. Scripting).
Set base note of current scale, used to resolve enharmonic ambiguities (i.e. fis vs. ges). Valid value for KEY is any pitch having less than two accidentals, in current language (--lang; this option must precede --key in order to have effect).

Run --sample-sheet Produce complete Lilypond file showing all possible rhythm notations and chromatic scale in all possible keys (see --key). It is influenced by --meter, --grain and also user-defined notations (see --script).

Strip leading and trailing rests from output. First and last bars may thus be incomplete.
Output can be fed directly into Lilypond. It will be one--line staff in violin clef and key signature as determined by --accidentals.
Set number of sharps or flats (if NUM is positive or negative, respectively) for full Lilypond output. No effect without --full.
Run guile script FILE before beginning. See section 5. Scripting.
Use ALSA interface. If argument is specified, connect input to client IC on port IP and output to OC:OP. By default, Rumor will try to use 64:0,65:0. If connection fails, you can use aconnect to do this manually.

If you specify only one pair C:P, it will be the output port. This is useful with --kbd.

Use OSS interface. Device number 0 on /dev/sequencer will be used, unless overridden by DEV.
Emulate MIDI keyboard using ordinary keyboard. An ordinary MIDI interface (ALSA or OSS) is still needed for metronome and echoing. Standard input must be a terminal. There is a usable keyboard layout builtin; however, key bindings are configurable via (rumor-kbd ...) (see section 5. Scripting).
Be verbose. This option may be used more times and every time will increase verbosity level by 1. If it is greater than 3 and Rumor was compiled with debuggins support, debugging and tracing messages will be printed. If verbosity is zero (default), Rumor will only report errors.


Rumor's only purpose is to help out with music transcriptions (even of polyphonic music with separated voices); typical usage is to write Lilypond file skeleton by hand and then paste Rumor output into it. It does not want to be a full-blown quantization program; fancy features like tuplets, polyphony and tempo tracking were ommited deliberately.

Rumor mimics handwritten Lilypond source:

(1) it uses relative notation and omits note length if it has not changed (both can be switched off though).

(2) it writes rhythms intelligently, in relation to bar position (tied single notes, over barlines if necessary)

(3) it resolves enharmonic ambiguities (e.g. gis/as) given the --key=NOTE option (see section 4. Invocation)

(4) It is scriptable, with support for user-defined rhythm notations, keyboard layout and pitch names (dutch and italian being built-in). See section 5. Scripting.

(5) It supports chords (simlutaneous notes), using the <c e>8 syntax.

(6) It can talk to MIDI I/O via ALSA or OSS.

(7) It can emulate MIDI keyboard using ordinary (computer) keyboard, key layout being scriptable.


Should be rewritten in python. Otherwise no known bugs.


A minimalistic rumor session follows (play keyboard, then press ^-C).

  vaclav@frigo:~/ujf/quant/rumor$ ./rumor -m68 -kb -g32
  b'8 ~ b32 a g fis g16 e cis8 ~ cis16 g' fis8 |
  e d b4 ais8 r |
  ais b32 a g fis g16 e' g, fis32 e fis16 cis' e, cis' |
  e, d32 cis d16 b' ~ b ais ~ ais32 cis b ais b16 d ~ d cis ~|
  cis32 e d cis d16 fis ~ fis e ~ e32 g fis e fis16 b ~ b ais |
  b32 a gis fis gis16 b eis, fis ~ fis32 fis eis dis eis16 gis ais, b ~|
  b32 b ais gis ais16 cis eis, fis d'8 cis

-m68 (or equivalently, --meter=6/8) sets six-eights bar, -kb (--key=b) indicates b-based scale, -g32 (--grain=32) sets resolution to 32nd notes.


Vaclav Smilauer

thanks to:
  Graham Percival for many bug reports and suggestions
  Nicolas Sceaux for several suggestions