MIDI Programmierung mit POKE

Es gibt 31 Antworten in diesem Thema, welches 2.983 mal aufgerufen wurde. Der letzte Beitrag (24. Februar 2009 um 23:20) ist von ogd.

  • Hallo,

    gibt es hier im Forum jemanden, der weiß, wie man einem MIDI-Keyboard (Instrument) per BASIC mit POKE-Befehlen Töne entlocken kann?

    Ich knobele jetzt schon seit 2 Wochen dran, aber es kommt nicht ein einziger Ton aus der Kiste raus.

    Dabei habe ich alle Befehle und Register aus Peter Buchtys Text aus den 80-ern benutzt. Aber es klappt einfach nicht.

    Wer kann helfen?

    jomodore9

  • welches keyboard/interface? gibts den text online?

  • irgendwie bezweifel ich das das in basic geht... die interfaces die ich bisher gesehen hab waren alle ACIA basiert und brauchten zumindest für die steuerung der schnittstelle ein bischen assembler.... also zumindest ein irq handler zum empfangen sollte sein, in basic dürfte man da mit polling nicht besonders weit kommen =P

  • Hier der Text-Link, mit dem ich mich seit 2 Wochen rumschlage:

    Bitte melde dich an, um diesen Link zu sehen.

    Im Prinzip sieht es so aus:

    Es gibt nur 4 Register, die mit der MIDI-Steuerung zusammenhängen:

    Ein Control-Register 56836
    Ein Transmit-Register 56837
    Ein Status-Register 56838
    Ein Receive-Register 56839

    Control- und Status-Register müssen wohl nur "einmal" beschickt werden. Ich möchte keine MIDI-Signale empfangen können, sondern nur senden. Also ist das Transmit-Register der Hauptkandidat. Aber irgendwie muss ja die Gegenseite, das MIDI-Instrument (Synthesizer, Drummaschine usw) bestätigen, dass da was angekommen ist. Und ich glaube, dass da der Hund begraben liegt. Da muss also irgendwie ein Bit gesetzt werden, damit das Transmit-Register wieder feuern kann.

    Ich bin blutiger Laie, was Programmierung angeht (BASIC und noch etwas entfernte Ahnung von MS). Aber mit POKE Befehlen müssten doch alle Register "bestückbar" sein.

    Ich benutze ein Steinberg-MIDI-Interface für die Ansteuerung des Instruments.

    Die Sache mit den Steuerbytes und Werte-Bytes habe ich, glaub' ich kapiert. Auch weiß ich, wie die Daten verschachtelt sind bei einem TONE-ON Befehl (also Ton einschalten). Nur mit den Controlbits und Statusbits, da beißt es bei mir aus. Irgend ein Bit muss da auf 1 stehen anstatt auf 0.

    Aber sooooo schwer kann das doch nicht sein!!! Oder doch? Oder ganz sicher?

    Gruß
    jomodore9

  • Ich bin ja nur ein Laie. Aber wie kommt es, dass zum Beispiel das Controlbyte auf PRINT PEEK(56836) jedesmal andere Werte ausspuckt? Ich dachte immer, dass ein "gepokter" Wert, dann beim sofortigen PEEKEN wieder erscheint. Aber irgendwie machen die Register, was sie wollen. - Das geht über meine Hutschnur. Und dabei nutze ich MIDI am C64 schon seit 1986 - als Komponier-Werkzeug.

    Schnief.

  • Zitat

    Aber wie kommt es, dass zum Beispiel das Controlbyte auf PRINT PEEK(56836) jedesmal andere Werte ausspuckt? Ich dachte immer, dass ein "gepokter" Wert, dann beim sofortigen PEEKEN wieder erscheint.

    guck dir am besten mal das datenblatt zum acia an (gibts irgendwo auf funet bzw zimmers.net) ... in dem register werden ein paar bits sein die beim lesen was anderes bedeuten als beim schreiben.

    edit: ahja, auf der von dir verlinkten seite stehts doch:

    Code
    (1) Das Control Register ($DE04) 
    Beim CR handelt es sich um ein Write-Only-Register

    das register kann also nicht gelesen werden... wenn du das doch machst wirst du warscheinlich einfach zufälligen müll lesen

  • und genauso ist das status register nur zum lesen da, wenn bit 1 low ist wird gerade gesendet, es darf also nichts ins transmit data register geschrieben werden bis bit 1 wieder high ist. welchen wert schreibst du in $DE04? #$12? ist auch der richtige midi kanal ausgewählt? midi instrumente bestätigen nichts, da wird "blind" gesendet.

    lies mal den wikipedia artikel zu midi, da wird auch ein wenig zu den staus/datenbytes erklärt.

    rein als spielerei geht das sicher in basic, aber wie bereits angesprochen, ganz so ohne interrupts eher lähmend zu programmieren.

  • Danke für die Antworten bisher. Ich werde mich später noch mal melden. Muss jetzt los.

    Gruß

  • das register kann also nicht gelesen werden... wenn du das doch machst wirst du warscheinlich einfach zufälligen müll lesen

    Welchen Sinn hat denn ein Register, dass man nicht auslesen kann? Ich dachte immer, der Sinn vom Poken ist, dass danach mit den betreffenden Daten etwas im C64 "bewirkt" wird.

    Zitat

    es darf also nichts ins transmit data register geschrieben werden bis bit 1 wieder high ist.

    wer schreibt denn die 1 ins Bit 1? Das ist mir unklar. Irgendeiner muss das doch machen. Das angeschlossene MIDI-Instrument? Also eine Art Handshake?

    Ich schreibe ins Controlregister $DE04 den Wert $32 (also DEZ 50). Zuvor schreibe ich jedoch zum Initialisieren noch den Wert DEZ 3 in das Register, damit ein Reset ausgeführt wird. Das hat Peter Buchty so vorgeschlagen in seinem Text. Und danach erst die DEZ 50.

    Peter Buchty hat mir vor ein paar Tagen folgende BASIC-Zeilen geschickt, um einen Ton aus dem MIDI-Instrument zu locken. Klappt aber leider nicht.


    10 POKE 56836,3 : REM reset acia
    20 POKE 56836,145 : REM set up MIDI
    communication
    30 FOR I=0 TO 2
    40 READ A : REM get data
    50 GOSUB 100 : REM txready loop
    60 POKE 56837,A : REM output data
    70 NEXT I
    80 END
    100 A=PEEk(56838) ------ Das soll 56838 heißen, Smiley hängt drüber
    110 IF (A AND 1)==0 THEN GOTO
    120 RETURN
    500 DATA 145, 33, 50


    Ich habe den Wiki-Artikel und auch einige andere gelesen und ausgedruckt. Sie führen allerdings nicht zum Ziel. Ich kann nicht einen einzigen Ton erzeugen.

    Nach dem Beschicken des Control Registers poke ich folgende Werte in das $DE05 (Transmit-Register), um einen Ton zu erzeugend: 10010000 (das heißt: die erste 1 für Befehlsbit, die 001 für Befehl "Note on" (d.h. $9x), die 0000 für MIDI-Kanal 1 (weil man von 0 aus zählt).

    Die Sache mit dem Interrupt ist mir auch unklar. Aber ich will ja erst mal nur einen einzigen Ton erzeugen können. Das ist mein Ziel. Wenn das klappt, kann ich mich weiter durchbeißen.

    Wer blickt denn durch diesen Datendschungel durch?

    Gruß

    2 Mal editiert, zuletzt von jomodore9 (3. Februar 2009 um 23:56)

  • Welchen Sinn hat denn ein Register, dass man nicht auslesen kann? Ich dachte immer, der Sinn vom Poken ist, dass danach mit den betreffenden Daten etwas im C64 "bewirkt" wird.


    Der Sinn liegt darin, irgendwas nach "draussen", an das Keyboard/Synthesizer/was auch immer zu senden. Das ist auch davon ab nicht soo aussergewöhnlich, dass der Poke in ne Einbahnstrasse führt, der interne SID-Chip verhält sich bei vielen Sachen genau so, quasi wie ein schwarzes Loch. Was einmal hineingeschrieben wird, kommt nicht wieder heraus (ausser aus dem Lautsprecher vielleicht).

    Zitat

    wer schreibt denn die 1 ins Bit 1?


    Das wird dann wohl von dem externen Keyboard/Synthesizer/was auch immer kommen.

  • die 0en und 1en ins status register schreibt der uart/acia/whatever der in deiner midi schnittstelle ist, wenn er den befehl in $DE05 abgearbeitet hat und bereit ist für einen neuen.

    probier mal das:

    ansonsten... was gibt denn print peek(56838) aus? (oder bau es in den txready loop ein, dann siehst du was passiert)

  • Code
    100 A=PEEK(56838)
    110 IF (A AND 1)=0 THEN GOTO 110 :wenn das 1er bit im statusreg. low ist, warten

    da kannste lange warten =D

  • Ich werde es probieren, Zerozillion, und später berichten.

    Die Zeilen 100 und 110 sind mir ein Rätsel. Die Variable A wird zweimal im Programm verwendet, einmal als DATA und einmal als Speichervariable für PEEK(56838). Das kommt mir falsch vor. Das kollidiert doch irgendwie.

    Dein Note-On Befehl (DEZ 145) (der von Buchty übernommen wurde), scheint mir den falschen Kanal anzusprechen, denn 10010001 würde MIDI-Kanal 2 meinen (die letzten 4 Bits sind der Kanal). Der MIDI-Kanal 1 müsste doch mit 4 Nullen (0000) hinten enden. Oder? MIDI-Kanal NUll gibt es ja nicht.

    Nacht.

    Gruß

  • Mensch Sauhund,

    Dein Einwand von heute Nacht, den ich allerdings nicht mehr gesehen hatte, als ich meine letzte Botschaft schrieb, ist goldrichtig. Du wirst lachen, aber ich habe noch im Bettchen genau diese Zeile 110 immer wieder betrachtet. Das ist ja das falsche Bit. Da muss hin ".... AND 2".

    Und jetzt sehe ich, dass Du genau das moniert hast. Klasse.

    Ich werde es jetzt gleich ausprobieren gehen.

    Danke Zerozillion für Deinen Vorschlag. Bei Buchty ist mir dieser obige Fehler nicht aufgefallen, Aber bei Dir. Immerhin. Und ich glaube, es ist noch ein Fehler drin im alten Programm: die Zeile 500 DATA 145 würde binär so aussehen "10010001". Und das wäre ja ein NOTE-ON Befehl (001), der MIDI-Kanal Nummer 2 anspricht. Wie bereits erwähnt, wird MIDI-Kanal 1 mit vier Nullen angesprochen ("0000"). Denn MIDI-Kanal 16 (der höchste) hat vier Einsen ("1111"), also DEZ 15.

    Daran könnte das Ganze auch bisher gescheitert sein.

    Ich probiers jetzt mal aus.

    Danke Euch beiden.

    Gruß

  • naja war schon etwas später gestern; eine abfrage ohne die werte zu checken geht natürlich nicht.

    so müsste es dann gehen:

    Code
    100 B=PEEK(56838)
    110 IF (B AND 1)=0 THEN GOTO 100 :wenn das 1er bit im statusreg. low ist, warten
    120 RETURN

    wobei ich mir immer noch nicht sicher bin ist der counter divide select, da am cartridge ja vermutlich der mir etwas unvertraute phi-2 anliegt (ist der jetzt ~1 mhz oder doch 2? buchty geht im artikel von 2 aus?).teilerverhältnis kann man ja als 1:1, 1:16 oder 1:64 einstellen und für midi braucht man 31.25kbit/s.

  • Zerozillion,

    habe jetzt, die neuen Erkenntnisse umgesetzt. Aber kein Ton erklingt. Dafür kann ich den C64 über den Resetknopf jetzt zurücksetzen, wenn er hängt. Das ging bisher nicht. Ich musste das Steinberg MIDI-Interface immer rausziehen und dann wieder rein (also auch C64 aus/einschalten). Immerhin.

    Du hast jetzt

    100 B=Peek 56838

    genommen. Warum B? Ich habe es auch ausprobiert mit B (anstatt A), aber es ändert sich dadurch nichts.

    Ich lese jetzt immer das Register 56838 aus. Das steht meistens auf DEZ 2. Aber jetzt schlägst Du in Deiner obigen Mail vor, auf DEZ 1 zu prüfen. Warum eigentlich. Das hat doch Sauhund auch schon moniert. Es müsste auf 2 geprüft werden (hinten also Bitfolge BIN 10 anstatt BIN 01).

    Das mit dem Teilverhältnis wird doch hoffentlich stimmen!!!!

    Ich habe das Gefühl, dass da irgendwas mit Interrupt falsch ist. Ich vermute, im Controlregister ist was falsch gesetzt.

    Ich werde bald verrückt.

    Gruß

  • Stammt Dein Satz in der Signatur von den Who?

    Gruß

  • Zitat

    Das hat doch Sauhund auch schon moniert.

    ne, ob da irgendwelche bits stimmen hab ich garnicht nachgeschaut =) aber wenn man einen wert wiederholt in einer schleife prüfen will sollte man ihn auch in jedem schleifendurchlauf auslesen, sonst wird das nix :)

  • Habe alles probiert. Nix geht. Was ist das Geheimnis von MIDI?

    Gruß