AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Einfache MIDI Klasse - Welcher Ton ist welche Zahl? (MMSystem)
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von milos · begonnen am 23. Mär 2014 · letzter Beitrag vom 23. Mär 2014
Antwort Antwort
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
508 Beiträge
 
Delphi 11 Alexandria
 
#1

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

  Alt 23. Mär 2014, 06:08
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
Milos
  Mit Zitat antworten Zitat
ElektroLurch

Registriert seit: 24. Nov 2007
Ort: Berlin
5 Beiträge
 
Delphi XE2 Professional
 
#2

AW: Einfache MIDI Klasse - Welcher Ton ist welche Zahl? (MMSystem)

  Alt 23. Mär 2014, 07:17
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.
Werner B
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
508 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Einfache MIDI Klasse - Welcher Ton ist welche Zahl? (MMSystem)

  Alt 23. Mär 2014, 07:29
Cool, danke genau das was ich brauchte

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
Milos
  Mit Zitat antworten Zitat
ElektroLurch

Registriert seit: 24. Nov 2007
Ort: Berlin
5 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Einfache MIDI Klasse - Welcher Ton ist welche Zahl? (MMSystem)

  Alt 23. Mär 2014, 07:53
GetEnumName(TypeInfo(tMIDIinstrument), Wert)
Dafür muss System.TypeInfo in die Uses.
Werner B
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
508 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Einfache MIDI Klasse - Welcher Ton ist welche Zahl? (MMSystem)

  Alt 23. Mär 2014, 08:04
Vielen dank
Die Unit heisst jedoch TypInfo, nur als kleine Info

MfG
Milos
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:18 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