Frammenti LilyPond: MIDI

# MIDI

Creating MIDI output

## Impostare l’output MIDI su un canale per voce

Nella creazione del file di output MIDI, il comportamento predefinito prevede che ogni rigo sia assegnato a un canale MIDI, con tutte le voci del rigo amalgamate in un canale. Ciò diminuisce il rischio di esaurire i canali MIDI disponibili, dato che ce ne sono solo 16 per traccia.

Tuttavia, spostando `Staff_performer` nel contesto `Voice`, ogni voce in un rigo può avere il proprio canale MIDI, come è illustrato nell’esempio seguente: sebbene le voci siano sullo stesso rigo, vengono creati due canali MIDI, ciascuno con un diverso strumento MIDI (`midiInstrument`).

    \score {
      \new Staff <<
        \new Voice \relative c''' {
          \set midiInstrument = #"flute"
          \voiceOne
          \key g \major
          \time 2/2
          r2 g-"Flute" ~
          g fis ~
          fis4 g8 fis e2 ~
          e4 d8 cis d2
        }
        \new Voice \relative c'' {
          \set midiInstrument = #"clarinet"
          \voiceTwo
          b1-"Clarinet"
          a2. b8 a
          g2. fis8 e
          fis2 r
        }
      >>
      \layout { }
      \midi {
        \context {
          \Staff
          \remove "Staff_performer"
        }
        \context {
          \Voice
          \consists "Staff_performer"
        }
        \tempo 2 = 72
      }
    }

## Modificare il tempo senza mostrare l’indicazione metronomica

Per cambiare il tempo del file MIDI senza che appaia l’indicazione metronomica, basta renderla invisibile.

    \score {
      \new Staff \relative c' {
        \tempo 4 = 160
        c4 e g b
        c4 b d c
        \set Score.tempoHideNote = ##t
        \tempo 4 = 96
        d,4 fis a cis
        d4 cis e d
      }
      \layout { }
      \midi { }
    }

## Creare dinamiche personalizzate nell’output MIDI

L’esempio seguente mostra come creare un segno di dinamica, non incluso nell’elenco predefinito, e assegnargli un valore specifico così che possa essere usato per cambiare l’output MIDI.

Al segno di dinamica `\rfz` viene assegnato il valore `0.9`.

    #(define (myDynamics dynamic)
        (if (equal? dynamic "rfz")
          0.9
          (default-dynamic-absolute-volume dynamic)))

    \score {
      \new Staff {
        \set Staff.midiInstrument = #"cello"
        \set Score.dynamicAbsoluteVolumeFunction = #myDynamics
        \new Voice {
          \relative {
            a'4\pp b c-\rfz
          }
        }
      }
      \layout {}
      \midi {}
    }

## Customized drum notation in printed and MIDI output

Customized drum “pitch” names (suitable for a custom drum style, for example) may be used both in printed and MIDI output by defining such variables as `drumPitchNames`, `drumStyleTable` and `midiDrumPitches`, as demonstrated here. In short, this snippet:

- defines some "pitch" names
- defines how they will be rendered
- tell LilyPond to use them for layout
- assigns pitches to the names
- tell LilyPond to use them for MIDI output

    %% This snippet tries to amend
    %% NR 2.5.1 Common notation for percussion - Custom percussion staves
    %% http://lilypond.org/doc/v2.18/Documentation/notation/common-notation-for-percussion#custom-percussion-staves

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%
    %% To use custom drum-pitch-names for your score and midi you need to follow
    %% this route:
    %%
    %%%%%%%%%%%%
    %% LAYOUT:
    %%%%%%%%%%%%
    %%
    %% (1) Define a name and put it in `drumPitchNames'
    %%     This can be done at toplevel with
    %%         drumPitchNames.my-name  = #'my-name
    %%     It's possible to add an alias as well.
    %% (2) Define how it should be printed
    %%     Therefore put them into a toplevel-list, where each entry should look:
    %%         (my-name
    %%           note-head-style-or-default
    %%             articulation-string-or-#f
    %%               staff-position)
    %%     Example:
    %%         #(define my-style
    %%           '(
    %%             (my-name default "tenuto" -1)
    %%             ; ...
    %%             ))
    %% (3) Tell LilyPond to use this custom-definitions, with
    %%         drumStyleTable = #(alist->hash-table my-style)
    %%     in a \layout or \with
    %%
    %%     Now we're done for layout, here a short, but complete example:
    %%         \new DrumStaff
    %%           \with { drumStyleTable = #(alist->hash-table my-style) }
    %%           \drummode { my-name }
    %%
    %%%%%%%%%%%%
    %% MIDI:
    %%%%%%%%%%%%
    %%
    %% (1) Again at toplvel, assign a pitch to your custom-note-name
    %%         midiDrumPitches.my-name = ges
    %%     Note that you have to use the name, which is in drumPitchNames, no alias
    %% (2) Tell LilyPond to use this pitch(es), with
    %%         drumPitchTable = #(alist->hash-table midiDrumPitches)
    %%
    %%     Example:
    %%         \score {
    %%            \new DrumStaff
    %%             \with {
    %%               drumStyleTable = #(alist->hash-table my-style)
    %%               drumPitchTable = #(alist->hash-table midiDrumPitches)
    %%             }
    %%             \drummode { my-name4 }
    %%           \layout {}
    %%           \midi {}
    %%         }
    %%
    %%%%%%%%%%%%
    %% TESTING
    %%%%%%%%%%%%
    %%
    %% To test whether all is fine, run the following sequence in terminal:
    %%         lilypond my-file.ly
    %%         midi2ly my-file.midi
    %%         gedit my-file-midi.ly
    %%
    %% Which will do:
    %% 1. create pdf and midi
    %% 2. transform the midi back to a .ly-file
    %%    (note: midi2ly is not always good in correctly identifying enharmonic pitches)
    %% 3. open this file in gedit (or use another editor)
    %% Now watch what you've got.
    %%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %% FULL EXAMPLE
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    drumPitchNames.dbass      = #'dbass
    drumPitchNames.dba        = #'dbass  % 'db is in use already
    drumPitchNames.dbassmute  = #'dbassmute
    drumPitchNames.dbm        = #'dbassmute
    drumPitchNames.do         = #'dopen
    drumPitchNames.dopenmute  = #'dopenmute
    drumPitchNames.dom        = #'dopenmute
    drumPitchNames.dslap      = #'dslap
    drumPitchNames.ds         = #'dslap
    drumPitchNames.dslapmute  = #'dslapmute
    drumPitchNames.dsm        = #'dslapmute

    #(define djembe
      '((dbass      default  #f         -2)
        (dbassmute  default  "stopped"  -2)
        (dopen      default  #f          0)
        (dopenmute  default  "stopped"   0)
        (dslap      default  #f          2)
        (dslapmute  default  "stopped"   2)))

    midiDrumPitches.dbass = g
    midiDrumPitches.dbassmute = fis
    midiDrumPitches.dopen =  a
    midiDrumPitches.dopenmute = gis
    midiDrumPitches.dslap =  b
    midiDrumPitches.dslapmute = ais

    one = \drummode { r4 dba4 do ds r dbm dom dsm }

    \score {
       \new DrumStaff
        \with {
          \override StaffSymbol.line-count =  #3
          instrumentName = #"Djembe "
          drumStyleTable = #(alist->hash-table djembe)
          drumPitchTable = #(alist->hash-table midiDrumPitches)
        }
        \one
      \layout {}
      \midi {}
    }

## Demo MidiInstruments

Problem: How to know which `midiInstrument` would be best for your composition?

Solution: A LilyPond demo file.

    \header {
      title = "Demo of all midi sounds"
      arranger = "Myself "
    }

    baseMelody = \relative c' {
      c4.\mf g c16 b' c d
      e16 d e f g4 g'4 r
      R1
    }
    melody = {
      \tempo 4 = 150
      \baseMelody
    }

    \score {
      \new Staff <<
        \new Voice \melody
      >>
      \layout { }
    }

    \score {
      \new Staff <<
        \new Voice {
          r\mf
          \set Staff.midiInstrument = #"acoustic grand" \melody
          \set Staff.midiInstrument = #"bright acoustic" \melody
          \set Staff.midiInstrument = #"electric grand" \melody
          \set Staff.midiInstrument = #"honky-tonk" \melody
          \set Staff.midiInstrument = #"electric piano 1" \melody
          \set Staff.midiInstrument = #"electric piano 2" \melody
          \set Staff.midiInstrument = #"harpsichord" \melody
          \set Staff.midiInstrument = #"clav" \melody
          \set Staff.midiInstrument = #"celesta" \melody
          \set Staff.midiInstrument = #"glockenspiel" \melody
          \set Staff.midiInstrument = #"music box" \melody
          \set Staff.midiInstrument = #"vibraphone" \melody
          \set Staff.midiInstrument = #"marimba" \melody
          \set Staff.midiInstrument = #"xylophone" \melody
          \set Staff.midiInstrument = #"tubular bells" \melody
          \set Staff.midiInstrument = #"dulcimer" \melody
          \set Staff.midiInstrument = #"drawbar organ" \melody
          \set Staff.midiInstrument = #"percussive organ" \melody
          \set Staff.midiInstrument = #"rock organ" \melody
          \set Staff.midiInstrument = #"church organ" \melody
          \set Staff.midiInstrument = #"reed organ" \melody
          \set Staff.midiInstrument = #"accordion" \melody
          \set Staff.midiInstrument = #"harmonica" \melody
          \set Staff.midiInstrument = #"concertina" \melody
          \set Staff.midiInstrument = #"acoustic guitar (nylon)" \melody
          \set Staff.midiInstrument = #"acoustic guitar (steel)" \melody
          \set Staff.midiInstrument = #"electric guitar (jazz)" \melody
          \set Staff.midiInstrument = #"electric guitar (clean)" \melody
          \set Staff.midiInstrument = #"electric guitar (muted)" \melody
          \set Staff.midiInstrument = #"overdriven guitar" \melody
          \set Staff.midiInstrument = #"distorted guitar" \melody
          \set Staff.midiInstrument = #"acoustic bass" \melody
          \set Staff.midiInstrument = #"electric bass (finger)" \melody
          \set Staff.midiInstrument = #"electric bass (pick)" \melody
          \set Staff.midiInstrument = #"fretless bass" \melody
          \set Staff.midiInstrument = #"slap bass 1" \melody
          \set Staff.midiInstrument = #"slap bass 2" \melody
          \set Staff.midiInstrument = #"synth bass 1" \melody
          \set Staff.midiInstrument = #"synth bass 2" \melody
          \set Staff.midiInstrument = #"violin" \melody
          \set Staff.midiInstrument = #"viola" \melody
          \set Staff.midiInstrument = #"cello" \melody
          \set Staff.midiInstrument = #"contrabass" \melody
          \set Staff.midiInstrument = #"tremolo strings" \melody
          \set Staff.midiInstrument = #"pizzicato strings" \melody
          \set Staff.midiInstrument = #"orchestral harp" \melody
          \set Staff.midiInstrument = #"timpani" \melody
          \set Staff.midiInstrument = #"string ensemble 1" \melody
          \set Staff.midiInstrument = #"string ensemble 2" \melody
          \set Staff.midiInstrument = #"synthstrings 1" \melody
          \set Staff.midiInstrument = #"synthstrings 2" \melody
          \set Staff.midiInstrument = #"choir aahs" \melody
          \set Staff.midiInstrument = #"voice oohs" \melody
          \set Staff.midiInstrument = #"synth voice" \melody
          \set Staff.midiInstrument = #"orchestra hit" \melody
          \set Staff.midiInstrument = #"trumpet" \melody
          \set Staff.midiInstrument = #"trombone" \melody
          \set Staff.midiInstrument = #"tuba" \melody
          \set Staff.midiInstrument = #"muted trumpet" \melody
          \set Staff.midiInstrument = #"french horn" \melody
          \set Staff.midiInstrument = #"brass section" \melody
          \set Staff.midiInstrument = #"synthbrass 1" \melody
          \set Staff.midiInstrument = #"synthbrass 2" \melody
          \set Staff.midiInstrument = #"soprano sax" \melody
          \set Staff.midiInstrument = #"alto sax" \melody
          \set Staff.midiInstrument = #"tenor sax" \melody
          \set Staff.midiInstrument = #"baritone sax" \melody
          \set Staff.midiInstrument = #"oboe" \melody
          \set Staff.midiInstrument = #"english horn" \melody
          \set Staff.midiInstrument = #"bassoon" \melody
          \set Staff.midiInstrument = #"clarinet" \melody
          \set Staff.midiInstrument = #"piccolo" \melody
          \set Staff.midiInstrument = #"flute" \melody
          \set Staff.midiInstrument = #"recorder" \melody
          \set Staff.midiInstrument = #"pan flute" \melody
          \set Staff.midiInstrument = #"blown bottle" \melody
          \set Staff.midiInstrument = #"shakuhachi" \melody
          \set Staff.midiInstrument = #"whistle" \melody
          \set Staff.midiInstrument = #"ocarina" \melody
          \set Staff.midiInstrument = #"lead 1 (square)" \melody
          \set Staff.midiInstrument = #"lead 2 (sawtooth)" \melody
          \set Staff.midiInstrument = #"lead 3 (calliope)" \melody
          \set Staff.midiInstrument = #"lead 4 (chiff)" \melody
          \set Staff.midiInstrument = #"lead 5 (charang)" \melody
          \set Staff.midiInstrument = #"lead 6 (voice)" \melody
          \set Staff.midiInstrument = #"lead 7 (fifths)" \melody
          \set Staff.midiInstrument = #"lead 8 (bass+lead)" \melody
          \set Staff.midiInstrument = #"pad 1 (new age)" \melody
          \set Staff.midiInstrument = #"pad 2 (warm)" \melody
          \set Staff.midiInstrument = #"pad 3 (polysynth)" \melody
          \set Staff.midiInstrument = #"pad 4 (choir)" \melody
          \set Staff.midiInstrument = #"pad 5 (bowed)" \melody
          \set Staff.midiInstrument = #"pad 6 (metallic)" \melody
          \set Staff.midiInstrument = #"pad 7 (halo)" \melody
          \set Staff.midiInstrument = #"pad 8 (sweep)" \melody
          \set Staff.midiInstrument = #"fx 1 (rain)" \melody
          \set Staff.midiInstrument = #"fx 2 (soundtrack)" \melody
          \set Staff.midiInstrument = #"fx 3 (crystal)" \melody
          \set Staff.midiInstrument = #"fx 4 (atmosphere)" \melody
          \set Staff.midiInstrument = #"fx 5 (brightness)" \melody
          \set Staff.midiInstrument = #"fx 6 (goblins)" \melody
          \set Staff.midiInstrument = #"fx 7 (echoes)" \melody
          \set Staff.midiInstrument = #"fx 8 (sci-fi)" \melody
          \set Staff.midiInstrument = #"sitar" \melody
          \set Staff.midiInstrument = #"banjo" \melody
          \set Staff.midiInstrument = #"shamisen" \melody
          \set Staff.midiInstrument = #"koto" \melody
          \set Staff.midiInstrument = #"kalimba" \melody
          \set Staff.midiInstrument = #"bagpipe" \melody
          \set Staff.midiInstrument = #"fiddle" \melody
          \set Staff.midiInstrument = #"shanai" \melody
          \set Staff.midiInstrument = #"tinkle bell" \melody
          \set Staff.midiInstrument = #"agogo" \melody
          \set Staff.midiInstrument = #"steel drums" \melody
          \set Staff.midiInstrument = #"woodblock" \melody
          \set Staff.midiInstrument = #"taiko drum" \melody
          \set Staff.midiInstrument = #"melodic tom" \melody
          \set Staff.midiInstrument = #"synth drum" \melody
          \set Staff.midiInstrument = #"reverse cymbal" \melody
          \set Staff.midiInstrument = #"guitar fret noise" \melody
          \set Staff.midiInstrument = #"breath noise" \melody
          \set Staff.midiInstrument = #"seashore" \melody
          \set Staff.midiInstrument = #"bird tweet" \melody
          \set Staff.midiInstrument = #"telephone ring" \melody
          \set Staff.midiInstrument = #"helicopter" \melody
          \set Staff.midiInstrument = #"applause" \melody
          \set Staff.midiInstrument = #"gunshot" \melody
        }
      >>
      \midi { }
    }

## Modificare l’equalizzazione predefinita degli strumenti MIDI

L’equalizzatore predefinito degli strumenti MIDI può essere modificato impostando la proprietà `instrumentEqualizer` nel contesto `Score` come una procedura Scheme definita dall’utente che usi il nome dello strumento MIDI come argomento insieme a una coppia di frazioni indicanti i volumi minimi e massimi da applicare a quello specifico strumento.

L’esempio seguente imposta i volumi massimo e minimo per il flauto e per il clarintetto.

    #(define my-instrument-equalizer-alist '())

    #(set! my-instrument-equalizer-alist
      (append
        '(
          ("flute" . (0.7 . 0.9))
          ("clarinet" . (0.3 . 0.6)))
        my-instrument-equalizer-alist))

    #(define (my-instrument-equalizer s)
      (let ((entry (assoc s my-instrument-equalizer-alist)))
        (if entry
          (cdr entry))))

    \score {
      <<
        \new Staff {
          \key g \major
          \time 2/2
          \set Score.instrumentEqualizer = #my-instrument-equalizer
          \set Staff.midiInstrument = "flute"
          \new Voice \relative {
            r2 g''\mp g fis~
            4 g8 fis e2~
            4 d8 cis d2
          }
        }
        \new Staff {
          \key g \major
          \set Staff.midiInstrument = "clarinet"
          \new Voice \relative {
            b'1\p a2. b8 a
            g2. fis8 e
            fis2 r
          }
        }
      >>
      \layout { }
      \midi {  }
    }

#### LilyPond — Frammenti v2.22.2 (ramo stabile).