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;
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.