Jump to content
Sign in to follow this  
Jaffe

Guide: Nintendo NES-programmering

Recommended Posts

Lyd blir vel litt som på C64, unødvendig komplisert. Istedet for å bare skrive inn verdier for hver note, må du definere en max og minimum frequency for hver eneste note. Helt snodig. Så kodesnuttene blir 10 ganger lengre enn nødvendig.

For ikke å snakke om all koden for å initiere SID-chipen, selv om dette er mest copy'n'paste-kode. Også har man diverse synthesizer-parametre som filter cutoff og envelope verdier som er enkelt-tall i en 4 eller 8-bits tallrekke, diverse flagg osv. Forstår ikke at karer kunne sitte i kjellern hos mamma og programmere den mest fantastiske SID-musikken på 80-tallet uten internett eller noe annet enn en hardware reference manual, i rein assembly-kode. Og ikke nok med det, alle de kjente composerne hadde sine egne kode-"triks" så musikken deres var gjenkjennelig tilogmed.

 

Du hører at dette er en Rob Hubbard-låt, eller Martin Galway.

 

Leste et digert intervju i Retro Gamer-bladet med de fleste kjente musikk-koderne til C64, en sa han bare hadde programmert på ZX81 maskiner når han kom til Ocean, og fikk en C64 i fanget + noen manualer og ble bedt om å porte noen spill. Og innen noen måneder hadde han skrevet all koden, laget all musikken osv helt alene.

Edited by Bytex
  • Like 1

Share this post


Link to post

Ja, lydgeneratoren (APUen) er ganske lik SID når det gjelder hvordan de programmeres, men SID er mye mer avansert. Den har tre oscillatorer (med valgfrie bølgeformer), et analogt HP/BP/LP-filter, ring-modulatorer, ADSR-enveloper (ikke kun decay slik NES har), og så videre. SID ligner mye mer på klassiske subtraktive synther når man ser på arkitekturen. Det var også målet til designeren Bob Yannes, men Commodore gav ham for lite tid til å lage noe som kunne konkurrere på proff-markedet (mot CEM-chippene med andre ord).

 

APU-en i NES er mer som en slags mellomting mellom rene "pipelydgeneratorer" og SID. Det eneste litt kule med APU-en er at den har en deltamodulasjonskanal som kan spille av samples. Ellers er det mye mindre spillerom med APU-en enn det er med SID, så det er ikke så lett for en composer å legge sitt avtrikk på NES-musikk.

 

Det er ganske sykt hva de fikk til på 80-tallet, uten tvil! Man må også huske på at når C64 kom så var jo SID en lydchip med uhørt god kvalitet blant de rimelige hjemmedatamaskinene. Det var nok for mange den første muligheten til å faktisk programmere ordentlig musikk på en datamaskin. Det må ha vært ganske motiverende :)

Share this post


Link to post

Som du sikkert skjønte gav jeg opp det forrige prosjektet, semesteret begynte igjen :p Men nå har jeg endelig begynt på et nytt prosjekt. Prøver å implementere Breakout, koden ligger her hvis noen skulle være interessert.

 

Kanskje interessant for andre utviklerere er noen generelle prosedyrer som jeg merker jeg trenger med jevne mellomrom som jeg har samlet i en fil her. Det er stort sett operasjoner på "signed" tall (tall som kan være negative), som f.eks. absoluttverdi, aritmetisk right shift (deler på 2 som også fungerer med negative tall), og sammenligning av signed tall.

 

Ser lovende ut så langt! Svært pen kode, får jeg legge til :). Breakout er jo på en måte det naturlige neste steget etter Pong. Du får holde meg/oss oppdatert.

 

De subrutinene ser ganske nyttige ut. Når/hvis jeg fortsetter på guiden hadde det kanskje vært greit med en samling av slike også.

Share this post


Link to post

Ja det er derfor de har kunne laget standalone synthesizere med SID-chippen som basis. Elektron SIDstation bl.a. SIDstation gikk desverre ganske tidlig ut av produksjon, da Elektron ikke fikk tak i flere sid-chips. Det er jo bare et begrenset marked, og det er ingen som lager nye SID-chips heller. Det ville ikke lønne seg for Elektron å støvsuge bruktmarkedet for C64'r heller, da ville synthene blitt altfor dyre igjen.

 

http://en.wikipedia.org/wiki/Sidstation

 

Har lest at Rob Hubbard laget sin egen synth basert på SID-chip også, men den er unik. Elektron er fortsatt i synthmarkedet, med både analog og digitale synther de senere årene.

 

Jeg prøvde å bryte gjennom veggen av assembly kode for å lære meg litt sid-programming for ett års tid siden, men det ble ALT for mye info og adresseregistre og flagg og sette seg inn i for en menig mann. Fant flere eksempler fra newsgroups, bl.a. hele koden til Monty on the Run av Rob Hubbard med kommentarer på siden. Men grøss og gru så mye kode for et par minutter musikk :)

Jeg har bakgrunn fra subtraktive synthesizere (eier flere sjøl), så jeg tenkte det ikke ville være FOR vanskelig. Men jo. Det var det.

 

Alle de vanlige parametrene er så begravd i 8-bit words og adresseregistre at jeg ble helt satt ut. Så all ære til gutta som satt på gutterommet og fant ut av alt dette selv i 1983. Og greia med at alle notene har en egen loFrequency og hiFrequency verdi gjør det enda mindre intuitivt.

Edited by Bytex

Share this post


Link to post

Det vanskeligste med å programmere SID-musikk er nok å lage seg et system som lar en komponere ting på en intuitiv og grei måte uten å måtte klusse med lavnivådetaljene hele tiden. Man bør vel helst være ganske så god i 6502-assembly også for å få det til.

 

Akkurat det med low og high frequency er ganske vanlig (NES gjør det på tilsvarende måte). Registrene og databussen er bare 8 bit, mens frekvensen må oppgis mer nøyaktig enn som så (hvis ikke ville man fått en på 256 steg fra laveste tone til høyeste tone). Frekvensen i SID angis derfor med et 16-bits tall. Dette tallet er ikke den endelige frekvensen, men et tall som er proporsjonalt med den. Den resulterende frekvensen er chart?cht=tx&chl=f = f_n \cdot \frac{f_{clk}}{16777216 \text{Hz}}, der chart?cht=tx&chl=f_n er tallet du får når du setter sammen den lave og høye delen (low og high frequency-registrene). Pulse width og filter cutoff funker på tilsvarende måter.

Edited by Jaffe

Share this post


Link to post

 

Jeg har bakgrunn fra subtraktive synthesizere (eier flere sjøl), så jeg tenkte det ikke ville være FOR vanskelig. Men jo. Det var det.

 

 

Kult! Hvilke synther har du? Er litt synth-geek selv. :)

Share this post


Link to post

Men disse noteverdiene og filter cutoff og PW-verdiene endrer seg vel ikke fra gang til gang, så har man først en tabell nedskrevet med lo/hi freq for C1, D1, E2, E3 osv eller filter cutoff 29 kan man vel bruke de tallene samme hver gang?

Og rutinene for å initiere SID og velge waveforms og slikt er jo også copy/paste regner jeg med. Man må bare finne en metode og rutiner som gjør lavnivå-greiene minst mulig plagsomt. F.eks. modulering av pulsewidth er vel ikke bare å sette en LFO-hastighet på PW og en amount-verdi som man gjør på en vanlig synth, men man må lage en rutine som stepper gjennom alle tallene frem og tilbake mellom to punkter?

 

Jeg husker jeg satt og tasta inn basic-programmer fra Svenska Datormagazin når jeg var fjortis, og skjønte aldri et kvekk når jeg måtte skrive inn dusinvis av tall separert med komma som DATA linjer for å lage enkle musikk-snutter.

 

Hva slags synther jeg har..skal vi se, har hatt ganske mange gjennom årene.

Nå har jeg en Alesis Andromeda A6 (rein analog jævel), et par VA-synther som ligger og slenger (Roland Gaia bl.a.), et svært Analogue Systems modular-system (som jeg nesten aldri bruker), og et par vintage-synther fra 80 tallet, en Roland D-50 og Yamaha DX7.

 

Var litt samlegal for noen år siden og har ikke vært noe flink å selge unna. Satt med en Yamaha Motif XF6 også helt frem til jul da jeg endelig turte å legge den ut til salg. Har ikke plass i min lille leilighet til å ha masse keyboards stående oppkoblet, så de blir heller lite brukt.

Det siste jeg skaffet var en Arturia Minibrute.

Edited by Bytex

Share this post


Link to post

Men disse noteverdiene og filter cutoff og PW-verdiene endrer seg vel ikke fra gang til gang, så har man først en tabell nedskrevet med lo/hi freq for C1, D1, E2, E3 osv eller filter cutoff 29 kan man vel bruke de tallene samme hver gang?

Og rutinene for å initiere SID og velge waveforms og slikt er jo også copy/paste regner jeg med. Man må bare finne en metode og rutiner som gjør lavnivå-greiene minst mulig plagsomt. F.eks. modulering av pulsewidth er vel ikke bare å sette en LFO-hastighet på PW og en amount-verdi som man gjør på en vanlig synth, men man må lage en rutine som stepper gjennom alle tallene frem og tilbake mellom to punkter?

 

Ja, akkurat. Verdiene for å angi frekvensen til de forskjellige notene er det bare snakk om å finne én gang (de finnes vel på nettet allerede) og lagre i en tabell. LFOer osv. må man implementere selv. Det man må/bør gjøre er som du sier å lage et generelt system som gjør dette. Man skriver f.eks. en subrutine som endrer LFO-ens verdi regelmessig (man kan f.eks. ha en tabell med verdier for de forskjellige bølgeformene man ønsker, da er det bare å slå opp i tabellen og finne ønsket verdi), en subrutine som tar LFO-verdien og bruker den til å endre PW, en som endrer frekvens, en for volum og så videre.

 

Så må man (og dette er nok det vanskeligste) planlegge et format å lagre sangene i, og skrive koden som skal tolke dette formatet og sende den riktige informasjonen til de riktige komponentene (altså oppdatere frekvens når en ny note skal spilles, endre på volum hvis det skal være en pause, gjøre en glide mellom notene hvis det skal være portamento, osv.). Når et slikt system først er laget, er resten snakk om å "bare" skrive sangene i dette formatet. Man må fortsatt punche inn tall og så videre, men man driver ikke og manuelt skriver til registre hver gang noe i låten endrer seg; det er det de forskjellige subrutinene som tar seg av.

 

 

 

Hva slags synther jeg har..skal vi se, har hatt ganske mange gjennom årene.

Nå har jeg en Alesis Andromeda A6 (rein analog jævel), et par VA-synther som ligger og slenger (Roland Gaia bl.a.), et svært Analogue Systems modular-system (som jeg nesten aldri bruker), og et par vintage-synther fra 80 tallet, en Roland D-50 og Yamaha DX7.

 

Var litt samlegal for noen år siden og har ikke vært noe flink å selge unna. Satt med en Yamaha Motif XF6 også helt frem til jul da jeg endelig turte å legge den ut til salg. Har ikke plass i min lille leilighet til å ha masse keyboards stående oppkoblet, så de blir heller lite brukt.

Det siste jeg skaffet var en Arturia Minibrute.

 

Det er jo en ganske omfattende samling. :) Har hørt/lest mye om Andromeda A6, det må jo være ganske nærme den perfekte polysynthen. Hva slags musikk lager du med dem? Jeg har selv en Juno-6 og skaffet meg nå nylig en Oberheim OB-8 som jeg har drevet og fikset litt opp (ordnet kontaktene i tangentene, kalibrerte alle stemmene på nytt, etc.). Den var ikke akkurat billig, men jeg tror ikke det skulle bli noe problem å evt. få solgt den. Det er kanskje fordelen med vintage synther; det ser ut som de bare stiger og stiger i pris... Og spesielt på et norsk marked der en del modeller er sjelden vare.

Share this post


Link to post

Jeg har startet på et "lite" sideprosjekt nå (litt inspirert av SID/APU-diskusjonen ovenfor), der jeg har tatt en 2A03-chip (CPU/APU-chippen i NES-en) og koblet den til en mikrokontroller (en Atmega168 for øyeblikket). Målet er å lage en liten synth basert på APU-en. Siden APU-en ikke er eksternt kontrollerbar, har det ikke vært helt trivielt å styre den fra mikrokontrolleren; det må gjørs via CPU-en. Det som skjer er at mikrokontrolleren sender CPU-en instruksjoner, som i sin tur manipulerer APU-en. CPU-en tror den kjører et program, men i realiteten mates den med instruksjoner fra mikrokontrolleren.

 

Så langt har jeg fått kommunikasjonsgrensesnittet opp og gå (alle kanaler kan manipuleres uten bugs etc.) og bygd et abstraksjonslag over dette som gjør det lett å manipulere lydkanalene i C-kode på mikrokontrolleren. Jeg har også implementert envelope-generatorer og LFO-er som kan modulere volum/frekvens på kanalene. Målet videre er å lage et MIDI-grensesnitt så den kan kontrolleres eksternt, og hvis jeg har tid og ikke mister interessen, et skikkelig produkt med et frontpanel for å endre parametere osv. (noe lignedne SIDstation)

 

Se mer om prosjektet her.

 

 

post-40145-0-94927900-1405521649_thumb.jpg

Edited by Jaffe

Share this post


Link to post

Etter studiene på NTNU så mista jeg naturlig nok serverplassen min der, så guiden har vært utilgjengelig en stund. Klarte heldigvis å oppdrive en kopi av pdfen, så har lasta den opp på github.

Den er nå å finne her:

https://github.com/Jaffe-/nes-guide/blob/main/nes.pdf

Artig å lese igjen etter såpass lang tid. Nå har det skjedd ganske mye når det gjelder guider og youtube-videoer som forklarer nes-programmering, så det finnes nok bedre alternativer for de som faktisk vil lære seg dette ordentlig i dag! Men det kan jo være interessant lesestoff likevel. Syns mye av det i guiden står seg, selv om man selvsagt oppdager en del feil, mangler og dårlige forklaringer etter hvert som man blir mer erfaren (og har embedded/lavnivå software som jobb).

  • Like 1

Share this post


Link to post

Ja har ikke vært innom denne tråden siden 2014 tydeligvis, poppa plutselig opp i mine innlegg :)

Og neida, jeg gadd aldri å lære meg den sid-kodinga. Har gått tilbake til Amiga 1200, hehe. Samples og protracker er mye lettere å deale med. Vil man ha "sid-lyder" er det jo plenty med måter å gjøre det på uten å kode på en C64, tross alt.

Edited by Bytex

Share this post


Link to post

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...
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...