Deutsch
Forum

Bits von readmidi in Noten (werte) umwandeln

 

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
Gruß
Ludger
 
11.07.2008  
 




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 für 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 für 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 benötigt, 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-Dateien:  [...] 
Gruß, 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 für 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 anzeigen lassen.
Ich hatte bisher noch keine Aufgabe gefunden,was ich wohl Programieren könnte, 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
Gruß
Ludger
 
12.07.2008  
 




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
KompilierenMarkierenSeparieren
whileloop 23,38

    byte mim#,&loop=$90  NOP

endwhile

schreiben, weil ReadMidiIn sonst nur NoteOn & -Off zurückgibt (hatte ich damals so programmiert...).
Gruß, 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
Vieleicht kann man das auch in deinem Piano Trainer einbauen
Gruß
Ludger
 
18.08.2008  
 




Sebastian
Sprenger
Hallo Ludger,
das sollte die while-Schleife korrekt ergänzen (Nachtrag um 21:32: geändert und getestet!):
KompilierenMarkierenSeparierenGruß, 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 für 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
    endif
    endwhile
    closemidiin
    closemidiout

Gruß
Lutz
 
20.08.2008  
 




Frank
Abbing
Hier nochmal alle benötigten Dateien in einer Zip.
Kann das mal jemand mit Keyboard testen?

3 kB
Hochgeladen:21.08.2008
Ladeanzahl65
Herunterladen
 
21.08.2008  
 




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 läuft alles flüssig.

Gruß, 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  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

3.503 Betrachtungen

Unbenanntvor 0 min.
Sven Bader14.10.2021
Jörg Sellmeyer11.09.2014
Sebastian Sprenger19.03.2013
Paul Glatz15.03.2013

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie