Att lägga till MIDI till gamla hem organ (7 / 9 steg)
Steg 7: Hur det fungerar
Som beskrivits tidigare (i skift-i-midi-description.rtf, tillgänglig på GitHub), orsakar mikrokontroller SKIFT register till spärren data på varje ingång och sedan skiftar alla 64 bitar av data ur registren. Här är processen för att konvertera SKIFT register data i Anteckningar:
Obs: denna process körs kontinuerligt i en loop, tusentals gånger per sekund
1. SKIFT register är låst, läsa 61inputs alla på en gång.
Obs: logik gates behöver alltid en referens för hög eller låg. Oftast är det bäst att ge en hänvisning till "hög". Detta var nödvändigt för tidig integrerade kretsar kallas "emitter tillsammans logik" eller "TTL". Det var mycket mindre slösaktig av makt att dra in högt på dessa marker än att försöka dra dem låg. När vi säger "pull" menar vi att ansluta en PIN-kod till en strömkälla eller sjunka via ett motstånd. Typiskt 10K Ohm används. Så, i vårt fall, varje indata kräver en anslutning till matningsspänningen (5 V) via en 10K motstånd. Detta är en hel del motstånd, men lyckligtvis resistorer är mycket billigt. Så, när vi spärren i ingångarna, om ingen knapp trycks en "hög" logik stat kommer att läsa. Vi ansluter den delade bussen till marken (faktiskt en pin på mikrokontroller som att vara en låg utgång, som fungerar som ett nuvarande handfat). Om en tangenttryckning, drar det"" ingångsstift SKIFT register till en "låg" logik. Detta innebär en viktig att vara "på" faktiskt läses som "off", som är bakåt, men vi kan fixa detta lätt lite senare.
2. SKIFT register data lagras i en 8 byte array av nuvarande viktiga statliga och tidigare viktiga statliga.
När SKIFT register är låst, börja vi skicka klockan pulser. Varje klocka puls orsakar tillståndet i skiftregister att flytta en bit mot utgångsstiftet. Varje chips produktion är ansluten till ingången på nästa chip. Detta gör att data kan flytta sekventiellt genom alla marker. Men hur ska vi hantera det "å är avstängd" och "off är på"? 74hc165 ger två seriella utgångar - en normal utgång och en inverterad utgång. Vi ansluter mikrokontroller till inverterad utgång av det sista SKIFT registret. Här ändras indata anges tillbaka till vad vi vill - nyckel ner är "på" eller "1" och viktiga upp är "off" eller "0".
Vi använder en 8-bitars mikrokontroller. Det fungerar bäst och mest effektivt med 8 bitar (en byte) i taget. Så, vi läser SKIFT register data en byte i taget. Åtta bitar i en byte lagra det viktiga statligt åtta nycklar. Vi behöver 8 byte att lagra viktiga påstår av alla 61 tangenter.
Vi måste ägna stor uppmärksamhet åt hur data kommer ur SKIFT register. Vi via våra chips så den första register första kontakt (ingång A) är ansluten till längst till höger nyckel - vi kallar det nyckeln "1". Den sista nyckeln är nyckeln "61". Så, vi kommer att få viktiga stater ur registren i höger till vänster ordningen. Så kommer den första byten läsa faktiskt att vara de sista fem nycklarna (och de tre oanvända ingångarna). Vi ville ha vårt byte som ska lagras i vänster till rätt ordning, så vi fick också se till att vi lagt den första biten fick i varje byte till den längst till vänstra lite av den viktiga statliga byten.
Du kan göra det någon ordning som du vill, men du måste vara konsekvent!
3. centrala staterna omvandlas till push stater. push staterna lagras i en 61-bytematris håller antingen anteckning på, Obs off eller ingen förändring.
Så, vi har 8 byte värt viktiga stater för alla 61 tangenter. Men detta är inte precis vad vi behöver skicka MIDI-kommandon. MIDI orsakar anteckningar till ljud med en "noterar på" kommandot och notera stannar tills "noterar" skickas. Så måste vi konvertera det viktiga statligt i ett press tillstånd. Vi vill veta när en nyckel har pressas så att vi kan aktivera anteckningen och vi vill veta när en nyckel er blitt befriaren så vi kan stänga anteckningen. Vi vill inte skicka "noterar på" tusen gånger per sekund. Som skulle översvämma MIDI-bussen med data och det skulle inte fungera.
För att generera push stater från viktiga påstår vi att lagra den aktuella nyckel och den tidigare viktiga staten. Vi jämför två varje Skanna loop och se om tillståndet ändras. Om det gick låg till hög, då ett tryck ner registreras och en "noterar på" skickas. Om det gick hög till låg, sedan en nyckel upp registreras och en "note off" skickas. Om ingenting förändrats, skickas inga nya MIDI-data.
Vi beräknar MIDI-not information genom att lagra ett lägsta notvärde och sedan lägga till vektorindexet den för att få den faktiska Obs. Detta är det enklaste sättet att närma sig den. Om du vill få fancy måste någon form av utseende-upp bord.
4. processen upprepas. Vi se till att vi väntar en minimitid mellan tangentbord skanningar. Om vi scanna för fort plocka vi upp det som kallas "viktiga bounce" - elektrisk buller som alstras när viktiga kontakterna öppnas och stängs. Om vi läser det får vi falska viktiga statliga information. Allt vi behöver göra är vänta lite längre då den typiska "studsa" perioden. Om den bounce (10 mikrosekunder i detta projekt) inte har ännu gått ut, vi helt enkelt avsluta skanning slingan och försök igen.
Hur konverterar vi faktiskt viktiga stater in i push påstår?
I detta projekt läser vi skiftet registrerar med hjälp av programvara. Detta kallas "bit banka". Det är inte den snabbaste metoden. Det är en hårdvara i ATMEGA chipet kallas SPI (följetong/parallell Interface) som kunde göra det mycket snabbare. Dock är det svårare att förstå och det visar sig för läsa människors ingångar bit-banka är mycket snabb. Vi se till att det är snabbt med hjälp av mikrokontroller så effektivt som möjligt. Vi gör alla våra viktiga statliga jämförelser med bitvis operatörer. De bitvisa operatorer som vi använder är "<<" SKIFT kvar, ">>" flytta höger. "^" exklusiva-eller (XOR) och "&" och XOR används för att se när viktiga statliga inom en stat byte har ändrats jämfört med det tidigare tillståndet. OCH används för att välja bitar från ett byte med en bitmask. Skift-operatörer används för att flytta lite bitmask vänster eller höger insida en byte att välja lite specifika att jämföra. Alla dessa åtgärder kan utföras i en eller två klockcykler, vilket gör dem mycket snabbt.
Om du vill lära dig mer om hur koden fungerar, ta en titt på källan. Vi erbjuder massor av kommentarer på hur varje del fungerar. Igen, den svåraste delen är helt enkelt att se till du läsa och jämföra data i rätt ordning.