Forcer une gamme musicale en midi

Contenu du snippet

Ce code utilise un algorythme simple qui permet d'appliquer une transposition midi aux messages midi de types note on/note off.Il est utilisable dans le contexte d'un instruemnt vsti ou d'une application midi.

Source / Exemple :


type
TScale  = array [0..11] of integer;

====================================================================

    Scale: TScale;

// les gammes courantes converties en table de transposition

                    //     Db     Eb        Gb     Ab     Bb
  const            //   C  C#  D  D#  E  F  F#  G  G#  A  A#  B
    Maj    : TScale = ( 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, 0);
    MinNat : TScale = ( 0, -1, 0,  0,-1, 0, -1, 0, -1, 0,  0,-1);
    MinMelo: TScale = ( 0, -1, 0,  0,-1, 0, -1, 0,  0,-1, -1, 0);
    MinHarm: TScale = ( 0, -1, 0,  0,-1, 0, -1, 0,  0,-1,  0,-1);
    _7ThDom: Tscale = ( 0, -1, 0, -1, 0, 0, -1, 0, -1, 0,  0,-1);
    DoriMin: Tscale = ( 0, -1, 0,  0,-1, 0, -1, 0, -1, 0,  0,-1);
    Locrian: Tscale = ( 0,  0,-1,  0,-1, 0,  0,-1,  0,-1,  0,-1);
    Dim    : TScale = ( 0, -1, 0,  0,-1, 0,  0,-1,  0, 0, -1, 0);
    PentMaj: Tscale = ( 0, -1, 0, -1, 0,-1, -2, 0, -1, 0, -1,-2);
    PentMin: Tscale = ( 0, -1,-2,  0,-1, 0, -1, 0, -1,-2,  0,-1);
    Blues  : Tscale = ( 0, -1,-2,  0,-1, 0,  0, 0, -1,-2,  0,-1);
    DemiTT : Tscale = ( 0, -1, 0, -1, 0,-1,  0,-1,  0,-1,  0,-1);
    TT     : Tscale = ( 0, -1, 0, -1, 0,-1,  0,-1,  0,-1,  0,-1);
    BBmaj  : Tscale = ( 0, -1, 0, -1, 0, 0, -1, 0,  0, 0, -1, 0);
    BBDom  : Tscale = ( 0, -1, 0, -1, 0, 0, -1, 0, -1, 0,  0, 0);
    BBmin  : TScale = ( 0, -1, 0,  0, 0, 0, -1, 0, -1, 0,  0,-1);
    Lydian : TScale = ( 0, -1, 0, -1, 0,-1,  0, 0, -1, 0, -1, 0);
    LydDom : Tscale = ( 0, -1, 0, -1, 0,-1,  0, 0, -1, 0,  0,-1);
    Augm   : Tscale = ( 0, -1,-2,  0, 0,-1, -2, 0,  0,-1, -2, 0);
    Phryg  : TScale = ( 0,  0,-1,  0,-1, 0, -1, 0,  0,-1,  0,-1);
    TFullD : Tscale = ( 0,  0,-1,  0, 0,-1,  0,-1,  0,-1,  0,-1);

========================================================================

procedure processMIDI(time,status,channel,data1,data2:integer);
begin
  if (Status=$90) or (Status=$80) then
    begin                // scale = pointer vers une des TScale déclarée en constante
      n:= data1 mod 12; // détéction de la note courante quelque soit l'octave
      n:= scale[n]+key; // key = dominante de la gamme , on ajoute la valeur de transposition
      data1:= data1+n;  // à la valeur initiale
    end;
  case status of
    $80: MIDI_NoteOff(channel,data1,data2,0);    // sortie midi spécifique au programme :
    $90: MIDI_NoteOn(channel,data1,data2,0);     // thru (in = out) sauf s'il faut transposer.
    $A0: MIDI_PolyAftertouch(channel,data1,data2,0);
    $B0: MIDI_CC(channel,data1,data2,0);
    $C0: MIDI_ProgramChange(channel,data1,0);
    $D0: MIDI_ChannelAftertouch(channel,data1,0);
    $E0: MIDI_PitchBend2(channel,data1,data2,0);
  end;

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.