USB MIDI Controller - PIC18F4550
USB MIDI Controller - PIC18F4550
Hej,
Jag håller på att bygga en USB MIDI controller.
MIDI kontrollen kan användas för att styra olika musik program på datorn.
Man kan använda controllen som ett rent mixer bord eller så kan man
styra t.ex olika effekter med den.
En rätt avancerad kommersiell midi kontroll ser ut så här.
Kärnan i systemet är en PIC18F4550, den har inbyggt stöd för USB samt
många portar. Idags läget finns det endast en knapp kopplad som skickar ett NOTE ON kommando.
Jag har tagit ett COM port exempel från Microchips
hemsida och skrivit om det till så det passar USB AUDIO.
Man behöver altså inga drivrutiner utan det är bara att koppla in.
I slut ändan är tanken att jag skall ha många rattar och knappar - eventuellt
en display också.
Exact hur fördelningen på detta skall vara är ännu inte bestämt.
Jag håller på att bygga en USB MIDI controller.
MIDI kontrollen kan användas för att styra olika musik program på datorn.
Man kan använda controllen som ett rent mixer bord eller så kan man
styra t.ex olika effekter med den.
En rätt avancerad kommersiell midi kontroll ser ut så här.
Kärnan i systemet är en PIC18F4550, den har inbyggt stöd för USB samt
många portar. Idags läget finns det endast en knapp kopplad som skickar ett NOTE ON kommando.
Jag har tagit ett COM port exempel från Microchips
hemsida och skrivit om det till så det passar USB AUDIO.
Man behöver altså inga drivrutiner utan det är bara att koppla in.
I slut ändan är tanken att jag skall ha många rattar och knappar - eventuellt
en display också.
Exact hur fördelningen på detta skall vara är ännu inte bestämt.
- JimmyAndersson
- Inlägg: 26540
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
Kul projekt.
Är det tänkt att du ska använda både reglar (skjutpotar) och vridpotar som i BCF2000?
Jag har förresten den mixern. Mycket trevlig pryl!
Jag såg din tråd om att läsa av många potar med en PIC-krets.
För att göra det lite enklare så kan du använda encoders istället för vridpotar. Då slipper du problemet med att pot-ratten är inställd på ett värde och datorns mixerprogram visar ett annat. Dessutom kan encoders vridas runt hur många varv som helst, vilket gör finjusteringar lättare.
Det finns även skjut-encoders, men de är varken billiga eller helt lätta att få tag i.
Hur menar du med "USB Audio" ? Känner inte igen det namnet.

Är det tänkt att du ska använda både reglar (skjutpotar) och vridpotar som i BCF2000?
Jag har förresten den mixern. Mycket trevlig pryl!

Jag såg din tråd om att läsa av många potar med en PIC-krets.
För att göra det lite enklare så kan du använda encoders istället för vridpotar. Då slipper du problemet med att pot-ratten är inställd på ett värde och datorns mixerprogram visar ett annat. Dessutom kan encoders vridas runt hur många varv som helst, vilket gör finjusteringar lättare.
Det finns även skjut-encoders, men de är varken billiga eller helt lätta att få tag i.
Hur menar du med "USB Audio" ? Känner inte igen det namnet.
>Är det tänkt att du ska använda både reglar (skjutpotar) och vridpotar som >i BCF2000?
>Jag har förresten den mixern. Mycket trevlig pryl!
Hehe se där.
Den verkar vara grym.
>Jag såg din tråd om att läsa av många potar med en PIC-krets.
>För att göra det lite enklare så kan du använda encoders istället för >vridpotar. Då slipper du problemet med att pot-ratten är inställd på ett >värde och datorns mixerprogram visar ett annat. Dessutom kan encoders >vridas runt hur många varv som helst, vilket gör finjusteringar lättare.
Aha! Hade en plan på det först men viste inte att det hette Rotationssensorer
Det löser problemet med AD.
Då kan man också spara ner presets! Presets med vridpot kräver ju motoriserade.
Giverts vis skall jag skall jag ha skjutreglar men dessa behöver nog inte vara encoders.
>Hur menar du med "USB Audio" ? Känner inte igen det namnet.
USB Audio Device
När man pluggar in en audio enhet så registreras den som detta.
Det kan altså vara allt från MIDI till rena ljudkort.
Oftast så ser man inte det namnet för att man installerar tillverkarens drivrutin, drivrutinen byter då namn till något annat.
Det är möjligt att man kan byta namn ändå utan drivrutiner - men jag vet inte hur.
Vissa midicontrollers (t.ex MidiSport tror jag) registerar sig inte alls somett audio device utan bara som en enhet som kan kommunicera (lite som en COM port).
Sedan när man installerar drivrutinen så gör den MIDI av det.
(Vissa drivrutiner skall man t.exinstallera innan man pluggar in devicet)
Rotationssensorer! Har letat eftersådana men inte kommit på vad det hette! Tack!
>Jag har förresten den mixern. Mycket trevlig pryl!

Hehe se där.
Den verkar vara grym.
>Jag såg din tråd om att läsa av många potar med en PIC-krets.
>För att göra det lite enklare så kan du använda encoders istället för >vridpotar. Då slipper du problemet med att pot-ratten är inställd på ett >värde och datorns mixerprogram visar ett annat. Dessutom kan encoders >vridas runt hur många varv som helst, vilket gör finjusteringar lättare.
Aha! Hade en plan på det först men viste inte att det hette Rotationssensorer

Det löser problemet med AD.
Då kan man också spara ner presets! Presets med vridpot kräver ju motoriserade.
Giverts vis skall jag skall jag ha skjutreglar men dessa behöver nog inte vara encoders.
>Hur menar du med "USB Audio" ? Känner inte igen det namnet.
USB Audio Device
När man pluggar in en audio enhet så registreras den som detta.
Det kan altså vara allt från MIDI till rena ljudkort.
Oftast så ser man inte det namnet för att man installerar tillverkarens drivrutin, drivrutinen byter då namn till något annat.
Det är möjligt att man kan byta namn ändå utan drivrutiner - men jag vet inte hur.
Vissa midicontrollers (t.ex MidiSport tror jag) registerar sig inte alls somett audio device utan bara som en enhet som kan kommunicera (lite som en COM port).
Sedan när man installerar drivrutinen så gör den MIDI av det.
(Vissa drivrutiner skall man t.exinstallera innan man pluggar in devicet)
Rotationssensorer! Har letat eftersådana men inte kommit på vad det hette! Tack!
- JimmyAndersson
- Inlägg: 26540
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
"USB Audio Device. När man pluggar in en audio enhet så registreras den som detta."
Aha, det låter intressant! Jag har annars fuskat och använt t.ex en PIC18F2320 och en FTDI FT232R som gör om till USB-anslutning, men din lösning låter mycket trevligare.
Hur gör man för att en PIC18F4550 ska registreras som ett USB Audio Device?
Länk? Kod?
Aha, det låter intressant! Jag har annars fuskat och använt t.ex en PIC18F2320 och en FTDI FT232R som gör om till USB-anslutning, men din lösning låter mycket trevligare.

Hur gör man för att en PIC18F4550 ska registreras som ett USB Audio Device?
Länk? Kod?

Det är faktiskt ganska lätt, jag utgick från ett Microchip exempel.
1. Ladda ner CDC COM ports exempel. Det finns någon som har portat detta till C18 kompilatorerna.
Se till att detta funkar.
2. Sedan så skriver man descriptorn (i usbdev.c tror jag den ligger). Jag tog exemplet rakt av från USB Midi Spec.
Då kommer den registera sig som ett Audio instrument med 1 MIDI IN och 1 MIDI out.
3. CDC exemplet har 2 stycken endpoints (typ kommunikations kanaler), det räcker med en. Jag rensade upp ganska mycket.
Jag hade stora problem innan pga av ett usb-sniffer program ställde till det. Men närjag avinstallerade det så funkade det.
Mina fungerade descriptors i hexform finns på http://www.freelists.org/archives/wdmau ... 00042.html (Heter ken bensson där
Jag är inte hemma nu och skall bort över helgen, men skall se ifall jag kan få iväg koden till dig.
[/url]
1. Ladda ner CDC COM ports exempel. Det finns någon som har portat detta till C18 kompilatorerna.
Se till att detta funkar.
2. Sedan så skriver man descriptorn (i usbdev.c tror jag den ligger). Jag tog exemplet rakt av från USB Midi Spec.
Då kommer den registera sig som ett Audio instrument med 1 MIDI IN och 1 MIDI out.
3. CDC exemplet har 2 stycken endpoints (typ kommunikations kanaler), det räcker med en. Jag rensade upp ganska mycket.
Jag hade stora problem innan pga av ett usb-sniffer program ställde till det. Men närjag avinstallerade det så funkade det.
Mina fungerade descriptors i hexform finns på http://www.freelists.org/archives/wdmau ... 00042.html (Heter ken bensson där

Jag är inte hemma nu och skall bort över helgen, men skall se ifall jag kan få iväg koden till dig.
[/url]
- JimmyAndersson
- Inlägg: 26540
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
Hej,
Jag har skickat upp filerna på: http://www.hakenas.se/USBTest.zip
För att kunna köra dem så behöver du följande:
HI-TIDE 3.12PL1 (finns på Hi Techs hemsida gratis)
PICC-18 (PL3) v9.50 PL3 (finns som trial, ej pro versionen)
Installera HITIDE och kompilatorn. När du startar HI IDE och den frågar efter workspace location så väljer du där USBTest mappen ligger.
(hoppas att detta räcker, i annat fall får du försöka skapa ett nytt projekt).
Bygg projektet, efter det så finns det en hex fil i Release mappen.
--------------
/main.c
i mainloop:
USBCheckBusStatus(); Dessa körs varje loop för att ta hand om USB
USBDriverService();
MIDIRxService(); körs varje gång per loop och tar imot data. (i en dummy array)
MIDITxService(); Körs när man trycker ner en knapp. Hårdkodad data
/autofiles/usbdsc.c
Innehåller descriptors.
/usb/class/midi/midi.c
Innehåller funktioner för att skicka data.
I dags läget är det hårdkodat och den skickar bara en NOTE ON E4.
-----------------
- Förutom en knapp på port A1 och en lysdiod på port A0 så är det ett väldigt standard schema.
-Du kan inte använda interna oscilatorn till usb!! Måste ha en extern!
(jag har 20mhz kristal)
All kod är skriven i "komma igång" style, så gör du förbättringar får du gärna skicka tillbaks. (typ funktioner för att skicka noteon, noteoff, controllchange osv..)
Lycka till.
Jag har skickat upp filerna på: http://www.hakenas.se/USBTest.zip
För att kunna köra dem så behöver du följande:
HI-TIDE 3.12PL1 (finns på Hi Techs hemsida gratis)
PICC-18 (PL3) v9.50 PL3 (finns som trial, ej pro versionen)
Installera HITIDE och kompilatorn. När du startar HI IDE och den frågar efter workspace location så väljer du där USBTest mappen ligger.
(hoppas att detta räcker, i annat fall får du försöka skapa ett nytt projekt).
Bygg projektet, efter det så finns det en hex fil i Release mappen.
--------------
/main.c
i mainloop:
USBCheckBusStatus(); Dessa körs varje loop för att ta hand om USB
USBDriverService();
MIDIRxService(); körs varje gång per loop och tar imot data. (i en dummy array)
MIDITxService(); Körs när man trycker ner en knapp. Hårdkodad data
/autofiles/usbdsc.c
Innehåller descriptors.
/usb/class/midi/midi.c
Innehåller funktioner för att skicka data.
I dags läget är det hårdkodat och den skickar bara en NOTE ON E4.
-----------------
- Förutom en knapp på port A1 och en lysdiod på port A0 så är det ett väldigt standard schema.
-Du kan inte använda interna oscilatorn till usb!! Måste ha en extern!
(jag har 20mhz kristal)
All kod är skriven i "komma igång" style, så gör du förbättringar får du gärna skicka tillbaks. (typ funktioner för att skicka noteon, noteoff, controllchange osv..)
Lycka till.
- JimmyAndersson
- Inlägg: 26540
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
- bengt-re
- EF Sponsor
- Inlägg: 4829
- Blev medlem: 4 april 2005, 16:18:59
- Skype: bengt-re
- Ort: Söder om söder
- Kontakt:
jag sitter också och "leker" med PIC18F4550 i mitt fall försöker jag göra ett "tangetbord" och enjoystick med 8 knappar enbart, men har fortfarande inte riktigt fått till det -PIC18F4550 och C18 är dock en trevlig kombination - bara jag inte inte fattat allt med USB än.... Lite knöligt med alla EP och descriptors.....
- bengt-re
- EF Sponsor
- Inlägg: 4829
- Blev medlem: 4 april 2005, 16:18:59
- Skype: bengt-re
- Ort: Söder om söder
- Kontakt:
Ja, HID-joy OCH HID-kbd. Idén är att man sedan ansluter externa kontakter som kortsluter valda portpinnar och då ger knappevent eller joystick event till mjukvaran på målsystemet. Mus och musknappar var rätt enkelt, för det har jag bråkat med tidigare och dessutom så hade microchip en expempelkod som fungerade med små modifieringar. Dock så var det HID-mouse denna gången som jag skulle göra. Har gammal kod från 16C745, men assamblerkod för 16-serien är inte direkt att bara flytta över till 18F - iaf inte med USB då det skiljer sig en massa "junk" och desutom var den gamla koden dåligt dokumenterad, så jag minns inte rakt av vad jag gjorde den gången... *suck*
Jaja, går man tid över så skall det nog att gå lösa detta också...
Jaja, går man tid över så skall det nog att gå lösa detta också...
- bengt-re
- EF Sponsor
- Inlägg: 4829
- Blev medlem: 4 april 2005, 16:18:59
- Skype: bengt-re
- Ort: Söder om söder
- Kontakt:
*skrattar* Ja, gärna - USB är rätt mycket stökigare än de flesta andra interface. Gäller bara att lyckas hitta tillräckligt med tid för att läsa in sig på "allt". Det är inte utan att man känner sig lite korkat även när man tittar på speciella USB-forum.... De flesta har läst in sig en aning bättre än en själv.... Och innan man ens kan ställa frågorna bör man ju likssom ha gått i väggen själv, så bara att plöja datablad, manualer och standarder till dess att man börjar förstå USB ordentligt.