AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zwei Miditoene simultan ausgeben

Ein Thema von hesubat · begonnen am 13. Jan 2006 · letzter Beitrag vom 16. Jan 2006
Antwort Antwort
hesubat

Registriert seit: 26. Dez 2005
Ort: Görlitz
19 Beiträge
 
Delphi 7 Personal
 
#1

Zwei Miditoene simultan ausgeben

  Alt 13. Jan 2006, 23:27
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?
Heinz Subat
  Mit Zitat antworten Zitat
Benutzerbild von Mystic
Mystic

Registriert seit: 18. Okt 2003
Ort: Flerzheim
420 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Zwei Miditoene simultan ausgeben

  Alt 14. Jan 2006, 01:38
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?
Jan Steffens
Der Fachwortgenerator - 100% Schwachsinn --- Der UPnP Router Manager - Kommentare erwünscht!
  Mit Zitat antworten Zitat
hesubat

Registriert seit: 26. Dez 2005
Ort: Görlitz
19 Beiträge
 
Delphi 7 Personal
 
#3

Re: Zwei Miditoene simultan ausgeben

  Alt 14. Jan 2006, 13:12
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.
Heinz Subat
  Mit Zitat antworten Zitat
Benutzerbild von Mystic
Mystic

Registriert seit: 18. Okt 2003
Ort: Flerzheim
420 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Zwei Miditoene simultan ausgeben

  Alt 14. Jan 2006, 13:40
Es müsste sich eigentlich alles über einen einzigen Port abwickeln lassen.
Jan Steffens
Der Fachwortgenerator - 100% Schwachsinn --- Der UPnP Router Manager - Kommentare erwünscht!
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

Re: Zwei Miditoene simultan ausgeben

  Alt 14. Jan 2006, 14:56
Zitat von hesubat:
Die Tonausgabe hat folgendes Format:
midistart:=(65536*volume)+(256*(ton+oktav))+144;
TreiberNr:=0;
MidiOutOpen(@MidiOH, TreiberNr, 0, 0, 0); ....
Das kann man als "Low-Level" Programmierung bezeichnen.
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: http://sourceforge.net/project/showf...group_id=47514
Es ist auch ein polyphones (<=mehrere Töne zusammen) Demoprogramm enthalten.
Andreas
  Mit Zitat antworten Zitat
hesubat

Registriert seit: 26. Dez 2005
Ort: Görlitz
19 Beiträge
 
Delphi 7 Personal
 
#6

Re: Zwei Miditoene simultan ausgeben

  Alt 14. Jan 2006, 20:03
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?
Heinz Subat
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

Re: Zwei Miditoene simultan ausgeben

  Alt 16. Jan 2006, 13:39
Zitat von hesubat:
Ich gebe zu, dass ich Probleme mit objektorientierter Programmierung habe und im Alter von 59J auch meine Probleme mit dem Hinzulernen.
Das versteh ich schon. OOP macht aber Spass und ich gar nicht so schwer, so lange man sich
nur auf das Benützen von Komponenten und/oder Klassen beschränkt.
Zitat von hesubat:
Dennoch wiederhole ich meine Frage: Gibt es im Bereich der LOW-Level Programmierung einen einfachen Weg fuer polyphone Ausgabe?
Bei MIDI kann jeden Ton anschalten (NoteOn) und ausschalten (NoteOff).
Hier mal die Liste der Statusbytes:
Delphi-Quellcode:
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;
Die 144 entspricht $90 ist also gleich MIDIMsgNoteOn.
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
Andreas
  Mit Zitat antworten Zitat
hesubat

Registriert seit: 26. Dez 2005
Ort: Görlitz
19 Beiträge
 
Delphi 7 Personal
 
#8

Re: Zwei Miditoene simultan ausgeben

  Alt 16. Jan 2006, 19:05
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.
Heinz Subat
  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 18:48 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