ArSid - Arduino Sid Synthesizer

Sat 23-Mar-19
22:32:46




Libraries

Datum: Tue 02 July 2019
Samenvatting: Er zijn een aantal Libraries die het programmeren vergemakkelijken.
 Soort Artikel: Software
Status: Bezig



[Tekst] [Afbeeldingen] [Aansluitingen] [Broncodes]
library_01-lcd.jpg
1/1: library_01-lcd.jpg.
[Tekst] [Afbeeldingen] [Aansluitingen] [Broncodes]

Er zijn een aantal libraries die het programmeren vergemakkelijken. Ook versnellen zij het compileren, omdat libraries die niet gewijzigd zijn, niet meer opnieuw gecompileerd hoeven te worden.

Elke Library verricht hier een eigen funktie in het geheel. Sommigen bevatten maar een paar funkties, anderen zijn gevuld met ingewikkelde structuren. Sommige Libraries zijn afhankelijk van andere Libraries, de tweede genoemde zit dan als een soort van pit in de eerst genoemde Library (of als meerdere pitten in diverse Libraries)..

Hier volgt een opsomming en een korte beschrijving. Enkele libraries hebben een eigen artikel gekregen om de functie uitgebreider te beschrijven.

  1. ArSid_Chars - [artikel: lib_userchar] Deze bevat alle eigen tekens, voor op het Lcd_Display, die ik in de ArSid gebruikt, met uitzondering van de tekens die ik in het Intro-scherm gebruikt (hoewel ik wel de muzieknootjes van het Intro-scherm heb gecopieerd). Alle tekens zitten in 1 grote Array.

    Poke_Char() -Copieert 1 teken (= 8 bits) vanuit het grote Array naar het geheugen van het Lcd-Display.
    Poke_2Char()-Copieert 2 tekens (= 16 bits) vanuit het grote Array naar het geheugen van het Lcd-Display.

  2. ArSid_Control - [artikel: -] Deze controleert of er van het bedieningspaneel een Control-schakelaars is omgezet, of een Control-potentiometer is verdraaid.

    =Calc_Note() -Berekent het Midi nootnummer uit de standen van de Potentiometers: Note, Transpose Noot, Transpose Oktaaf.
    =Calc_NoteFine() -Berekent een +/- nummer uit de stand van de Potentiometer: Note Fine (soort Pitchbend).
    Calc_Sid_Frequency()-Haalt de Sid-waarde uit de Noten-tabel. Hierbij wordt rekening gehouden met de Pitchbend waarde (de "tussenliggende" frequentie, zie Noten Generator). Deze Sid-waarde is nodig om de juiste toonhoogte van de noot te laten klinken.
    Check_Controls() -Kijkt naar de standen van alle Control-schakelaars en Control-Potentiometers. Het uitlezen van deze standen wordt meteen gebruikt om de Muziek gegevens te "vullen".
    EXTERN diverse VARs -Dit zijn de Muziek gegevens. Deze worden gebruikt om te delen met andere Libraries. Blijkbaar kent C++ geen andere methode dan variabelen EXTERN te declareren, zonder tijd-vretende funktie aanroepen om ze uit te wisselen. In Turbo-/ Borland Pascal was er wel een eenvoudige methode om varabelen eenvoudig PUBLIC te maken, zonder meteen gebruik te maken van (ingewikkelde) CLASS variabelen (of ik ben nog niet toe aan CLASS-variabelen - hoewel Pascal wel het begrip en gebruik van RECORDs kent.).

  3. ArSid_CrSr - [artikel: lib_crsr] Deze controleert of er van het bedieningspaneel een Cursor-schakelaars is omgezet. De betreffende schakelaar-waarde geeft een resultaat in een variabele KeysCrsr,welke variabele door andere Libraries gebruikt moet kunnen worden.

    De volgende cursor functionaliteiten zijn mogelijk: <Escape><Help><Return><Quiet> <Down><Up><Right><Left>

    CONST Pagina -Geven aan welke variabelen er op het Lcd_Display wordt getoont
    CONST Bitmask -Geven aan welk bitje in de variabele KeysCrsr er gebrukt moet worden voor de betreffende Cursor funktionaliteit.
    Show_Escape() -Toont op het Display het woord <Escape>. Dit blijft staan totdat de cursor-toetsen losgelaten zijn.
    Check_KeysCrsr() -Controleert welke Cursor-toetsen zijn geactiveerd - Deze funktie vult de variabele KeysCrsr.
    Handle_KeysCrsr() -Handelt de eenvoudigste Cursor-toetsen af, zoals <Down><Up><Right><Left> en verhoogt/ verlaagt waardes van variabelen die de pagina op het Display regelen.

  4. ArSid_Front - [artikel: -] Deze regelt het weergeven van de diverse pagina's op het Lcd Display. Gegevens van de Sid-data en de Midi-Data. Ook is er voorzien in een (eenvoudige) (Midi)Monitor. Standen van de Control-schakelaars en Control-Potentiometers gaan rechtstreeks in de Sid-Data.

    Show_DataOnLcd() -Geeft alle Muziek gegevens (de Data) weer op het Lcd Display. Aan de hand van Pagina-variabelen wordt bepaalt welke gegevens er worden weergegeven (Sid-data, Midi-Data, Monitor).
    Sid_Data_And_Display()-Nog bepalen waar deze ECHT komt. Regelt het aktiveren van het Help-scherm en het plaatsen van de Muziek gegevens in de Sid.
    ====> -Set_Sid_Data() verplaatsen naar de bibliotheek "ArSid_Sid.h".

  5. ArSid_Help - [artikel: lib_help] Deze bevat alle help-schermen en de funktie om deze Help-schermen op het display weer te geven. Ook bevat deze Library zijn eigen Cursor-afhandeling funktie, die het bladeren door de Help-schermen aansturen. Help-schermen worden genummerd weergegeven.

    Write_Help() -Schrijft de titel van het Help-scherm op het Lcd Display.
    Do_PageHelp() -Regelt het afhandelen van de Help Cursor-toetsen, waarmee er door de Helpschermen gebladerd kan worden.
    Display_HelpOnHelp()-Schrijft een eenvoudige Help-On-Help-scherm dat iets meer uitleg geeft over bladeren door de Help.
    Display_Help() -Schrijft een eenvoudige Help-scherm dat de Cursortoetsen weergeeft.

  6. ArSid_IO - [artikel: lib_io] Deze zorgt voor de feitelijke software verbinding met de Decoder, de Latches en de Sid print. Dit is het binnenste schilletje rond de Hardware en verzorgt de communicatie met de hier gecreëerde 65xx bussysteem (Adresbus, Databus en Controlbus). De inhoud van deze funkties bevatten veel directe commando's om de Arduino-Poorten (en aansluit Pinnen) zo direct mogelijk te besturen. Allemaal om de funkties zo snel mogelijk te maken.

    Reset() -Zet een korte Reset-pulse op de Resetlijn van de Controlbus. Hiermee zijn onder andere de Sids te resetten.
    Set_Adres_Out()-Zet alle pinnen van de Arduino, die de Adresbus verzorgen, op Output.
    Poke() -Plaatst een Data byte op de gegeven Adres locatie, inclusief de timing van de signalen op de Controlbus.
    =Peek() -Leest een Data byte uit de gegeven Adres locatie, inclusief de timing van de signalen op de Controlbus.

  7. ArSid_Intro - [artikel: titelscherm] Deze verzorgt alleen het titelscherm. Het heeft zijn eigen Library gekregen om de totale broncode overzichtelijk te houden.

    -
    ArSid_Intro()-Schrijft de grote letters op het scherm en varieerd te "pixel" grootte ervan tot een mooie intro.

  8. ArSid_Lcd - [artikel: lib_lcd] Deze regelt alle communicatie met het Lcd-Display. Dit zijn zowel de letters op het scherm, als de achtergrond verlichting ervan.

    Write_Lcdback()-Schrijft een kleurenbyte naar de achtergrond verlichting. De achtergrond verlichting is rechtstreeks op I/O pinnen van de Arduino aangesloten.
    Lcd_Init() -Initialiseert het Lcd Display volgens de instructies van de datasheet.
    Lcd_Clr() -Wist alle teksten van het display.
    Lcd_Gotoxy() -Plaatst de cursor op een bepaalde positie op een bepaalde regel.
    Lcd_Print() -Plaatst een "tekst" op het scherm.
    Lcd_Number() -Zet een (decimale) nummer op het scherm.
    Lcd_HexNumber()-Zet een HexaDecimaal nummer op het scherm..
    Lcd_Out() -Stuurt een enkele byte naar het scherm. Deze funktie stuurt het display feitelijk aan. De byte kan naar zowel het instructie-register, als het het display register (en dus op het scherm) worden gestuurd. De byte kan een nummer (0..255, of 0x00..0xFF) zijn, maar ook als 'teken' worden opgegeven - dit volgens de regels van C++.

  9. ArSid_Notes - [artikel: lib_notes] Deze bevat enkele tabellen met frequentie en noot informatie.

    CONST NoteName[][c] -Tabel met Noot Namen [max 6 tekens lang].
    CONST NoteFreq[] -Tabel met Noot Frequenties.
    CONST NoteSid[][] -Tabel met Frequentie-waardes voor de Sid [HexHi,HexLo].
    CONST Akkoord[][] -Tabel met Akkoorden informatie. Of te wel losse verschuivingen van aparte noten om een akkoord te kunnen spelen (maximaal 6 losse noten per akkoord).
    CONST AkkoordName[][c] -Tabel met namen van de Akkoorden.
    CONST ADSR_Times[][][c]-Tabel met tijden van de ADSR-waardes.

  10. ArSid_Panel - [artikel: lib_panel] Deze regelt de communicatie met de RGB-Leds, de schakelaars en de control-potmeters van het FrontPaneel. Er wordt gebruik gemaakt van een Timer met Interupt om de Leds aan te sturen en de schakelaars en potmeters uit te lezen.

    Panel_Init() -Deze initialiseert de Leds, Schakelaars en Potmeters van het FrontPaneel. Beter gezegd: Het zet de Toprij Leds van het Paneel allemaal uit. Ook zet het 0-en (NULlen) in de arrays voor de schakelaars en leest de eerste keer alle potmeters in.
    Clear_Led() -Wist de Toprij Leds vanaf het opgegeven nummer tot en met het opgegeven nummer.
    Write_Led() -Zet een opgegeven Toprij Led op een bepaalde kleur (RGB).
    =Read_Schak()-Leest de waarde van een rij schakelaars uit. Het resultaat is 8 bits.
    =Read_Pot() -Leest de waarde van een potmeter uit (0 .. 255).
    Status() -Plaatst een 2-byte getal op de Toprij Leds. Een soort van monitor Leds voor tijdelijke test-momenten in het programma.


    Timer_Init() -Deze interne funktie regelt het opstarten van de Interupt lus, door de Interupt-Timer te vullen.
    ISR() -Deze interne interupt funktie regelt een aantal zaken met het Front Paneel. Het laat de Toprij Leds oplichten met data uit het Led-Array. Het leest alle schakelaars in en plaatst deze data in de Schakelaar-Array. En het leest alle potmeters in en plaatst deze data in de Potmeter-Array. Deze funktie handelt elke keer 1 Led, 1 Schakelaar en 1 Potmeter af. Een teller regelt welk nummer er aan de beurt is.

    Deze structuur zorgt dat er altijd zo aktueel mogelijke waardes in de diverse array's staan. Die arrays kunnen dan weer zo direkt mogelijk (en dus met minimale tijd) worden uitgelezen.

    Het inlezen van een potmeter zelf gebeurt helemaal hardwarematig. Dit heeft echter wat tijd nodig om een waarde helemaal om te zetten in de ingebouwde ADC (Analoog-Digitaal Converter). Daarom wordt aan het eind van de Interupt Funktie alvast het inlezen van de volgende potmeter opgestart. Wanneer de Interupt Funktie weer opnieuw begint, staat deze waarde al klaar om echt iongelezen te worden.

    Deze hele Interupt Constructie is volgens mij het handigste, omdat resultaten nu eenvoudig in Array's gestopt kan worden (Leds) of uit Array's gehaald kunnen worden (Schakelaars en Potentiometers), zonder de timing van het geheel te verstoren. Want bij muziek gerelateerde programma's kunnen niet constante doorloop tijden goed hoorbaar worden met bijvoorbeeld tijd variaties en (ongewenste) klikjes.

  11. ArSid_Sid - [artikel: -] Deze regelt enkele zaken omtrent de Sids.

    Sid_Base constante -Bevat het basis-adres van de Sids in het geheel
    Sid_Init() -Initialiseert de Sids. Dit door de waarde 0 (NUL) naar alle registers te sturen.
    () - --[nog uitbreiden]--
    ====> - --[nog uitbreiden]-- Vul-funktie maken, die de Sid vult met de Muziek-data is aanwezig is.
    ====> - --[nog uitbreiden]-- Polyfony aanbrengen (en dus ook, register inhouden bewaren in een apart (eigen) array.
    ====> - --[nog uitbreiden]-- Akkoorden systeem aanbrengen. De tabellen ervoor zijn immers al aanwezig.

  12. Basic_Funk - [artikel: -] Deze bevat enkele elementaire funkties die onafhankelijk zijn van hardware, maar die het programmeren enorm versimpelen. Ideeë voor deze Library komen vanaf mijn programmeer-tijdperk met Turbo-/ Borland Pascal.

    CONST hexchar[]-Deze Library kan nog worden uitgebreid.
    CONST bitje[] -Tabel om een bitjenummer rechtstreeks om te zetten in de (decimale) waardes van deze losse bitjes.
    =byte2hexchar()-Tabel om een hexadecimaal-nummer rechtstreeks om te zetten in een hexadecimaal teken ['0' .. 'F'].
    =minmax() -Controleert of een getal binnen een minimum en maximum grens ligt. Ligt het getal er buiten, dan wordt het getal bruutweg afgerond naar de minimum, respectievelijk maximum waarde. Te klein => Minimum. Te groot => Maximum.
    =cycle() -Controleert of een getal binnen een minimum en maximum grens ligt. Ligt het getal er buiten, dan wordt het getal bruutweg afgerond naar de maximum, respectievelijk minimum waarde. Te klein => Maximum. Te groot => Minimum. Op deze manier zijn rondgaande tellers te creëren.
    () - --[nog uitbreiden]--
    ====> -Deze Library kan nog worden uitgebreid.


    Libraries nog aanmaken/ samenstellen.

  13. ArSid_Midi - [artikel: -] Nog Beginnen Deze handelt alle binnenkomend Midi verkeer af

    () - --[nog maken]--

  14. ArSid_Select - [artikel: -] Nog Beginnen Deze controleert of er van het bedieningspaneel een Select-schakelaars is omgezet.

    () - --[nog maken]--

  15. ArSid_Sid - [artikel: -] Deze regelt enkele zaken omtrent de Sids.

    ====> -Nog uitbreiden met wat hierboven staat.

Het compileer resultaat per 04 jan 2018:
De schets gebruikt 25.148 bytes (9%) programma-opslagruimte. Maximum is 253.952 bytes.
Globale variabelen gebruiken 809 bytes (9%) van het dynamisch geheugen. Resteren 7.383 bytes voor lokale variabelen. Maximum is 8.192 bytes.

Het compileer resultaat per 05 jan 2018:
De schets gebruikt 26.892 bytes (10%) programma-opslagruimte. Maximum is 253.952 bytes.
Globale variabelen gebruiken 893 bytes (10%) van het dynamisch geheugen. Resteren 7.299 bytes voor lokale variabelen. Maximum is 8.192 bytes.

Het compileer resultaat per 10 feb 2019:
De schets gebruikt 42.314 bytes (16%) programma-opslagruimte. Maximum is 253.952 bytes.
Globale variabelen gebruiken 1.451 bytes (17%) van het dynamisch geheugen. Resteren 6.741 bytes voor lokale variabelen. Maximum is 8.192 bytes.


Nog doen in deze tekst: Opsomming maken van welke Libraries er door de Libraries nodig zijn.

Soort van Hierarchie bepalen van welke Librarie er op top ligt en welke onderaan.




[Tekst] [Afbeeldingen] [Aansluitingen] [Broncodes]

Afbeeldingen

library_01-lcd.jpg
1/1: library_01-lcd.jpg.
[Tekst] [Afbeeldingen] [Aansluitingen] [Broncodes]