MEL

2010–2024

NAME

mel - generate sound fragments from plain text

SYNOPSIS

mel [[[wavefile ...] infile] outfile]

DESCRIPTION

Interpret ASCII input in infile as audio and save it to outfile in the WAVE format, optionally using samples provided in wavefiles. The syntax for infile is given below. Filenames default to /dev/stdin or /dev/stdout. The dash (-) is a shorthand for the default value. Try stdin if /dev/stdin is not available.

SYNTAX

infile shall contain words w (sequences of lowercase letters a to z and hashes #), numbers n (sequences of digits 0 to 9, decimal points ., and a dividing colon :), and commands (other single ASCII characters). Commands are followed by words and/or numbers as arguments, as listed below. The input is processed linearly, whereby unexpected characters, including whitespace, act as separators and are otherwise ignored. Reference values imply initial values, and initial values imply current values.

~w[n]

Choose wave sample of shape w and duration n in seconds. This is the building block for sound at arbitrary frequency and amplitude. Predefined values for w are listed below. The corresponding spectra are shown by the command harmonics w. If w reads #, the first channel of the nth wavefile given on the command line is loaded instead. n defaults to 1. The preset value is a circular wave that lasts 1 second.

harmonic

sin(x) for x in (0, 2π]

power

sin³(x) for x in (0, 2π]

major

sin⁵(x) for x in (0, 2π]

constant

sgn(sin(x)) for x in (0, 2π]

linear

2/π arcsin(sin(x)) for x in (0, 2π]

quadratic

sgn(x) (2|x| - x²) for x in (-2, 2]

circular

sgn(x) sqrt(2|x| - x²) for x in (-2, 2]

cubic

3/2 sqrt(3) (x³ - x) for x in (-1, 1]

water

3/2 sqrt(3) (x³ - x) + 1/2 for x in (0, 1]

random

White noise if followed by @ without argument.

Sw[n]

Choose attack envelope. Arguments as above. Predefined values for w are listed below. The preset value is a circular envelope that lasts 0.1 seconds.

harmonic

sin(x) for x in (0, π/2)

smooth

sin²(x) for x in (0, π/2)

power

sin³(x) for x in (0, π/2)

major

sin⁵(x) for x in (0, π/2)

linear

x for x in (0, 1)

quadratic

1 - x² for x in (-1, 0)

circular

sqrt(1 - x²) for x in (-1, 0)

cubic

3x² - 2x² for x in (0, 1)

Zw[n]

Choose release envelope. Arguments as above.

Nw[n]

Choose attack and release envelope at once. Arguments as above.

*

Start/end a comment.

$n

Set a sample rate of n samples per second. The preset value is 44100 samples per second. This setting holds globally and is ignored after first note played.

On

Set number of channels to n. Allowed values are 1 (mono) and 2 (stereo). If absent, the number of channels is determined automatically.

|n

Set duration of a beat to n seconds. The preset value is 0.5 seconds.

Tw

Choose tuning from the below options. The preset value is equal.

equal

Equal temperament.

pyth

Pythagorean tuning. All notes are reached combining fifths and octaves.

just

Just intonation. All notes are reached combining thirds, -1 to 2 fifths from keynote, and octaves.

close

Five-limit tuning closest to twelve-tone equal temperament.

Hn

Divide one octave into n halftones/steps of equal frequency ratio. The preset value is 12 halftones (twelve-tone equal temperament).

@[n]

Set reference frequency and concert pitch A4 to n Hz. n defaults to the inverse length of the current wave sample. This allows for playing this sample at its original speed. The preset value is 440 Hz.

&n

Set reference amplitude sqrt(L² + R²) to n arb. units. The preset value is 1 arb. unit.

%n

Set reference amplitude ratio R:L between right and left channel to n. The preset value is 1.

C D E F G A B[w][n[n']]

Set reference frequency via note name. w marks accidentals and can be #, x, b, bb, and so on. To raise and lower the frequency by a diatonic (septimal) [eleven] {Pythagorean} comma 81:80 (64:63) [33:32] {531441:524288}, use u and v (s and z) [i and j] {p and d}, respectively. Please note that the note name already implies a certain number of diatonic commas for the tunings just and close. n is the octave number and defaults to the integer that minimizes the interval from the current frequency. If omitted, also set the keynote. The preset keynote is C. n' is an optional microtonal accidental as used in the Functional Just System (FJS) by misotanni (https://misotanni.github.io/fjs). Here, compound accidentals must be written as a product and otonal and utonal accidentals are separated by a colon (:). A4 is the concert pitch.

R

Set reference frequency, amplitude, and amplitude ratio to current values. E.g., as a prefix to - or +, this allows for relative frequency shifts.

'[n]

Play sound for a duration of n beats. n defaults to 1.

"[n]

Pause for a duration of n beats. n defaults to 1.

`[n]

Rewind by n beats. n defaults to 1. (Negative pause.)

Qn

Set initial frequency to n times the reference frequency.

V U[w]n

Set initial frequency to n chromatic steps below/above the reference. You can use the same commas w as with note names. The 12-tone scale is made of the -5 to 6th fifths from the keynote.

- +n

Set initial frequency to n halftones below/above the reference.

\ /n

Continuously lower/raise current frequency by n halftones during the next play period (').

_ ^n

Continuously lower/raise current frequency by n halftones per beat from now on.

? !n

Set initial amplitude to n dB below/above the reference.

< >n

Continuously lower/raise current amplitude by n dB during the next play period (').

, ;n

Continuously lower/raise current amplitude by n dB per beat from now on.

[ ]n

Set initial amplitude ratio to n dB below/above the reference.

( )n

Continuously lower/raise current amplitude ratio by n dB during the next play period (').

{ }n

Continuously lower/raise current amplitude ratio by n dB per beat from now on.

=

Introduce discontinuity. (Play the same note again.)

P[n]

Set phase, i.e., the time integral of the frequency, to n. It is only defined modulo one.

M[n]

Set nth time mark. n must be an integer between 0 and 99 and defaults to 0.

W[n]

Wind back to nth time mark, if set. n defaults to 0.

Yn n'[n"]

Yank sound between nth and n'th time mark and insert it n" times, if marks have been set. n" defaults to 1.

I[n]

Set nth text mark. n must be an integer between 0 and 99 and defaults to 0.

J[n[n']]

Jump back to nth text mark, if set. This works n' times in a row. n and n' default to 0 and 1, respectively. If n' is 0, it is set to the maximum allowed value (32767).

K L[n ...]

Skip/only consider subsequent command if the number of the current iteration matches any of the integers n ...

Xw[...]

Do something special.

loudnessn

Switch loudness on (n nonzero) and off again (n zero). Loudness boosts low notes by scaling the amplitude with the inverse frequency (in units of A4). This keeps the acoustic-pressure rather than the particle-displacement amplitude constant. n defaults to 1.

status

Print current time, frequency, amplitude, balance, and phase.

report

Print note counts (since last report) to standard error stream. Only notes defined via the commands C D E F G A B and U V are counted. This is useful to, e.g., to determine the keynote of a piece of music.

detunen

Randomly detune reference frequency and concert pitch A4, by up to n halftones. In combination with text and time marks, this is useful to generate non-white noise.

deleten n'

Delete sound between nth and n'th time mark, if marks have been set.

reversen n'

Reverse sound between nth and n'th time mark, if marks have been set.

vibraton n' m m'

Apply vibrato to sound between nth and n'th time mark, if marks have been set. The sample is periodically delayed (and advanced) with an amplitude of m seconds and a frequency of m' per sample length, using the current wave sample.

flangern n' m m'

Apply flanger to sound between nth and n'th time mark, if marks have been set. The sample is periodically delayed (and advanced) with an amplitude of m seconds and a frequency of m' per sample length, using the current wave sample, and superimposed with itself.