PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Midiverarbeitung ( gelöst )



graffiti
13.12.2007, 01:30
wer kann mir helfen
ich möchte mit Midi-Kanal 7 (binär 151), Velcity 100
und bei den Noten 80 bis 88, Kanäle vom Tiny2313 schalten,
aber irgendwie wird der Midi-Kanal beim empfangen des Protokolls
verschluckt bzw. überschrieben von Velocity

Im unteren Code sollte eigentlich
Protokoll(1) 151 (Note-on Ch. 7)
Protokoll(2) 80 ....88
Protokoll(3) 100 sein

tatsächlich ist aber Protokoll(1) 100 Velocity, mit Drumcomputer getestet, ändert man Velo geht nichts mehr
Protokoll(2) sind die Noten wie es sich gehört
Protokoll(3) is nichts da

was kann die Ursache sein, das der Note-On Befehl nicht im Protokoll steht
und Velo auf Protokoll(1) geschrieben wird und nicht auf Protokoll(3)

gruß und schonmal Danke Gerhard


das Programm unten funktioniert, aber ohne den Note-on Befehl



$regfile = "attiny2313.dat"
$crystal = 8000000
$baud = 31250

Open "COMD.2:31250,8,n,1" For Input As #1
Dim Zeiger As Byte At &HA0
Zeiger = 1
Dim Flag As Byte At &HA1
Dim Adresse As Eram Byte
Dim Adresse_temp As Byte At &HA3
Dim Tempword As Word At &HA5
Adresse_temp = Adresse
Dim Tempbyte As Byte At &HA7
Dim Protokoll(3) As Byte At &HA8

Ddrd = &B11100010
Ddrb = &B11111111

Config Timer0 = Timer , Prescale = 1024
On Timer0 Timer_irq
Stop Timer0

Config Timer1 = Timer , Prescale = 64
On Timer1 Timer_irq2
Disable Timer1
Stop Timer1
Timer1 = 0

Enable Timer0
Enable Interrupts


Do
Tempbyte = Waitkey(#1)
Gosub Zeichenempfang
If Flag = 1 Then
Gosub Protokoll
Flag = 0
Zeiger = 1
End If
Loop



Zeichenempfang:

Protokoll(zeiger) = Tempbyte
If Tempbyte = 0 Then
Zeiger = 1
End If

If Protokoll(1) = 100 Then 'sollte eigentlich 151 sein
If Tempbyte = 0 Then
Flag = 1
End If
Incr Zeiger
Else
Zeiger = 1
Timer0 = 0
Start Timer0
Enable Timer0
End If
Return
End



Timer_irq:
Stop Timer0
Disable Timer0
Zeiger = 1
Return
End

Timer_irq2:
Portb = 0
Portd.6 = 0
Timer1 = 0
Disable Timer1
Stop Timer1
Protokoll(1) = 0
Protokoll(2) = 0
Protokoll(3) = 0
Return
End

Protokoll:

If Protokoll(1) = 100 Then ' sollte eigentlich Protokoll(3) sein
Flag = Protokoll(2)

If Flag = 80 Then
Portd.6 = 1
Elseif Flag = 81 Then
Portb.0 = 1
Elseif Flag = 82 Then
Portb.1 = 1
Elseif Flag = 83 Then
Portb.2 = 1
Elseif Flag = 84 Then
Portb.3 = 1
Elseif Flag = 85 Then
Portb.4 = 1
Elseif Flag = 86 Then
Portb.5 = 1
Elseif Flag = 87 Then
Portb.6 = 1
Elseif Flag = 88 Then
Portb.7 = 1
Elseif Flag = 0 Then
Portb = 0
End If
End If

Protokoll(1) = 0
Protokoll(2) = 0
Protokoll(3) = 0
Timer1 = 53036
Enable Timer1
Start Timer1

Return
End

graffiti
18.12.2007, 06:11
diese Erkenntnis könnte evtl auch anderen helfen

die Daten der Kanalkennung werden nicht bei jedem Datenverkehr mitgesendet,
sondern nur bei jedem Wechsel des Kanals

komischerweise sollte das Byte für Kanal 7 - 151 sein ( 1001 0111 )
tatsächlich wird aber 150 vom Akai-Drumcomputer ausgegeben

zu beachten ist, das bei der Auswertung des Kanals, dieser nicht durch eine Note zurückgesetzt wird
also im Code <> 150 funktioniert definitiv nicht
die Noten gehen bis Wert 127
die Kanäle beginnen bei Wert 144

der Code für die Kanalkennung sollte so aussehen
bei einem Zeichenempfang:


if Dateneingang = 150 then
Kanal = 1
end if
if Dateneingang > 128 and < 150 or Dateneingang > 150 then
Kanal = 0
end if

gruß Gerhard