Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Einfache MIDI Klasse - Welcher Ton ist welche Zahl? (MMSystem) (https://www.delphipraxis.net/179659-einfache-midi-klasse-welcher-ton-ist-welche-zahl-mmsystem.html)

milos 23. Mär 2014 06:08

Einfache MIDI Klasse - Welcher Ton ist welche Zahl? (MMSystem)
 
Hallo,

habe eine einfache MIDI Klasse aus dem Netz gefunden:

Delphi-Quellcode:
unit MIDISound;

interface

uses
  MMSystem;

type
  TMIDIInstrument = (midiAcousticGrandPiano, midiBrightAcousticPiano,
                     midiElectricGrandPiano, midiHonkyTonkPiano,
                     midiRhodesPiano, midiChorusedPiano, midiHarpsichord,
                     midiClavinet, midiCelesta, midiGlockenspiel,
                     midiMusicBox, midiVibraphone, midiMarimba, midiXylophone,
                     midiTubularBells, midiDulcimer, midiHammondOrgan,
                     midiPercussiveOrgan, midiRockOrgan, midiChurchOrgan,
                     midiReedOrgan, midiAccordion, midiHarmonica,
                     midiTangoAccordion, midiAcousticGuitarNylon,
                     midiAcousticGuitarSteel, midiElectricGuitarJazz,
                     midiElectricGuitarClean, midiElectricGuitarMuted,
                     midiOverdrivenGuitar, midiDistortionGuitar,
                     midiGuitarHarmonics, midiAcousticBass, midiElectricBassFinger,
                     midiElectricBassPick, midiFretlessBass, midiSlapBass1,
                     midiSlapBass2, midiSynthBass1, midiSynthBass2, midiViolin,
                     midiViola, midiCello, midiContrabass, midiTremoloStrings,
                     midiPizzicatoStrings, midiOrchestralHarp, midiTimpani,
                     midiStringEnsemble1, midiStringEnsemble2, midiSynthStrings1,
                     midiSynthStrings2, midiChoirAahs, midiVoiceOohs,
                     midiSynthVoice, midiOrchestraHit, midiTrumpet, midiTrombone,
                     midiTuba, midiMutedTrumpet, midiFrenchHorn, midiBrassSection,
                     midiSynthBrass1, midiSynthBrass2, midiSopranoSax, midiAltoSax,
                     midiTenorSax, midiBaritoneSax, midiOboe, midiEnglishHorn,
                     midiBassoon, midiClarinet, midiPiccolo, midiFlute,
                     midiRecorder, midiPanFlute, midiBottleBlow, midiShakuhachi,
                     midiWhistle, midiOcarina, midiLead1Square,
                     midiLead2Sawtooth, midiLead3CalliopeLead, midiLead4ChiffLead,
                     midiLead5Charang, midiLead6Voice, midiLead7Fifths,
                     midiLead8BrassLead, midiPad1NewAge, midiPad2Warm,
                     midiPad3Polysynth, midiPad4Choir, midiPad5Bowed,
                     midiPad6Metallic, midiPad7Halo, midiPad8Sweep, midiEmpty0,
                     midiEmpty1, midiEmpty2, midiEmpty3, midiEmpty4, midiEmpty5,
                     midiEmpty6, midiEmpty7, midiEmpty8, midiEmpty9, midiEmpty10,
                     midiEmpty11, midiEmpty12, midiEmpty13, midiEmpty14,
                     midiEmpty15, midiEmpty16, midiEmpty17, midiEmpty18,
                     midiEmpty19, midiEmpty20, midiEmpty21, midiEmpty22,
                     midiEmpty23, midiGuitarFretNoise, midiBreathNoise,
                     midiSeashore, midiBirdTweet, midiTelephoneRing,
                     midiHelicopter, midiApplause, midiGunshot);

  procedure MIDIInit;
  function MIDIEncodeMessage(Msg, Param1, Param2: integer): integer;
  procedure SetCurrentInstrument(CurrentInstrument: TMIDIInstrument);
  procedure NoteOn(NewNote, NewIntensity: byte);
  procedure NoteOff(NewNote, NewIntensity: byte);
  procedure SetPlaybackVolume(PlaybackVolume: cardinal);

implementation

var
  mo: HMIDIOUT;

const
  MIDI_NOTE_ON = $90;
  MIDI_NOTE_OFF = $80;
  MIDI_CHANGE_INSTRUMENT = $C0;
  MIDI_DEVICE = 0;
  MIDI_VEL = 108;

procedure MIDIInit;
begin
  midiOutOpen(@mo, MIDI_DEVICE, 0, 0, CALLBACK_NULL);
  SetPlaybackVolume($FFFFFFFF);
end;

function MIDIEncodeMessage(Msg, Param1, Param2: integer): integer;
begin
  result := Msg + (Param1 shl 8) + (Param2 shl 16);
end;

procedure SetCurrentInstrument(CurrentInstrument: TMIDIInstrument);
begin
  midiOutShortMsg(mo, MIDIEncodeMessage(MIDI_CHANGE_INSTRUMENT, ord(CurrentInstrument), 0));
end;

procedure NoteOn(NewNote, NewIntensity: byte);
begin
  midiOutShortMsg(mo, MIDIEncodeMessage(MIDI_NOTE_ON, NewNote, NewIntensity));
end;

procedure NoteOff(NewNote, NewIntensity: byte);
begin
  midiOutShortMsg(mo, MIDIEncodeMessage(MIDI_NOTE_OFF, NewNote, NewIntensity));
end;

procedure SetPlaybackVolume(PlaybackVolume: cardinal);
begin
  midiOutSetVolume(mo, PlaybackVolume);
end;
end.
Etwas abspielen kann man ganz leicht, z.B. so:

Delphi-Quellcode:
procedure TForm1.FormActivate(Sender: TObject);
begin
  MIDIInit;
  SetCurrentInstrument(midiPad7Halo);

  NoteOn(50,127);
  sleep(3000);
  NoteOff(50,127);
end;
50 ist die Tonhöhe und 127 die Lautstärke.
Wie kann ich herausfinden welcher Ton welche Zahl ist?

Es geht um eine einfache Klinger bei uns in der Firma die man selbst "komponieren" können sollte.

Der Editor wird hier hochgeladen sobald ich fertig damit bin. :)

MfG

ElektroLurch 23. Mär 2014 07:17

AW: Einfache MIDI Klasse - Welcher Ton ist welche Zahl? (MMSystem)
 
Meinen Gruß
Die Töne einer Oktave sind ja
C, C#, D, D#, E, F, F#, G, G#, A, A#, H. (Deutsch)
Also 12 Töne.
Deine 50 mod 12 ergibt den Ton in der Oktave, 50 div 12 ergibt die Oktave selbst.
Der Midi-Tonbereich geht von 0..127.
Damit kann man die Tonnamen und ihre Lage bestimmen.

milos 23. Mär 2014 07:29

AW: Einfache MIDI Klasse - Welcher Ton ist welche Zahl? (MMSystem)
 
Cool, danke genau das was ich brauchte :D

Ist es möglich diese
Delphi-Quellcode:
  TMIDIInstrument = (midiAcousticGrandPiano, midiBrightAcousticPiano,
                     midiElectricGrandPiano, midiHonkyTonkPiano,
                     midiRhodesPiano, midiChorusedPiano, midiHarpsichord,
                     midiClavinet, midiCelesta, midiGlockenspiel,
...
irgendwie in Strings umzuwandeln und von strings wieder in ein TMIDIInstrument?

wäre ziemlich blöd wenn ich jetz noch eine StringList dafür machen müsste :/

MfG

ElektroLurch 23. Mär 2014 07:53

AW: Einfache MIDI Klasse - Welcher Ton ist welche Zahl? (MMSystem)
 
GetEnumName(TypeInfo(tMIDIinstrument), Wert)
Dafür muss System.TypeInfo in die Uses.

milos 23. Mär 2014 08:04

AW: Einfache MIDI Klasse - Welcher Ton ist welche Zahl? (MMSystem)
 
Vielen dank :D
Die Unit heisst jedoch TypInfo, nur als kleine Info :-D

MfG


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz