Jump to content

Traktorizer - Blog


MTE

Recommended Posts

Hi

also, 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

Link to comment
Share on other sites

  • Replies 231
  • Created
  • Last Reply

Top Posters In This Topic

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

Link to comment
Share on other sites

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 reinzutun

http://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 drauf
  • Noch höhere Auflösung wegen der Ãœbersetzung des grossen Wheels auf den Encoder
  • Schlupffrei, weil der Gummiring nicht rutschen kann, Haftreibung

Wer baut einen Prototyp ????  ;D  ;D  ;D

grüsse

m.

Link to comment
Share on other sites

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  ;D

hast doch so nen Omnitronic zum ausschlachten  :)

Link to comment
Share on other sites

Hi

habe 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: 0

Ich 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  ;D

Kann mir das mal jemand schnell korrigieren, dann komme ich endlich mal voran (wär zu schön um wahr zu sein :) )

Grüße

MTE

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

ahhh ok so langsam wird es mir klar...da kann es ja net gehen

das 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 klar

nungut,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  ;D

ne 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

:)

Link to comment
Share on other sites

in Mathe war ich auch immer schlecht ;D

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...

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 soll

Verstehe 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]

Link to comment
Share on other sites

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 *umdenHalsfall

na endlich geht das mal, mit dem richtigen anstoss kann ich jetz endlich mal loslegen  :)

Dankäääääääääääääää

*Fortsetzung folgt  ;D

Link to comment
Share on other sites

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.c

schaut sie euch mal an, evtl hat jemand Verbesserungsvorschläge um den Code ebbes zu schrumpfen

So,

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_c

jemand ne idee wie ich das sauber umsetzen kann ?

Grüße

MTE

EDIT : 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

Link to comment
Share on other sites

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,

Michael

ps: 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 ;) )

Link to comment
Share on other sites

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üße

MTE

Link to comment
Share on other sites

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 ;D

Grüß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

Link to comment
Share on other sites

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 bald

MTE

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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  ;D

well, 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_traktor

so, no world-domination until now (puhh, what a luck!) ;D

cheers!

Michael

Link to comment
Share on other sites

Looooo-fuggin-oooolll  ;D

no the first place for world domination is only reserved for TK !   ;)   :D

Ive 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 :)

MTE

EDIT : Wiki pages now little updated  ;D

goodnight

Link to comment
Share on other sites

@ Wild Weasel

ich 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 pitchbend

in 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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...