Bygga MIDI interface av USB mus/t-bord?

Planering och tankar kring eventuella framtida projekt.
Användarvisningsbild
Bigstone
Inlägg: 592
Blev medlem: 22 september 2004, 13:04:12
Ort: Linköping

Bygga MIDI interface av USB mus/t-bord?

Inlägg av Bigstone »

Leker med tanken att bygga ett enkelt portabelt MIDI interface utan för mycket meck med redan existerande delar man har.
Visst, det finns ju färdiga "kablar" (har bara dåliga erfarenheter av dem by the way! :evil:), Arduino, PIC osv. men tanken är svår att släppa om än teoretiskt.
Det kastas USB möss och tangentbord till höger och vänster på jobbet och de är ju egentligen seriella men frågan är om de skulle kunna konverteras till att kunna sända och ta emot MIDI data från syntar?

Klippt från Wikip. :
MIDI-porten är en asynkron seriell databuss i full duplex liknande EIA-232.
Som kontakt används en 5-polig DIN-kontakt.
MIDI-porten använder optokopplare för att eliminera jordslingor och på så sätt undvika brum och andra elektromagnetisk interferens.
MIDI-porten skickar information som strömnivåer över en kabel. Ström används istället för spänning för att övervinna dåliga kablar och längre avstånd då en spänning skulle sjunka på grund av resistanser.

Standardhastigheten för MIDI-porten är 31 250 bit/s och varje informationspaket skickas med 3 byte samt en start- och stoppbit för varje byte.

Det är liksom hastigheten som är kruxet, att köra det på en PS/2 port hade ju varit smidigt men den är inte tillräckligt snabb. Usb 1.1 klarar 1.5Mb/s så det finns ju potetial. Sedan var det ju själva protokollet och drivrutinerna då.. är kanske inte helt samma sak gissar jag men kanske lite hemkörda drivrutiner?

Fullständigt hopplöst eller går det att applicera på en USB råtta eller ett t-bord?
Vad tror ni? Förslag, ideér och tips mottages gärna.
Användarvisningsbild
psynoise
EF Sponsor
Inlägg: 7226
Blev medlem: 26 juni 2003, 19:23:36
Ort: Landvetter

Re: Bygga MIDI interface av USB mus/t-bord?

Inlägg av psynoise »

Texten från Wikipedia var underlig, inte mycket som stämde där. RS-232 har inget med protokoll att göra utan endast det elektriska gränssnittet som skiljer sig från MIDI! Det finns bra litteratur om MIDI, se tråden Litteraturförteckning för mixerbordskonstruktion under MIDI för några exempel.

http://elektronikforumet.com/forum/view ... 10&t=51772

Ytterliggare fanns det en bra hemsida om MIDI tidigare. Tyvärr är den borttagen sedan länge men en backup finns på TomasLs sida

http://www.ebaman.com/
Användarvisningsbild
Bigstone
Inlägg: 592
Blev medlem: 22 september 2004, 13:04:12
Ort: Linköping

Re: Bygga MIDI interface av USB mus/t-bord?

Inlägg av Bigstone »

Har inte hunnit labba något än men ska bli.
Någon som har något tips på vad man ev. skulle kunna konvertera till midi-interface?
Egentligen bara som ett kul projekt, billigare att köpa ett färdigt men inte lika kul som att försöka själv!
(Arduino är ju givet också.)
GFEF
Inlägg: 2383
Blev medlem: 4 december 2004, 18:44:04

Re: Bygga MIDI interface av USB mus/t-bord?

Inlägg av GFEF »

Bigstone
>Någon som har något tips på vad man ev. skulle kunna konvertera till midi-interface?

En ren skrivbords tips........

http://www.lawicel-shop.se/prod/USB-Pro ... 39/SWE/SEK
Fredrik79
Inlägg: 173
Blev medlem: 18 februari 2012, 00:03:19

Re: Bygga MIDI interface av USB mus/t-bord?

Inlägg av Fredrik79 »

Jag byggde nyligen ett interface för att koppla gammal joystick/midi-port till usb, baserat på en pic18F2550, Funkar kalas. Det är ju dock inte en modifierad USB-pryl som du skrev att du letar efter, men undrar om det inte nästan är enklare att göra så, behövs ingen speciell drivrutin för den heller, utan bara firmware (baserade min på microchips midi-exempel).
Användarvisningsbild
Bigstone
Inlägg: 592
Blev medlem: 22 september 2004, 13:04:12
Ort: Linköping

Re: Bygga MIDI interface av USB mus/t-bord?

Inlägg av Bigstone »

Jag byggde nyligen ett interface för att koppla gammal joystick/midi-port till usb, baserat på en pic18F2550, Funkar kalas. Det är ju dock inte en modifierad USB-pryl som du skrev att du letar efter, men undrar om det inte nästan är enklare att göra så, behövs ingen speciell drivrutin för den heller, utan bara firmware (baserade min på microchips midi-exempel).
Oops! Vänta lite.. det där lät intressant! Har sökt över en del hemsidor efter en köpbar sådan men utan tur so far.
Har du någon länk till det projektet, har fått frågan om det går att lösa (som jag sa "Jodå, det går nog.." på) men här kom lösningen på det! Kalas! Vart vart vart?? :D



GFEF: Den var ju väldigt smutt liten lösning.. ska jag titta närmare på. Tack!
Användarvisningsbild
MiaM
Inlägg: 12938
Blev medlem: 6 maj 2009, 22:19:19

Re: Bygga MIDI interface av USB mus/t-bord?

Inlägg av MiaM »

Bigstone skrev:Har inte hunnit labba något än men ska bli.
Någon som har något tips på vad man ev. skulle kunna konvertera till midi-interface?
En såndär FTDI-seriesnöre-kabel med 5V-nivåer.

Du behöver en optokopplare, en transistor och några motstånd om jag inte minns galet.

http://howcircuits.com/microcontroller- ... rface.html
"UART" på bilden = FTDI-kabeln.


OBS! Det här förutsätter att FTDI-kabeln kan köra på rätt hastighet (31250BPS tror jag det var?) och dessutom förutsätter det att mjukvaran vill prata med kabeln. Antagligen inte så lätt i framförallt Windows, där jag TROR att MIDI dyker upp på annat sätt än vanliga serieportar.
Fredrik79
Inlägg: 173
Blev medlem: 18 februari 2012, 00:03:19

Re: Bygga MIDI interface av USB mus/t-bord?

Inlägg av Fredrik79 »

Har ingen länk då jag byggt den själv utifrån microchips solutions-bibliotek. Finns ett exempel där som spelar en midi-not vid knapptryck. hittar 17 inte schemat, men är simpelt.

Gjorde helt enkelt om det exemplet lite. Behöll 1 knapp till reset, och satte en jumper på RB4 för bootloadiing.

Sen satte jag RX + TX till motsvarande midisignaler på en DB15-kontakt och även GND och +5 på motsvarande kablar för att ta ström från USB.

D+ och D- på picen till usb-porten, och en kondensator till GND från vusb. Har även en pullup från Ra2 av någon anledning ^^. ska kolla koden och se om jag kan hitta varför, har projektet ivägstädat i någon backup just nu. (tror dock det var någon powersensefunktion på picdem som även kan ha tänkts funnits i bootloadern)

I övrigt så städade jag bort allt som hörde till diverse demokort, och sparade enbart koden till picdem. Modifierade den för en 18F2550 (den är normalt baserad på 18F4550, men de är kompatibla, bara lite LED-kod för PORTD som behöver bort).

Den viktiga biten i den koden är ProcessIO, där läser jag från RX/RC7. Om data finns ledig, så läser jag det antal bytes ett specifikt midimeddelande utgör, packar om till ett 32-bitars usb-midipaket och skickar via usb till datorn. MidiOX är fantastiskt för att debugga och bygga detta. Dessutom så innehåller exemplet en bootloader, så när du uppdaterat koden är det bara trycka ner reset och kortsluta jumpern på RB4 och ladda på ny firmware via programmet microchip skickade med. resetta, starta om midiOX och kör.

Kod: Markera allt

void ProcessIO(void)
{
    // User Application USB tasks
    if((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1)) return;

    if(!USBHandleBusy(USBRxHandle))
    {
        //We have received a MIDI packet from the host, process it and then
        //  prepare to receive the next packet

        //INSERT MIDI PROCESSING CODE HERE

        //Get ready for next packet (this will overwrite the old data)
        USBRxHandle = USBRxOnePacket(MIDI_EP,(BYTE*)&ReceivedDataBuffer,64);
    }

	if(DataRdyUSART()==1)
	{
		data1=ReadUSART();
		while (!DataRdyUSART());
		data2=ReadUSART();
		while (!DataRdyUSART());
		data3=ReadUSART();

        midiData.Val = 0;   //must set all unused values to 0 so go ahead
                             //  and set them all to 0
        midiData.CableNumber = 0;
		
		if(data1==0x90)
		{
       		midiData.CodeIndexNumber = MIDI_CIN_NOTE_ON;
		}else{
			if(data1==0x80)
			{
				midiData.CodeIndexNumber = MIDI_CIN_NOTE_OFF;
			}else{
				midiData.CodeIndexNumber = MIDI_CIN_POLY_KEY_PRESS;
			}	
		}

        midiData.DATA_0 = data1;
        midiData.DATA_1 = data2;
        midiData.DATA_2 = data3;

        USBTxHandle = USBTxOnePacket(MIDI_EP,(BYTE*)&midiData,4);

	}

}//end ProcessIO
Min kod i ProcessIO, som du ser där så hanterar det inga meddelanden skickade från datorn, utan bara den andra vägen. Pga att jag har en ganska dum keyboard. :P
Men det är ganska enkelt att bygga vidare på. Övriga ändringar i koden är väl mest städning, och initiering av serieport.

Initierar picens serieport till midi i mainfunktionen med:

Kod: Markera allt

	TRISCbits.TRISC7=1; //Make UART RX pin input
	OpenUSART (USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH, 383);
i

i usb_descriptors.c kan du ändra namnet på din device som står i windows också. :)

Hoppas det här hjälper dig lite på vägen.

Edit: Det kan även behövas en optokopplare mellan miditillbehör och datorn, i detta fallet behövdes det inte, då jag dels ger keyboarden sin ström direkt från usb-porten, och gameportsignalen är TTL-kompatibel. För att undersöka detta gjorde jag först ett program till picen som loggade serieportssignalerna till en display istället för usb, och jämförde datan med protokollet.
Skriv svar