![]() |
Zwei Miditoene simultan ausgeben
Die Tonausgabe hat folgendes Format:
midistart:=(65536*volume)+(256*(ton+oktav))+144; TreiberNr:=0; MidiOutOpen(@MidiOH, TreiberNr, 0, 0, 0); data:=(256*instrumen)+192; MidiOutShortMsg(MidiOH, data); MidiOutShortMsg(MidiOH, midistart); Gestartet wird nach OnKeyDown. Beendet nach OnKeyUp. Das funzt auch in allen Oktaven, bei allen Toenen und mit allen Instrumenten. Das Problem nun : Wie kriege ich einen zweiten Ton gleichzeitig in die Ausgabe? Welche Parameter muss ich ggf. aendern? Oder geht das nicht so einfach? |
Re: Zwei Miditoene simultan ausgeben
Den MIDI-Port ein einziges Mal für das ganze Programm öffnen und dann im OnKeyDown ein "Note spielen"-Ereignis senden und im OnKeyUp ein "Note abbrechen"-Ereignis senden?
|
Re: Zwei Miditoene simultan ausgeben
Danke, Mystic, fuer Deine Antort. Um die Frage zunaechst zu beantworten: Ich arbeite mit zwei Varianten in getrennten Programmen. In dem ersten Versuch trifft Deine Antwort zu, also einmal am Start den Midi-Port oeffnen und dann ueber die Tastatur ansprechen.
In der zweiten Variante hatte mein Junior - leider nun in ca. 700 km Entfernung - mir zu Threads geraten. Bei jedem Tastendruck wird der Midi-Port geoeffnet mit Create. Mit Key-Up wird er mit destroy geschlossen. In beiden Varianten gibt es bis dato immer nur die Ausgabe eines einzigen Tones. Ich hatte versucht, beim ersten Tastendruck den Kanal 144 zuzuweisen und mit dem zweiten Tastendruck - waehrend die erste Taste weiterhin gedrueckt war - den Kanal 145. Die entsprechenden Kanaele (128 und 129) bei KeyUp zum Beenden der Klangausgabe. Der zweite Tastendruck wurde angenommen (hatte in einer Panel.Caption die Kanalnummer als String ausgegeben). Dennoch war und ist ein zweiter Ton nicht herauszukitzeln. Kann es sein, dass ich einen zweiten Midi-Port fuer den zweiten Kanal auch erstellen oder oeffnen muss? Dieser Gedanke ist mir eben erst gekommen. |
Re: Zwei Miditoene simultan ausgeben
Es müsste sich eigentlich alles über einen einzigen Port abwickeln lassen.
|
Re: Zwei Miditoene simultan ausgeben
Zitat:
Du arbeitest auf unterer Ebene und musst mühsam jeden einzelnen Ton ausgeben. "High-Level" Programmierung wäre eine MIDI-Komponente oder Klasse zu verwenden. Für MIDI-Programmierung keine Hilfsklasse/Komponente zu verwenden, wäre reine Zeitverschwendung!! In der JCL gibt es z.B. eine MIDI-Klasse in der Unit JclMidi, mit der du Töne viel einfacher ausgeben kannst. Das Umschalten des Ports, Klangfarbe, Lautstärke, ... wird damit ganz einfach. Download: ![]() Es ist auch ein polyphones (<=mehrere Töne zusammen) Demoprogramm enthalten. |
Re: Zwei Miditoene simultan ausgeben
Danke shmia fuer Deine Antwort. Ich gebe zu, dass ich Probleme mit objektorientierter Programmierung habe und im Alter von 59J auch meine Probleme mit dem Hinzulernen. Aber ich will mich da gerne reinknien. Habe anfangs der 80-er Jahre mit Programmieren begonnen. Damals ein astronomisches Programm, welches mir von CompuServe seinerzeit mit 200.--DM honoriert wurde. Spaeter bin ich ueber QuickBasic zu TurboPascal gekommen. Ich nutze jetzt noch meine damaligen Basic-Programme unter DOS, Kundenverwaltung, Inventur und Rezeptabrechnung mit Krankenkassen, solange diese noch Zuschuesse fuer Brillen gaben. Ich will nicht strunzen hier, sondern Dir zu verstehen geben, weshalb ich mich noch nicht an das objektorientierte Programmieren herangewagt habe. Die Gewohnheit und frueher gelerntes und erfolgreich angewandtes Wissen blockieren neue Wege. Aber - wie ich schon sagte - ich will es jetzt mal damit versuchen.
Werde mich wieder melden, wenn ich nicht weiterkomme. Nochmals Dank. Dennoch wiederhole ich meine Frage: Gibt es im Bereich der LOW-Level Programmierung einen einfachen Weg fuer polyphone Ausgabe? |
Re: Zwei Miditoene simultan ausgeben
Zitat:
nur auf das Benützen von Komponenten und/oder Klassen beschränkt. Zitat:
Hier mal die Liste der Statusbytes:
Delphi-Quellcode:
Die 144 entspricht $90 ist also gleich MIDIMsgNoteOn.
const
// MIDI Status Bytes for Channel Voice Messages MIDIMsgNoteOff = $80; MIDIMsgNoteOn = $90; MIDIMsgPolyKeyPressure = $A0; MIDIMsgControlChange = $B0; MIDIMsgProgramChange = $C0; MIDIMsgChannelKeyPressure = $D0; MIDIMsgAftertouch = MIDIMsgChannelKeyPressure; // Synonym MIDIMsgPitchWheelChange = $E0; // MIDI Status Bytes for System Common Messages MIDIMsgSysEx = $F0; MIDIMsgMTCQtrFrame = $F1; // MIDI Time Code Qtr. Frame MIDIMsgSongPositionPtr = $F2; MIDIMsgSongSelect = $F3; MIDIMsgTuneRequest = $F6; MIDIMsgEOX = $F7; // marks end of system exclusive message // MIDI Status Bytes for System Real-Time Messages MIDIMsgTimingClock = $F8; MIDIMsgStartSequence = $FA; MIDIMsgContinueSequence = $FB; MIDIMsgStopSequence = $FC; MIDIMsgActiveSensing = $FE; MIDIMsgSystemReset = $FF; Daher:
Delphi-Quellcode:
midistart:=(65536*volume)+(256*(ton+oktav))+MIDIMsgNoteOn;
data:=(256*instrumen)+MIDIMsgProgramChange; MidiOutShortMsg(MidiOH, data); MidiOutShortMsg(MidiOH, midistart); / 1. Ton midistart:=(65536*volume)+(256*(ton2+oktav2))+MIDIMsgNoteOn; MidiOutShortMsg(MidiOH, midistart); / 2. Ton Sleep(500); // 0,5 Sekunden warten midistop:=(65536*volume)+(256*(ton+oktav))+MIDIMsgNoteOff; MidiOutShortMsg(MidiOH, midistop); // 1. Ton aus midistop:=(65536*volume)+(256*(ton2+oktav2))+MIDIMsgNoteOff; MidiOutShortMsg(MidiOH, midistop); // 2. Ton aus |
Re: Zwei Miditoene simultan ausgeben
Dank, shmia, fuer Antwort und Verstaendnis. Das sieht ja ganz gut aus, was Du mir da schickst. Werde mich gleich dran machen und es einbauen. Drueck mir bitte alle Daumen.
Melde mich wieder, wenns funzt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz