| |
|
|
Ludger Resing | Hallo Bin schon lange auf der suche nach midi Programierung ,und bin nun auf euern Thread [...] gestoßen. Leider ist meine aktive Programierzeit schon lange zurück ,und ich weiß nicht mehr so viel darüber (muß mich erst wieder einarbeiten) Habe unter Profan 6.6 mal was programiert. Bin nun aber auch zur Musik gekommen ,und wollte mir auch was zum Keyboard lernen schreiben (nen kleines Prog) Ich spiele keyboard ,und möchte Sehen wie sauber ich spiele ,will also direkt die länge der noten und Pausen anzeigenlassen.Nun habe ich mit Thru etwas experimentiert und klappt schon super.Aber wie kann ich die Bits von readmidi in in Noten (werte )umwandeln.Oder Sebastian hast du sowas schon geschrieben. Ich habe schon ne halbe nacht rumgegugelt und viel zu viele Progs installiert , aber bin ich alles nicht mit klargekommen Saluto Ludger |
|
|
| |
|
|
|
Sebastian Sprenger | Hallo Ludger,
Ludger Resing
Aber wie kann ich die Bits von readmidi in in Noten (werte )umwandeln.
wenn du Daten von deinem Keyboard einlesen willst, brauchst du zunächst mal die Bits 4-7. Die stehen per die MIDI-Nachricht, die eingegangen ist, z.B. NoteOff ($80), NoteOn ($90), ProgramChange ($C0) etc.
Die nächsten Bits sind nachricht-abhängig. Bei einem NoteOn/-Off stehen die Bits 8-14 per die Note (60=mittleres C, 62=D, 64=E, 65=F, 67=G, 72=hohes C, 48=tiefes C).
Ich hab mal ein kleines Demo geschrieben, vielleicht hilft es dir weiter: [...] (Profan 7 wird necessario, aber wenn du eh schon mit Thru experimentiert hast... )
Ludger Resing
Oder Sebastian hast du sowas schon geschrieben.
Was meinst du mit sowas? Ein Programm zum Keyboard üben jedenfalls schon, ja. Genauer gesagt zum Nachspielen von MIDI-File: [...] Saluto, Sebastian |
|
|
| Profan² 7.0e, XProfan 9, 11.2a, FreeProfan32 Windows Vista Home Premium 32-Bit, 2.8 Ghz, 4 GB RAM Windows Me, 1.8 Ghz, 256 MB RAM | 11.07.2008 ▲ |
|
|
|
|
Ludger Resing | Hallo Sebastian Erst mal besten Dank per die schnelle Antwort Gibt es irgendwo ne Liste von den Bits und deren Midi Funktion? Ich bin vor ca 3 Jahren angefangen Keyboard zu lernen .Klappt auch eigentlich recht gut, außer ,daß ich immer aus dem Takt komme.Also möchte ich mir ein Programm schreiben, welches direckt die Noten (und deren länge zum Tackt) anzeigt .Mit dem Mitzählen bekomme ich nähmlich nicht hin . Vieleicht noch ein Tipp zu deinem Piano Lernspiel :Vileicht kanst du auf der Taste die gedrückt wird ,auch den Finger der benutzt werden soll Mostra lassen. Ich hatte bisher noch keine Aufgabe gefunden,was ich wohl Programieren potuto, bis ich auf dieses Problem stieß und auch bei Google nichts passendes fand. Ich habe unter Profan 6.6 damals WinAfuGame programiert.(Eine Amateurfunk Simulation) Kusiert auch noch im Netz ,da aber kein großes Interesse aufkam habe ich die entwicklung dessen eingestellt Saluto Ludger |
|
|
| |
|
|
|
Sebastian Sprenger | Hallo Ludger, bei Wikipedia gibt es einige Listen, wo alles Wichtige abgedeckt ist: [...] Wenn du neben den Notenwerten aber nur die Länge brauchst, dann brauchst du die Listen eigentlich nicht - ich habe alle Timing-Sachen immer an &GetTickCount gemessen. Im Prinzip musst du damit nur die Zeit messen, die zwischen einem NoteOn und dem zugehörigen NoteOff vergeht.
Falls du trotzdem andere MIDI-Messages empfangen willst, musst du an den Anfang deines Programms unbedingt KompilierenMarkierenSeparierenschreiben, weil ReadMidiIn sonst nur NoteOn & -Off zurückgibt (hatte ich damals so programmiert...). Saluto, Sebastian |
|
|
| Profan² 7.0e, XProfan 9, 11.2a, FreeProfan32 Windows Vista Home Premium 32-Bit, 2.8 Ghz, 4 GB RAM Windows Me, 1.8 Ghz, 256 MB RAM | 12.07.2008 ▲ |
|
|
|
|
Ludger Resing | Hallo Sebastian Hab nun schon ne weile mit deinem demo rum experimentiert . [...] weiß aber noch nicht genau wie ich inerhalb der gedrückten Keyboardtaste abfragen kann,ob sie schon losgelassen wurde. KompilierenMarkierenSeparieren
whilenot (%umessage=16) or (%scankey=27) Bis Alt-F4 oder ESC
readmidiin MIDI-Nachricht lesen
a&=&(0)
if a& >= 0 Gibt es eine?
Ja, Ist es ein NoteOff oder NoteOn? (Man beachte, dass
das 4. Bit in dieser If-Abfrage ausmaskiert ist und daher
beide Nachrichten gleichzeitig abgefragt werden :))
if (a& & $E0) = $80
Ja, Notenwert und Lautstärke berechnen
note% = (a& >> 8) & 127
vel% = (a& >> 16) & 127
Bei NoteOff gibts allerdings keine Lautstärke
casenot a& & $10: vel% = 0
Log
LOCATE 8,2
print "Die Taste",note$[note%],"(";note%;") wurde",
if vel%
print" gedrückt "
while ??????bis taste losgelassen wird
balken(9,&loop) , grafische darstellung der notenlänge also ein balken wird gemalt
schlafe (10) ,nur um die geschwindigkeit zu verringern
endwhile
else
print "losgelassen."
endif
endif
endif
endwhile
Vieleicht kann man das auch in deinem Piano Trainer einbauen Saluto Ludger |
|
|
| |
|
|
|
Sebastian Sprenger | Hallo Ludger, das sollte die while-Schleife korrekt ergänzen (Nachtrag um 21:32: geändert und getestet!): KompilierenMarkierenSeparierenSaluto, Sebastian |
|
|
| Profan² 7.0e, XProfan 9, 11.2a, FreeProfan32 Windows Vista Home Premium 32-Bit, 2.8 Ghz, 4 GB RAM Windows Me, 1.8 Ghz, 256 MB RAM | 19.08.2008 ▲ |
|
|
|
|
Ludger Resing | Hallo Sebastian
Ich weiß nicht, ob Profan zu langsam per diese Aufgabe ist, oder ich nur den falschen Weg gehe, aber ich bekomme es so noch nicht hin. Ich bin überzeugt davon ,daß du auch noch andere Sachen zu tun hast, aber wenn du Zeit hast schau mal auf meinen Quelltext Er funktioniert zwar Ansatzweise , aber zu träge.Mir ist dieses Program sehr wichtig , doch habe ich im netz noch nichts ähnliches gefunden KompilierenMarkierenSeparieren $I Interface.inc
declare a$,a&,note%,vel%,note$[127],laenge&,wonote%
windowstyle 31
Window 1,1-1100,800
SetTrueColor 0
Proc Notenbezeichnung
Array mit Notenbezeichnungen
a$="C-C#D-D#E-F-F#G-G#A-A#H-"
whileloop 0,127
note$[&loop]=mid$(a$,(&loop mod 12)*2+1,2);str$(&loop12)
endwhile
endproc
Proc Schlafe
Parameters N&
Declare Ende%
SetTimer N&
Clear Ende%
WhileNot Ende%
WaitInput
Case %wmTimer:Ende% = 1
EndWhile
KillTimer
EndProc
Proc Notenlinien
parameters zz% zz=zeile
declare z%
let z%=(zz%*120)-40 abstand der zeilen - 40 ist zum ausrichten
UsePen 0,1,@RGB(0,0,0)
line 50,(10+z%)-1000,(10+z%)
line 50,(20+z%)-1000,(20+z%)
line 50,(30+z%)-1000,(30+z%)
line 50,(40+z%)-1000,(40+z%)
line 50,(50+z%)-1000,(50+z%)
--------------------
line 50,(10+z%)-50,(50+z%) senkrechter Strich
line 1000,(10+z%)-1000,(50+z%) Senkrechter hinterer Strich
endproc
proc posnote
parameters eing$
if left$(eing$,1)="C"
wonote%=7
elseif left$(eing$,1)="D"
wonote%=6
elseif left$(eing$,1)="E"
wonote%=5
elseif left$(eing$,1)="F"
wonote%=4
elseif left$(eing$,1)="G"
wonote%=3
elseif left$(eing$,1)="A"
wonote%=2
elseif left$(eing$,1)="H"
wonote%=1
endif
let wonote%=wonote%-(((val(mid$(eing$,3,1)))-3)*7)+15 rem -3 ist die Oktave/*7 =sieben töne höher /+15 nur zum ausrichten
endproc
Proc balken
Parameters Wert%, dauer&
declare w%
let w%=wert%*5
UsePen 0,2,@RGB(31,0,0)
UseBrush 1,@RGB(0,0,0)
Ellipse (70+dauer&),(62+w%) - (83+dauer&),(70+w%)
endproc
notenlinien(1)
notenlinien(2)
openmidiin 0 mein USB Midieingang
openmidiout 1 mein Midiausgang
laenge&=0
wonote%=0
Notenbezeichnung
whilenot (%umessage=16) or (%scankey=27) Bis Alt-F4 oder ESC
readmidiin MIDI-Nachricht lesen
a&=&(0)
if a& >= 0 Gibt es eine?
Ja, Ist es ein NoteOff oder NoteOn? (Man beachte, dass
das 4. Bit in dieser If-Abfrage ausmaskiert ist und daher
beide Nachrichten gleichzeitig abgefragt werden :))
if (a& & $E0) = $80
Ja, Notenwert und Lautstärke berechnen
note% = (a& >> 8) & 127
vel% = (a& >> 16) & 127
Bei NoteOff gibts allerdings keine Lautstärke
casenot a& & $10: vel% = 0
Log
LOCATE 18,5
print "Die Taste",note$[note%],"(";note%;") wurde",
if vel%
posnote(note$[note%])
playmidiout a& & $7F7F90
print " gedrückt "
while readmidiin() & $7F0060
inc laenge&
balken(wonote%,laenge&)
chlafe (1)
endwhile
else
print "losgelassen."
endif
endif
ass=s1>endif
endwhile
closemidiin
closemidiout
Saluto Lutz |
|
|
| |
|
|
|
Frank Abbing | Hier nochmal alle benötigten File in einer Zip. Kann das mal jemand mit Keyboard testen? |
|
|
| |
|
|
|
Sebastian Sprenger | Ich sehe nur, dass es hakt, wenn mehrere Tasten gleichzeitig gedrückt sind (bzw. eine neue Taste gedrückt wird, bevor die alte losgelassen wird), ansonsten corre alles flüssig.
Saluto, Sebastian |
|
|
| Profan² 7.0e, XProfan 9, 11.2a, FreeProfan32 Windows Vista Home Premium 32-Bit, 2.8 Ghz, 4 GB RAM Windows Me, 1.8 Ghz, 256 MB RAM | 21.08.2008 ▲ |
|
|
|