MTE Posted September 12, 2006 Author Report Share Posted September 12, 2006 Hialso, nur für mein logisches Verständnis...Ich definiere die Variable unsigned char MoniA; ganz oben in main.c (MoniA = Taster Monitor/Deck A) #define MoniA 0x9f das schreib ich darunter und dieses definiert mir das der Taster NoteOn auf Midikanal 16 sendet...right ? ok kann ich dazu evtl gleich noch den Tasterpin und die NoteOn-Value dazudefinieren ? weil dann wäre es unten unter void DIN_NotifyToggle .....einfacher mit if und else rumzuspielen und endlich mal den Toggle Status zu verpassen....hogge mal wieder seit heut morgen dran...aber irgendwie...wie immer...no results :'(Dont Panik about Authorenschaft ;D ...werde dich selbstverständlich mit in die Firmware-Authorenliste aufnehmen....bei dem was du mir schon alles geholfen hast !!! :)Greetz Quote Link to comment Share on other sites More sharing options...
audiocommander Posted September 12, 2006 Report Share Posted September 12, 2006 na, mich irgendwo hin mit aufzunehmen ist nun wirklich nicht nötig (...nur vielleicht die aufblasbare Midibox... ;D haha ,nein auch nicht nötig :) )also, ein #define ist streng genommen keine Variable, da sich ihr Wert nicht ändert und sie niemals den Status des ausführbaren Codes im PIC erreicht. Wenn der Code kompiliert wird, tauscht der Compiler einfach jedes Vorkommen des definiertes Wortes gegen den definierten "Inhalt" aus. Suchen/Ersetzen-Prinzp; das ist alles.also: für MONIA wird 0x9f eingesetzt.Dabei darfst du natürlich MONIA nicht als unsigned char variable deklarieren, denn das sind zwei verschiedene Dinge! Wenn du das #definierte MONIA schreibst, setzt der Compiler einfach 0x9f dahin. Du schreibst ja auch nicht myVar = unsigned char 0x9f !Natürlich kannst du soviele #defines definieren, bis die das Programm abstürzt, es dient tatsächlich nur der besseren Lesbarkeit und dass man schnell bestimmte Werte ändern kann. Ist also auch gut für DIN_PIN_NUMMERN und ENCODER_NUMMERN, also alles, was sich mal so mit der Zeit ändern könnte...Es empfiehlt sich auch, sich der allgemeinen Schreibweise anzupassen, nach der defines grundsätzlich komplett groß geschrieben werden, damit man sie leicht erkennen und von Variablen unterscheiden kann.Grüße,Michael Quote Link to comment Share on other sites More sharing options...
Wild_Weasel Posted September 12, 2006 Report Share Posted September 12, 2006 hi!Wunderbar das sich hier einer mit microcontroller programmieren richtig auskennt. Wie gesagt die LCD sachen sind zum debuggen. Allerdings plane ich bei der nächsten Box 2 LCDs reinzutunhttp://stud3.tuwien.ac.at/~e0327352/midibox/denon%20mb%202/ statt der VFDs die zwar sehr cool aussehen aber sinnlos sind weil die nur Ziffern gut darstellen können. Also ist das gut zu wissen.Tja. Würdest du den ganzen code sehen den ich zusammengewurschtelt hab würd dir schlecht werden.So zB 200x "if" anstatt "case" usw.Aber es hat funktioniert und das ohne wahrnehmbare Latenz. Also dürfte der PIC doch nicht so langsam sein.Hab nochmal über das scratchen nachgedacht. Ich halte ein grosses Rad und einen Mouse encoder (optisch) per Riemen angetrieben für sinnvoll. Weil: Hohe Auflösung des Mouse Encoders. Das sind gut und gerne 30 - 40 "Rasten"= Sichtfenster draufNoch höhere Auflösung wegen der Übersetzung des grossen Wheels auf den EncoderSchlupffrei, weil der Gummiring nicht rutschen kann, HaftreibungWer baut einen Prototyp ???? ;D ;D ;Dgrüsse m. Quote Link to comment Share on other sites More sharing options...
MTE Posted September 12, 2006 Author Report Share Posted September 12, 2006 was sollen die LCDs anzeigen ? Wenn Traktor Midiout senden würde wäre es göttlich, die Trackposition dort zu zeigen, aberso halte ich ein bzw.2 Lcds für überflüssig.Das mit dem Lightsensor finde ich auch eine gute Idee, wobei es echt egal ist ob Encoder oder Lightsensor,haben beides ne super auflösung...das mit der Riemenübersetzung mache ich jetz auch...Wer baut einen Prototyp ? Du ! ;D ;Dhast doch so nen Omnitronic zum ausschlachten :) Quote Link to comment Share on other sites More sharing options...
MTE Posted September 13, 2006 Author Report Share Posted September 13, 2006 Hihabe nunmal folgenden Code geschrieben : unsigned char MoniA; <- ganz oben ;) ...... ... void DIN_NotifyToggle(unsigned char pin, unsigned char pin_value) __wparam { if( pin_value != 0 ) return; if(MoniA) { MoniA = 0; MIOS_MIDI_BeginStream(); MIOS_MIDI_TxBufferPut(0x9f); MIOS_MIDI_TxBufferPut(10); MIOS_MIDI_TxBufferPut(0x00); MIOS_DOUT_PinSet0(10); MIOS_MIDI_EndStream(); } else { MoniA = 1; MIOS_MIDI_BeginStream(); MIOS_MIDI_TxBufferPut(0x9f); MIOS_MIDI_TxBufferPut(10); MIOS_MIDI_TxBufferPut(0x7f); MIOS_DOUT_PinSet1(10); MIOS_MIDI_EndStream(); MIOS_MIDI_BeginStream(); MIOS_LCD_Clear(); MIOS_LCD_PrintCString("Button "); MIOS_LCD_PrintBCD4(pin); MIOS_MIDI_EndStream(); } } aber egal welchen Taster ich drücke, es kommt immer der gleiche Wert timestamp 715654000 us: [9F 0A 7F] channel 16: note On A#-1 velocity: 127 timestamp 715907000 us: [9F 0A 00] channel 16: note On A#-1 velocity: 0 timestamp 717202000 us: [9F 0A 7F] channel 16: note On A#-1 velocity: 127 timestamp 717705000 us: [9F 0A 00] channel 16: note On A#-1 velocity: 0Ich möchte damit aber nur quasi den Monitortaster an pin 10 toggeln und die dazugehörige Led zum leuchten bringen...die Led leuchtet mal *Fortschritt ;D ;DKann mir das mal jemand schnell korrigieren, dann komme ich endlich mal voran (wär zu schön um wahr zu sein :) )GrüßeMTE Quote Link to comment Share on other sites More sharing options...
audiocommander Posted September 13, 2006 Report Share Posted September 13, 2006 hmm, verstehe ich nicht...wenn du beidesmal [tt]MIOS_MIDI_TxBufferPut(10);[/tt] aufrufst, wird auch jedesmal 10 (A#-1) gesendet. Alles alles so, wie's da steht.dann noch ein tipp: [tt] if(pin_value != 0) [/tt] kannst du auch einfach so ausdrücken: [tt] if(pin_value) [/tt]; das wird dann bejaht, wenn pin_value größer als null ist, bzw. irgendeinen wert hat. I.d.F. wird es aber nur 1 sein.grüße,ac Quote Link to comment Share on other sites More sharing options...
MTE Posted September 13, 2006 Author Report Share Posted September 13, 2006 Die Zeile...MIOS_MIDI_TxBufferPut(10); sollte eigentlich für Pin 10 stehen....oh mann langsam blick ich gar nix mehr :( Quote Link to comment Share on other sites More sharing options...
audiocommander Posted September 13, 2006 Report Share Posted September 13, 2006 den Pin (am DOUT) schaltest du ja mit [tt]MIOS_DOUT_PinSet0(10);[/tt]MIOS_MIDI_TxBuffer ist natürlich eine Midi-Funktion: am besten, du schaust mal die hervorragenden Midi-Artikel in unserem Wiki an; da ist das Midi-Protokoll super beschrieben (wenn du da nocht nicht so sicher bist):kurz gesagt besteht eine Midi-Message aus zwei oder drei Bytes; wenn du Note_Ons sendest aus drei: 1. NOTE_ON auf CHANNEL x (i.d.F.: 0x9f => 0x90 + CH 0x0f)2. Notenhöhe (Taste) (i.d.F.: 10)3. Velocity (Notenlautstärke) (i.d.F.: 0x0 bzw. 0x7f)Grüße,AC Quote Link to comment Share on other sites More sharing options...
MTE Posted September 13, 2006 Author Report Share Posted September 13, 2006 ahhh ok so langsam wird es mir klar...da kann es ja net gehendas mit der ersten zeile wusste ich....0x9f bedeutet 0x (keine Ahnung :) ) die 9 für noteon, 8 wäre noteoff) und f für den kanal 16, e wäre kanal 15 etc...ich dachte halt immer bei der 2. zeile wird der pin definiert ::)die valuedefinition in zeile 3 war mir auch noch klarnungut,wie sage ich dann nun im endeffekt das das alles nur auf pin 10 zulässig sein soll ???dicken Dank mal, wenn ich so weiter mache habe ich die Firmware in 2 Jahren fertig ;Dne ernsthaft...das Galileobuch ziehe ich mir jeden tag rein,aber nach ner halben stunde raucht mir übelst die birne, bin für logische schaltungsfolgen irgendwie nicht gebaut, mathe war nie mein ding....aber da muss man halt jetz durch :) Quote Link to comment Share on other sites More sharing options...
audiocommander Posted September 13, 2006 Report Share Posted September 13, 2006 in Mathe war ich auch immer schlecht ;D0x9f bedeutet 0x (keine Ahnung ) die 9 für noteon, 8 wäre noteoff) und f für den kanal 16, e wäre kanal 15 etc...0x heißt einfach, dass es sich um eine Zahl im Hexadezimalen (16er) Zahlenraum handelt. D.h. es wird nicht wie im Dezimalen (10er) von 0 bis 9 gezählt und dann von 10 bis 19 usw..., sondern von 0 bis 15 (0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f). Wenn es geht, besorge dir mal einen Software-Taschenrechner, der das Umrechnen von Dezimal in Hexadezimal beherrscht, das ist bei Bitoperationen und Midi-Rechenzeugs immer von Vorteil!nungut,wie sage ich dann nun im endeffekt das das alles nur auf pin 10 zulässig sein sollVerstehe ich richtig, dass du das nur bearbeitet haben möchtest, wenn DIN-Pin#10 gedrückt wird? Na, dann einfach: [tt] if(pin == 10) [/tt] oder:[tt]switch(pin) { case 10: // do this and that break; case 999: // wenn pin 999 gedrückt wird oder sonst ein pin, nur als beispiel... break;} [tt] Quote Link to comment Share on other sites More sharing options...
MTE Posted September 13, 2006 Author Report Share Posted September 13, 2006 if(pin_value) return; // exit if button has not been pressed if(pin == 10) if(MoniA) { MoniA = 0; MIOS_MIDI_BeginStream(); MIOS_MIDI_TxBufferPut(0x9f); MIOS_MIDI_TxBufferPut(10); MIOS_MIDI_TxBufferPut(0x00); MIOS_DOUT_PinSet0(10); MIOS_MIDI_EndStream(); } else { MoniA = 1; MIOS_MIDI_BeginStream(); MIOS_MIDI_TxBufferPut(0x9f); MIOS_MIDI_TxBufferPut(10); MIOS_MIDI_TxBufferPut(0x7f); MIOS_DOUT_PinSet1(10); MIOS_MIDI_EndStream(); MIOS_MIDI_BeginStream(); MIOS_LCD_Clear(); MIOS_LCD_PrintCString("Button "); MIOS_LCD_PrintBCD4(pin); MIOS_MIDI_EndStream(); } }FUNZT :D *umdenHalsfallna endlich geht das mal, mit dem richtigen anstoss kann ich jetz endlich mal loslegen :)Dankäääääääääääääää*Fortsetzung folgt ;D Quote Link to comment Share on other sites More sharing options...
MTE Posted September 13, 2006 Author Report Share Posted September 13, 2006 soderle mal ein paar Taster getoggelt und einige auf on/off gestellt ;)wird halt ein riesen Code, aber ich denke das geht schon, hab mal die main.c upgeloadet--> www.people.freenet.de/mte/Traktorizer/main.cschaut sie euch mal an, evtl hat jemand Verbesserungsvorschläge um den Code ebbes zu schrumpfenSo, nexter Schritt wäre wie hier unter Taster Wechsel-Modis für Cueplay.... in meiner Wiki-Sektion beschrieben--> http://www.midibox.org/dokuwiki/doku.php?id=firmware-programmierung_in_cjemand ne idee wie ich das sauber umsetzen kann ?GrüßeMTEEDIT : haha goiiiieeel...grad noch ein feature verbaut...Jogwheel links gedreht...leuchtets grün, rechts gedreht...leuchtets rot :D :D MIOS_DOUT_PinSet1(pin); rockt ;D Quote Link to comment Share on other sites More sharing options...
MTE Posted September 14, 2006 Author Report Share Posted September 14, 2006 Was bedeutet diese Fehlermeldung : warning 126: unreachable code ?kriege das beim compilieren.....die Zeile 1077 müsste doch korrekt sein ---> siehe AttachmentsGrüßeMTE Quote Link to comment Share on other sites More sharing options...
audiocommander Posted September 14, 2006 Report Share Posted September 14, 2006 unreachable code heißt, dass der code (in deinem Fall der else-Teil der Schleife) niemals erreicht werden kann.Du hast einen ganz einfachen Anfängerfehler gemacht, der auch vielen anderen noch häufig passiert: es heißt nicht = (ist) sondern == (ist gleich); das eine ist ein sog. Zuweisungsoperator (x = 1); das andere ein logischer Vergleichsoperator ( if(x == 1) ).;)Grüße,Michaelps: wenn Loopstep1A 1 ist, brauchst du danach eigentlich nicht Loopstep1A = 1 schreiben...pps: noch ein Tipp: Variablen schreibt man gewöhnlich immer mit Kleinbuchstaben. Ich glaube in dem C-Buch gibt es auch ein paar coding-style Hinweise:z.B. - DEFINES- var oder myVar- MyFunction()Das muss man natürlich nicht machen, aber ein guter Style ist auch gut lesbar und beugt so vielen Flüchtigkeitsfehlern vor.Du kannst deine eigenen Funktionen oder Variablen auch gerne mit einem Präfix versehen, zb. MTE_Traktorizer_Play() oder mteCueStatus oder MTE_LCD_MESSAGE...(das wäre auch was feines für deine Traktorizer-bezogenen Wiki-Files ;) ) Quote Link to comment Share on other sites More sharing options...
MTE Posted September 15, 2006 Author Report Share Posted September 15, 2006 alles klar...nun bin ich wieder ein großes Stück weiter :)stehe fast vor der Lösung...if(pin == 56) if(Loopstep1A) { Loopstep1A = 1; MIOS_MIDI_BeginStream(); MIOS_MIDI_TxBufferPut(0x9f); MIOS_MIDI_TxBufferPut(pin); MIOS_MIDI_TxBufferPut(0x7f); MIOS_DOUT_PinSet1(pin); MIOS_MIDI_EndStream(); }else{ Loopstep1A = 1; MIOS_DOUT_PinSet1(56); Loopstep4A = 0; MIOS_DOUT_PinSet0(57); Loopstep8A = 0; MIOS_DOUT_PinSet0(58); Loopstep16A = 0; MIOS_DOUT_PinSet0(59); }damit habe ich vor, im Traktor die Loopsteps zu steuern...auf deutsch....4 Taster und 4 leds...wenn 1 Taster gedrückt bleibt er solange an,bis er von einen der anderen 4 abgelöst wird.Nun habe ich aber im obigen Code noch ein klitzekleines Problem zu lösen :wenn ich zuerst einen Taster drücke geht zuerst die LED an und er sendet keinen Midievent....nochmal gedrückt folgt dann endlich der Event...gleiches ist dann wenn ich einen der anderen Taster betätige...erst leuchtet die LEd, beim 2.drücken dann der Event.........wo ist der Haken ?P.S.: der obige code ist nur für Taster Step 1...man nehme quasi diesen code 4 mal untereinander mit den anderen Step-Variablen um es auf alle Taster zu bestimmen ;)GrüßeMTE Quote Link to comment Share on other sites More sharing options...
audiocommander Posted September 15, 2006 Report Share Posted September 15, 2006 wenn ich zuerst einen Taster drücke geht zuerst die LED an und er sendet keinen Midievent....nochmal gedrückt folgt dann endlich der Event...gleiches ist dann wenn ich einen der anderen Taster betätige...erst leuchtet die LEd, beim 2.drücken dann der Event.........wo ist der Haken ?na, ich schätze mal, dein Loopstep1A ist 0. Dann kommt die else-Schleife, der Loopstep1A wird auf 1 gesetzt, die LEDs werden geschalten und die Funktion beendet. Beim nächsten mal ist Loopstep1A 1 und der if-Teil der Schleife wird bearbeitet. Also im Prinzip macht es das, was da steht ;DGrüße,MichaelÜbrigens: wenn du mehrere ON/OFF switches speichern möchtest, dann solltest du nicht mehrere unsigned chars dafür nehmen, sondern ein sog. "Bitfeld". Damit kannst du in einer Struktur (struct) bis zu 8 AN/AUS Stadien speichern.Der Grund dafür ist, dass 1 unsigned char aus 8 Bytes besteht; bei sagen wir mal 8 Loopsteps wären das 64 Bytes. Als Bitfeld kann man das auf 8 Bytes erledigen.Aber Achtung! SDCC-Stolperfalle: SDCC unterstützt maximal 8 Byte lange Bitfelder; d.h. wenn du mehr als 8 bits brauchst, dann musst du mehrere Bitfelder erstellen;Wenn du massig Platz hast und nicht viele Features geplant sind, musst du das nicht unbedingt machen, es wäre aber die empfohlene Methode zum Speichern kleinbittiger Variablen.Das Beispiel dafür habe ich kürzlich schon mal in just diesem Thread gepostet: http://www.midibox.org/forum/index.php?topic=6871.msg50985#msg50985 Quote Link to comment Share on other sites More sharing options...
MTE Posted September 15, 2006 Author Report Share Posted September 15, 2006 Suuuuupi :)habe mittlerweile den Code um eiiiiiiiiniges schrumpfen können (hab die ODER " || " Funktion entdeckt :) )aber dadurch entstanden kleine andere Bugs.Mittlerweile lässt sich aber alles sehr einfach lesen (und vorallem kapieren :D ).Die Firmware wird eigentlich sehr winzig, sind ja nur Jogwheel, Taster und LED Funktionen....später dann noch das Scratchen, das wird denke ich auch net viel Platz verschwenden....ansonsten pack ich das alles halt in einen 4620er...hab glaube ich die neue Version als Sample bekommen...muss das noch mit dem "Revision_ID"-progrämmchen abchecken.Auf jeden Fall flutscht es seit 2 Tagen und macht riesig Spaß es immer an der Box gleich auszuprobieren :)Auf baldMTE Quote Link to comment Share on other sites More sharing options...
MTE Posted September 15, 2006 Author Report Share Posted September 15, 2006 if(pin == 56) { MIOS_MIDI_BeginStream(); MIOS_MIDI_TxBufferPut(0x9f); MIOS_MIDI_TxBufferPut(pin); MIOS_MIDI_TxBufferPut(0x7f); MIOS_DOUT_PinSet1(pin); MIOS_DOUT_PinSet0(57); MIOS_DOUT_PinSet0(58); MIOS_DOUT_PinSet0(59); MIOS_MIDI_EndStream(); MIOS_MIDI_BeginStream(); MIOS_LCD_Clear(); MIOS_LCD_PrintCString("Button :"); MIOS_LCD_PrintBCD4(pin); MIOS_MIDI_EndStream(); }perfekt....funzt...tralala....luftsprung ;D Quote Link to comment Share on other sites More sharing options...
audiocommander Posted September 15, 2006 Report Share Posted September 15, 2006 MIOS_MIDI_Begin und EndStream(); sind nur notwendig, wenn dazwischen auch MIOS_MIDI_TxBufferPut() kommt;) Quote Link to comment Share on other sites More sharing options...
MTE Posted September 15, 2006 Author Report Share Posted September 15, 2006 Codeschrumpfung immä gut ;D :D Quote Link to comment Share on other sites More sharing options...
stryd_one Posted September 16, 2006 Report Share Posted September 16, 2006 OK after 8 pages of posts I have to ask ..... What are you crazy Germans up to here? ;)I hope there might be a very small explanation in english one day, for those of us not fortunate enough to sprechen Sie Deutsches. That last part is brought to you by babelfish ;D Quote Link to comment Share on other sites More sharing options...
audiocommander Posted September 16, 2006 Report Share Posted September 16, 2006 What are you crazy Germans up to here? of course we're planing to take over the world!and we begin with taking over the number #2 of most-replied-threads in this forum!uups... now I revealed our secret plans :-X ;Dwell, bad jokes aside: I'm just giving some coding tipps from time to time, but MTE and Wild_Weasel are up to build a Traktor-Box /-Controller with Scratching Features and DJ-stuff (if I got that right, please correct me if I'm wrong, after 8 pages one tends to loose the oversight... ;) )They both have set up Wiki-Pages; there's some info in English, too: http://www.midibox.org/dokuwiki/doku.php?id=midibox_traktorso, no world-domination until now (puhh, what a luck!) ;Dcheers!Michael Quote Link to comment Share on other sites More sharing options...
MTE Posted September 16, 2006 Author Report Share Posted September 16, 2006 Looooo-fuggin-oooolll ;Dno the first place for world domination is only reserved for TK ! ;) :DIve looked for an english & C-Code-Babelfish too, but no chance...searched all over the web >:(but found the best substitute, called Audiocommander :P ;D 8) ... a great dude which make impressive works !!The Traktorizer is a big challenge and of course the next step...the scratch-function, i have no plan how we will realize this.....but im on it :)So now 2morrow (oops i forgot the time, i mean later ;D ) i will update the english section at the wiki and hope, some other ppl can give us programming-noobs some good impressions for our code :)wet dreams :)MTEEDIT : Wiki pages now little updated ;Dgoodnight Quote Link to comment Share on other sites More sharing options...
stryd_one Posted September 16, 2006 Report Share Posted September 16, 2006 LOL Thanks guys :) I'll go back to lurking around this thread in babelfish now :) Quote Link to comment Share on other sites More sharing options...
MTE Posted September 19, 2006 Author Report Share Posted September 19, 2006 @ Wild Weaselich muss sagen, deine Pitchbendlösung (im Code) ist eigentlich echt genial definiert.Saß gerade an meiner Windencoder-Funktion und duplizierte für diesen deine Zeilen vom pitchbendin Traktor 3 habe ich dann die up-down-definition auf "switch" gestellt......es klingt FAST wie gescratcht....bin dem Ziel sehr nahe...werde nun etwas mit dem Mios_Delay rumspielen und schauen, wie sich das als scratching weiterverhält.Falls du (und natürlich auch alle anderen, die das hier lesen) in den Code reinschauen wilst...der liegt hier--> http://people.freenet.de/mte/Traktorizer/Traktorizer_V1.3.zip ;)Der Code ist fast fertig, werde dafür dann auch noch eine Anleitung schreiben, inwieweit man wo und wie die DIN-Pins umschreiben muss, damit jede Funktion am richtigen DIN-Pin liegt (lötet ja nicht jeder nach meiner schematic)Dazu liegt an jedem Button (und sogar am Pitchbend-und Windencoder) gleich die dazugehörige LED + Status geht ganz easy mit "MIOS_DOUT_PinSet(pin, value);" ;)Enjoy :)MTE Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.