V¨
aster˚
as, Sverige
Examensarbete f¨
or kanditatexamen i datavetenskap - 15 hp
THE BUFFER - DIREKT˚
ATKOMST
AV MINNESBUFFER F ¨
OR LJUDSP˚
AR
Erik Pettersson
epn14012@student.mdh.se
Examinator: Daniel Hedin
M¨
alardalens H¨
ogskola, V¨
aster˚
as, Sverige
Handledare: Rikard Lindell
M¨
alardalens H¨
ogskola, V¨
aster˚
as, Sverige
Sammanfattning
Modul¨ara synthesizers blev en stor kommerciell succ´e in p˚a 1960-talet som sedan in p˚a 2010-talet skulle f˚a uppm¨arksamhet p˚a nytt, troligtvis i samband med en “Do it yourself-r¨ orelse”(DIY-movement). En sampler ¨ar ett instrument som finns b˚ade sj¨alvst¨andigt och som styrsp¨anningskontrollerad modul inom modul¨arsyntes. Vanligt ¨ar att vissa aspekter till uppspelning g˚ar att kontrollera med styrsp¨anning, exempelvis uppspelningshastigheten. N˚agot varken jag eller min handledare har sett tidigare ¨ar direkt˚atkomst med styrsp¨anning till minnespekare i en ljudbuffer f¨or samplermoduler. D¨arf¨or implementerade jag The Buffer, en samplermodul i en virtuell modul¨arsyntesmilj¨o - VCV Rack. I arbetet unders¨okte jag tv˚a fr˚agest¨allningar: kopplingen mellan insp¨anningen till modulen och det resulterande ljudet, samt ¨aven vilket maximalt minnesomr˚ade som g˚ar att adressera f¨or styrsp¨anningen s˚a att pekarna sveper konsekutivt genom varje frame av ljudsp˚aret. I den sena-re utforskade jag tv˚a m¨ojliga svar, ett teoretiskt st¨orsta m¨ojliga, och ett med utg˚angspunkt i min implementation. Jag utf¨orde ¨aven en anv¨andarstudie p˚a mer subjektiv basis f¨or en indikation p˚a modulens anv¨andbarhet.
Inneh˚
all
1. Inledning 1
2. Bakgrund 2
2.1. Modul¨ara synthesizers (Modul¨arsyntes) . . . 2
2.2. ˚Aterkomsten av analog teknik . . . 3
2.3. VCV Rack . . . 3
2.4. Samplers . . . 4
2.5. Sequencers . . . 5
2.6. Digitala Ljudfiler . . . 5
2.7. Libsndfile . . . 6
2.8. Artefakter och aliasing . . . 7
2.9. Representation av flyttal (floating point numbers) . . . 8
3. Tidigare arbeten 9 3.1. Tyme Sefari MKII . . . 9
3.2. The Slidepipe . . . 10
4. Problemformulering 11 4.1. Fr˚agest¨allningar . . . 11
5. Metod 12 6. Etik och Samh¨alleliga aspekter 13 6.1. Deltagarexperiment . . . 13
6.2. Plunderphonics . . . 13
6.3. Exempelmusik fr˚an The Buffer . . . 13
7. Utveckling samt unders¨okning av The Buffer 14 7.1. Design av anv¨andargr¨anssnittet . . . 14
7.2. Implementation av The Buffer i C++ . . . 15
7.3. Adressera minnesadresser till styrsp¨anning . . . 17
7.4. Storlek av minnesomr˚ade vid adressering av styrsp¨anning . . . 18
7.5. Samband mellan insp¨anning och ljud-output . . . 19
7.5..1 Direkta samband - 4 v˚agformer + konstant sp¨anning . . . 19
7.5..2 Overlagrade v˚¨ agformer samt ¨ovriga till¨ampningar . . . 21
7.6. Utf¨orande av anv¨andartester . . . 22
7.7. Resultat av anv¨andartester . . . 22
8. Diskussion 25 8.1. Svepa med styrsp¨anning i minnesbuffer . . . 25
8.2. Adressering av minne till styrsp¨anning samt maximalt adresserbart minnesomr˚ade 25 8.3. Anv¨andartester . . . 25
8.4. Alternativ styrsp¨anningsadressering och styrsp¨anningsrepresentation . . . 26
9. Slutsatser 27
10.Framtida Arbeten 28
References 31
Bilaga A Deltagarformul¨ar - Anv¨andartest 32
Bilaga B Fr˚ageformul¨ar - Anv¨andartest 33
1.
Inledning
Med den tekniska utvecklingen genom ˚aren har utvecklingen av musikaliska instrument f¨oljt med. Det var p˚a 1960-talet, i samband som transistorer b¨orjade tillverkas i industrier, som Robert Moog och Donald Buchla tillverkade sina elektroniska musikinstrument vilka skulle f˚a stor uppm¨arksamhet inom musikv¨arlden [1]. B˚ada tv˚a anses vara pionj¨arer inom ljudsyntes (alstrandet av ljud genom h˚ardvara) och utvecklade sina instrument p˚a olika h˚all, oberoende av varandra. Framf¨orallt Moog fick ett enormt kommersiellt genombrott av sin modul¨ara synthesizer som anv¨ande klaviatur (piano-tangenter), vilket minskade inl¨arningskurvan och ¨aven bidrog till ett ¨okat intresse fr˚an allm¨anheten. En modul¨ar synthesizer ¨ar ett analogt instrument best˚aendes av individuella moduler som sam-mankopplas p˚a olika s¨att [2]. Modulerna ¨ar specialiserade p˚a att utf¨ora olika saker: Vissa moduler genererar ljud medan andra anv¨ands exempelvis som filter f¨or att t.ex. filtrera bort ett visst fre-kvensomr˚ade ur ett genererat ljud. Instrumentet hanterar signaler helt analogt, och fast¨an det ¨ar en gammal teknik fr˚an 60-talet s˚a har modul¨ara synthezisers f˚att uppm¨arksamhet p˚a nytt senare in p˚a 2010-talet, troligtvis i samband med en s.k. “Do it yourself-r¨orelse”(DIY-movement) [3]. Den h˚ardvarun¨ara kontakten med det analoga ljudet ¨ar n˚agot som m¨ojligg¨or en n¨ara relation mellan anv¨andaren och instrumentet, vilket ¨oppnar upp n¨astintill o¨andliga m¨ojligheter f¨or kreativt skapande. Ett bra s¨att f¨or att beskriva sj¨alva musikskapandeproccessen med modul¨ara synthesi-zers ¨ar med termerna som filosofen Umberto Eco myntade under 60-talet [4]: moving art eller open work, vilka inneb¨ar att slutresultatet av musiken inte alltid ¨ar k¨ant p˚a f¨orhand. Eco ville visa p˚a att fysikens v¨arldsuppfattning pr¨aglat hur konsten f¨or¨andrats in p˚a 1900-talet till att vara mer r¨orlig och f¨or¨andrande: fr˚an Copernicus statiska v¨arldsbild till Einsteins mer dynamiska syns¨att. ¨
Aven M. Lerner som skriver om Jos´e Vicente Asuar och hans elektroniska musikmaskin g˚ar att likst¨alla med arbetss¨attet [5]. Asuar f¨orklarar m¨ojligheterna f¨or det kreativa skapandet med sin maskin: “investigate new ways of performing impossible to be carried out by human players, and it opens up a path toward the achievement of new articulations and sonorities beyond instrumental technique and traditional electronic music”
En sampler ¨ar ett musikinstrument som kan anv¨andas b˚ade sj¨alvst¨andigt och som modul i en modul¨ar synthesizer. Instrumentet baseras p˚a inspelade ljud (ljudsp˚ar) och kan hantera dessa ljud p˚a olika s¨att beroende p˚a samplerns gr¨anssnitt. Vanligt ¨ar att korta ljudsp˚ar loopas f¨or att skapa en rytm som sedan integreras i ett musiksp˚ar. Som modul i en modul¨ar synthesizer ¨ar det vanligt att vissa av ljudets aspekter g˚ar att kontrollera med styrsp¨anning (volt). P˚a detaljniv˚a anv¨ands ofta n˚agon form av digital signalbehandling (DSP; Digital signal processing”) till att f¨or¨andra in-eller utsignaler.
En aspekt i en samplermodul som vanligtvis g˚ar att kontrollera med styrsp¨anning ¨ar tonh¨ojden p˚a det uppspelande ljudsp˚aret. Tyme Sefari II [6] ¨ar en s˚adan modul, d¨ar styrsp¨anning kan kontrollera uppspelningshastigheten, samt start- och stopptid f¨or ljudsp˚ar. Det som d¨aremot saknas i modulen, samt vad jag och min handledare funnit f¨or andra samplermoduler, ¨ar m¨ojligheten att kontrollera minnespekare f¨or ljudsp˚arets minnesbuffer med hj¨alp av styrsp¨anning. En s˚adan ut¨okad kontroll och n¨armare kontakt till ljudet skulle ge upphov till nya, kanske helt oh¨orda, unika musikaliska uttryck. Detta arbete har utforskat adressering av styrsp¨anning till minnesadresser i en ljudbuf-fer, vilka praktiska till¨ampningar jag funnit anv¨andbara, samt hur stort minnesomr˚ade som kunde adresseras f¨or en styrsp¨anning p˚a omf˚anget 20 volt. Eftersom fr˚agest¨allningarna b¨ast utforskades med en mjukvaruimplementation av en samplermodul inkluderar den f¨orsta fr˚agest¨allningen, be-tr¨affande isolerbara resultat, experiment i form av praktiska anv¨andningsomr˚aden f¨or modulen Den andra fr˚agest¨allningen, ang˚aende gr¨ansen f¨or adresserbart minnesomr˚ade, besvarade jag med en explorativ unders¨okning p˚a egen hand eftersom fr˚agan kr¨aver en djupg˚aende instudering av flyttal samt hur styrsp¨anningen fungerar i VCV Rack.
Vidare finns ¨aven en anv¨andarstudie inkluderad. Notera att denna inte ¨ar utf¨ord p˚a ett veten-skapligt rigor¨ost s¨att utan ¨ar utf¨ord i syfte att ge en indikation f¨or modulens anv¨andbarhet.
2.
Bakgrund
2.1.
Modul¨
ara synthesizers (Modul¨
arsyntes)
En synthesizer ¨ar ett elektroniskt musikinstrument som genererar signaler antingen analogt eller digitalt och sedan konverterar dessa till ljudsignaler. En modul¨ar synthesizer ¨ar en typ av analog synthesizer som best˚ar av moduler, specialiserade p˚a att utf¨ora olika saker [2]. Det gemensamma med alla moduler ¨ar att de kommunicerar med styrsp¨anning (volt) genom att modulerna samman-kopplas med sladdar. En VCO (Voltage Controlled Oscillator) ¨ar en ofta f¨orekommande modul inom modul¨arsyntes som genererar olika sorters ljudsignaler till dess output. Dessa signaler kan sedan antingen matas ut till h¨ogtalare f¨or att f˚a h¨orbart ljud eller kopplas vidare till andra moduler som slutligen n˚ar h¨ogtalarna. P˚a en VCO kan frekvensen (Hz) moduleras antingen med styrsp¨anning eller manuellt med ett vridreglage. Ytterligare en v¨aldigt vanlig modul inom modul¨arsyntes ¨ar en LFO (Low Frequency Oscillator). Denna modul ¨ar ocks˚a en oscillator liksom VCO:n, men som hu-vudsakligen anv¨ands till att modulera andra ljudk¨allor d˚a modulens utsignaler oscillerar l˚angsamt. En LFO ¨ar d¨arf¨or h¨orbar indirekt genom exempelvis modulering av en VCO:s utsignaler s˚a att vibrato genereras [7].
Varje modul har vanligtvis b˚ade in- och utg˚angar f¨or olika syften. Dessa ¨ar i form av portar (kopplingsh˚al) d¨ar instrumentsladdar (tele/tele) kan anslutas. I figur 1 nedan illustreras en VCO och VCA (Voltage Controlled Amplifier) i en simulerad modul¨arsyntes-milj¨o kallad VCV Rack. En VCO och en VCA ¨ar ihopkopplade med en sladd fr˚an utg˚angen SAW p˚a VCO:n till ing˚angen IN p˚a VCA:n. Funktionen f¨or en VCA ¨ar att reglera insp¨anningens amplitud, och i exemplet nedan fungerar den som volymkontroll f¨or VCO:n (ungef¨ar 50% av input kommer matas ut ur output-porten som finns l¨angst ner p˚a modulen). F¨or en VCO moduleras tonh¨ojden med styrsp¨anning oftast med 1 volt per oktav (intervallet mellan tv˚a toner vars frekvensf¨orh˚allande ¨ar 2:1). I figur 1 ¨
ar det porten V/OCT som anv¨ands f¨or denna typ av frekvensmodulering; ju h¨ogre sp¨anning som matas in, desto h¨ogre frekvens genereras till utg˚angarna.
2.2.
˚
Aterkomsten av analog teknik
Modul¨ara synthesizers ¨ar en gammal metod f¨or ljudsyntes som kommersialiserades p˚a 1960-talet i samband med transistorernas framv¨axt [8], d˚a de op˚alitliga elektronr¨oren slopades i elektronik [1]. Robert Moog och Donald Buchla anses vara pionj¨arerna inom modul¨arsyntes och utvecklade p˚a 1960-talet, helt oberoende av varandra, modul¨ara synthesizers fast med olika tillv¨agag˚angss¨att. Medan Buchla fokuserade mer p˚a att hitta nya s¨att att interagera med h˚ardvaran lade Moog be-toning p˚a att anv¨anda redan k¨anda format f¨or musikaliska gr¨anssnitt: klaviaturet. Detta f¨or att minska inl¨arningskurvan av det analoga instrumentet. P˚a grund av detta k¨anda format blev Moogs synthesizer en stor kommersiell succ´e som senare in p˚a 1970-talet kom att falla i gl¨omska p˚a grund av de polyfoniska digitala synthesizers vidspredda succ´e p˚a 80-talet. Eftersom digitala synthesizers kostade mindre att producera, tog upp mindre plats, och var mer stabila ¨an analoga modul¨arsyntar blev dem att f¨oredra ¨over det analoga. En digitalisering b¨orjade tr¨ada fram p˚a 80-talet d¨ar det nya digitala blev standarden f¨or teknik, inte bara inom musikv¨arlden: I hush˚allen blev exempelvis hemdatorer, minir¨aknare och digitala klockor v¨aldigt popul¨ara.
2010 s˚ags en kraftigt stigande trend i uppstart av f¨oretag som tillverkade modul¨arsynthar av Eurorack-formatet [1]. Formatet Eurorack, som nu anses vara standard f¨or modul¨ara synthesizers, uppfanns av Dieter Doepfer som ˚ar 1996 lanserade ett system f¨or modul¨ara synthesizers med spe-cifikationer f¨or modulernas sp¨anningsv¨arden och dimensioner [9]. N˚agra troliga anledningar till att formatet blev s˚a popul¨art ¨ar att h˚ardvaran var tillverkad av vanliga, billigare komponenter samt att formatet var kompatibelt med m˚anga andra tillverkare av modul¨ara synthesizers. Detta i kom-bination med att digital signalbehandlig (DSP; Digital signal processing) kunde implementeras i moduler med billiga mikrokontroller (enchipsdatorer) reducerade kostnader och f¨oljaktligen ¨okade tillg¨angligheten.
Denna stigande trend av modul¨ara synthesizers kan ses om ett bak˚atstr¨avande i avseende p˚a digitaliseringen och att ny teknik ¨ar att f¨oredra ¨over gammal teknik. Vad som dock har vuxit fram ¨ar en “Do it yourself-r¨orelse”[3] (DIY-movement) kring gammal teknik som modul¨arsyntes. Den ¨okade tillg¨angligheten som jag beskrev i f¨orra stycket bidrog till denna r¨orelses framv¨axt, och anh¨angare till r¨orelsen tycks strunta i vad som ¨ar popul¨ar eller trendig teknik. Varf¨or denna r¨orelse och stigande trend inom modul¨arsyntes vuxit fram har en studie [1] unders¨okt. I studien intervjuades tillverkare av modul¨ara synthesizers f¨or att finna anledningar till varf¨or folk v¨aljer modul¨arsyntes. Deras slutsats visar p˚a ett ¨okat intresse f¨or den taktila upplevelsen, n¨arheten till h˚ardvaran och ljudet, som den st¨orsta orsaken till varf¨or m˚anga v¨aljer modul¨arsyntes.
F¨oljande det ¨okade intresset 2010 b¨orjade flertalet utvecklare och f¨oretag skapa virtuella modul¨ara synthesizers, d¨ar det analoga ljudet simuleras med DSP [10], [11], [12]. En virtuell modul¨ar synt-hesizer med ¨oppen k¨allkod som f˚att stor spridning ¨ar VCV Rack [13].
2.3.
VCV Rack
VCV Rack ¨ar en simulerad virtuell milj¨o f¨or modul¨ara synthesizers som ¨ar open-source och ba-seras p˚a Eurorack-formatet [13]. Mjukvaran ¨ar skapad av Andrew Belt och sl¨apptes efter tv˚a ˚ars utveckling p˚a konventet Knobcon den 10:e september 2017 [14]. Programmet ¨ar skrivet i C++ och baseras p˚a en osl¨appt modul¨ar ljudmotor som Andrew skapade 2012. Visionen med VCV Rack var att ¨oka m¨ojligheten f¨or fler att anv¨anda samt l¨ara sig modul¨ara synthesizers; analoga modul¨ara synthesiserz ¨ar oerh¨ort kostsamma och att simulera instrumentet virtuellt minimerar kostnaden och ¨okar tillg˚angen till allm¨anheten.
Alla moduler i VCV Rack kommunicerar med simulerad styrsp¨anning (volt). Sp¨anningen som modulerna hanterar rekommenderas inte ¨overstiga ett intervall p˚a 10 volt [15]. Ljudoutput b¨or d¨arf¨or ligga inom omf˚anget -5 till +5 volt, medan moduler som modulerar signaler eller ljudoutput b¨or ligga inom omf˚anget 0 till +10 volt. Det totala omf˚anget som st¨ods ¨ar 24 volt (-12 till +12), vilket ¨ar standard f¨or Eurorack-formatet.
Figur 2: VCV Rack, version 1.1.4
2.4.
Samplers
En sampler ¨ar ett instrument som i sin enklaste form kan lagra ljud (ljudsp˚ar) samt spela upp dem. Det ¨ar vanligt att korta ljudsp˚ar lagras f¨or att sedan spelas upp sekvensiellt i takt (se sequencers [16]). Fler vanliga funktioner en sampler har ¨ar m¨ojlighet till att spela in ljud via mikrofon samt spela upp ljudsp˚ar i olika hastigheter, vilket ¨andrar ljudsp˚arets tonh¨ojd [17]. Som modul i en modul¨ar synthesizer ¨ar det vanligt att ljudsp˚arens hastighet kan moduleras p˚a samma s¨att som med ing˚angen V/OCT i VCO:n. Det som sker p˚a en l¨agre abstraktionsniv˚a ¨ar att minnespekaren tillh¨orande ljudbuffern f¨orflyttar sig stegvis med olika hastigheter beroende p˚a m¨angden volt som matas in. Om exempelvis 3 olika konstanta sp¨anningar matas in efter varandra p˚a 1, 2 respektive 3 volt kommer ljudsp˚aret som spelas upp att successivt ¨oka i frekvens med 1 oktav f¨or varje sp¨anningsv¨arde.
2.5.
Sequencers
En enkel sequencer inom modul¨arsyntes ¨ar en modul som sekventiellt eller med styrsp¨anning ste-gar igenom ett antal celler inneh˚allandes sp¨anningsv¨arden. Dessa styrsp¨anningsv¨arden kan sedan anv¨andas f¨or att modulera parametrar hos andra moduler. Modulen SLIDERSEQ fr˚an Cf ?? ¨ar ett exempel p˚a en enkel sequencer som visas nedan I figur [18]. Modulen stegar igenom 16 styr-sp¨anningsl¨agen som g˚ar att reglera med reglage (upp/ned).
Figur 3: Sequencer-modul fr˚an Cf
2.6.
Digitala Ljudfiler
Ljudfiler som hanteras digitalt m˚aste vara strukturerade p˚a ett specifikt s¨att s˚a att proceduren f¨or l¨asning och skrivning ¨ar k¨ant i f¨orv¨ag. Den vanligaste typen av kodning som anv¨ands f¨or de flesta ljudfilstyper ¨ar pulse code modulation (PCM) [19]. Denna typ av kodning best˚ar i grunden av en l˚ang str¨om bin¨ara tal, d¨ar varje bin¨art tal motsvarar en uppm¨att ljudv˚agsamplitud f¨or en given tid. Dessa uppm¨atta amplituder kallas f¨or samples, d¨ar varje individuell sample bildar tillsammans med header-information den fullst¨andiga ljudfilen. Termen sample kan ¨aven betyda “inspelat (samplat) ljudsp˚ar”i musikproduktionssammanhang, men i kontext till beskrivning av ljudfiler avser termen enbart de enskilda uppm¨atta amplituderna. F¨or att undvika f¨orvirring av termen anv¨ander jag d¨arf¨or den svenska termen ljudsp˚ar som notation f¨or inspelat ljud och samples f¨or amplituderna. Varje sample ¨ar av best¨amd storlek och ¨ar antingen heltal (integers) eller flyttal (floating-point numbers). Storleken varje sample har kallas f¨or ljudsp˚arets bit depth och motsvarar uppl¨osningen f¨or hur m˚anga bitar av information som de uppm¨atta amplituderna kan anta. F¨or CD-ljud ¨ar 16 bitars bit depth vanligt medan DVD- och Blu Ray-ljud st¨odjer upp till 24 bitar. 32-bitars flyttal ¨
ar vanligt inom professionella studiomilj¨oer.
F¨or att veta hur ofta uppm¨atningarna av varje sample skett beh¨over vi veta ljudsp˚arets samp-le rate. Vanligtvis anv¨ands enheten hertz (Hz) och f¨or CD-ljud och m˚anga andra applikationer ¨ar standarden 44100 Hz. Detta inneb¨ar att en ljudfil p˚a 1 sekund inneh˚aller 44100 enskilda samples. Om filen har 16-bitars (2 bytes) bit depth ¨ar storleken f¨or alla samples allts˚a totalt 88200 bytes. Det sista som beh¨over vara k¨ant i f¨orv¨ag f¨or uppspelning av en r˚a PCM-kodad fil ¨ar hur m˚anga kanaler sp˚aret anv¨ander. 2 kanaler inneb¨ar stereoljud, dvs. att tv˚a h¨ogtalare beh¨ovs f¨or att ˚aterge ljudet korrekt. Ju fler kanaler, desto fler ljudk¨allor beh¨ovs. Fast¨an det ¨ar fullt m¨ojligt att spela upp stereoljud med en enda h¨ogtalare kommer de b˚ada kanalerna d˚a att sl˚as ihop och l˚ata som om 1 kanal anv¨ants (mono). Om ist¨allet 2 kanaler anv¨ands g˚ar det exempelvis att spela upp tv˚a helt
olika ljud samtidigt i 2 h¨ogtalare. Datam¨assigt lagras fler ¨an 1 kanal p˚a ett s.k. “interleaved way”, “Interfolierat s¨att”(direkt¨oversatt): samples som tillh¨or samma givna tidpunkt grupperas till en sample frame och ligger direkt intill alla andra samples i datastrukturen. I fig 4 nedan illustreras en ljudfil best˚aendes av 2 kanaler, 5 sample frames och 10 samples.
Figur 4: En ljudfil med 2 kanaler, 5 frames och 10 samples
Den typ av PCM-kodad fil som den implementerade modulen hanterar ¨ar WAV (Waveform Audio File Format) [20]. WAV-filer best˚ar av olika chunks inneh˚allande metadata samt data (ljudsp˚ar). Det som kommer f¨orst i filen ¨ar alltid en header som inneh˚aller 3 f¨alt med metadata, varav en 32-bitars unsigned int som beskriver filens totala storlek i bytes minus de 2 ¨ovriga f¨alten i headern. Eftersom storleken beskrivs med 32 bitar kan filens storlek aldrig ¨overskrida 4 GB ( 232 - 1 = 4 294 967 295 Bytes)
2.7.
Libsndfile
Libsndfile ¨ar ett bibliotek skrivet i C som anv¨ands f¨or behandling av ljudfiler [21], [22]. Det ¨ar skrivet i ett Linuxbaserat system och b¨or fungera p˚a n¨astan alla sorters UNIX-system; det finns ¨
aven tillg¨angligt i form av f¨orkompilerade binaries f¨or b˚ade 32- och 64-bitars Windows. Biblioteket hanterar b˚ade l¨asning och skrivning av och till ljudfiler av typ big-endian och little-endian. Lib-sndfile f¨orser hantering av olika ljudfilstyper med samma funktioner utan att beh¨ova ta h¨ansyn till detaljer som header-information eller ifall filen ¨ar big-endian eller little-endian.
F¨or att ¨oppna en ljudfil anv¨ands funktionen sf open:
SNDFILE *sf_open(const char *path, int mode, SF_INFO *sfInfo);
Den returnerar ett handtag (handle) som ¨ar en referens till den ¨oppnade ljudfilen. Funktionen kan ¨oppna en ljudfil f¨or l¨asning, skrivning eller b˚ade och beroende p˚a vad mode s¨atts till. path inneh˚aller filens s¨okv¨ag och sfInfo ¨ar en struct med ljudfilens metadata:
typedef struct { sf_count_t frames; int samplerate; int channels; int format; int sections; int seekable; } SF_INFO;
De flesta f¨alten ¨ar vid f¨orsta anblick l¨atta att k¨anna igen: frames ¨ar det totala antalet frames, samplerate ¨ar ljudsp˚arets sample rate, channels motsvarar antalet kanaler. format specificerar vilken filtyp som ska hanteras, den s¨atts till 0 vid ¨oppning av filer d˚a v¨ardet tilldelas automatiskt. sections och seekable s¨atts ¨aven automatiskt vid ¨oppning av fil.
Efter att filen har ¨oppnats korrekt och ett handtag har returnerats anv¨ands funktionen sf readf float till att fylla en array med samples som ptr pekar mot:
sf_count_t sf_readf_float(SNDFILE *sndfile, float *ptr, sf_count_t frames); Som namnet avser p˚a funktionen hanterar den arrayer av typen float (flyttal), vilket motsvarar ljudsp˚ar med 32-bitars flyttals-bit depth. Det finns fler funktioner med samma funktionalitet som hanterar olika bit depths, men f¨or enkelhetens skull beskriver jag endast den funktionen som im-plementerades i The Buffer. sf readf float tar som argument ut¨over ptr ett handtag sndfile till den ¨
oppnade ljudfilen samt antalet frames som ljudsp˚aret best˚ar av.
2.8.
Artefakter och aliasing
En artefakt inom vetenskapen och DSP ¨ar ett fel som uppst˚ar vid representation av information p˚a grund av den metod som anv¨ands f¨or att behandla informationen [23]. Aliasing ¨ar ett exempel p˚a en artefakt. Aliasing uppst˚ar ifall en signal samplas med f¨or l˚ag sample rate. Fig 5 nedan visar en signal (r¨od) som samplas f¨or s¨allan och d¨arf¨or ger upphov till en helt annorlunda sinusv˚ag (bl˚a) efter att samplingspunkterna (svart) blivit interpolerade.
Figur 5: Aliasing p˚a grund av f¨or l˚ag sample rate
F¨or att korrekt sampla en signal kan Nyquist-Shannons samplingsteorem anv¨andas [24]. Teoremet beskriver att en sample rate p˚a minst dubbla den h¨ogsta frekvensen i ljudk¨allan m˚aste anv¨andas f¨or att korrekt avbilda signalerna. Det f¨oruts¨atter ocks˚a att signalerna ¨ar j¨amnt f¨ordelade. Om en sinusv˚ag med en period p˚a 2π ska samplas kr¨avs allts˚a en sample rate p˚a 4π Hz, eller med andra ord: om den h¨ogsta frekvensen i en signal ¨ar 100 Hz kr¨avs minst en sample rate p˚a 200 Hz.
¨
Oversampling kan vara anv¨andbart ifall de h¨ogsta frekvenserna inte ¨ar k¨anda i f¨orv¨ag, detta f¨or att garantera att s˚a m˚anga signaler blir korrekt samplade som m¨ojligt.
Om inte ¨oversampling undviker aliasingartefakter finns det andra metoder som kan minska dem. Vanligt ¨ar att applicera ett low-pass-filter (LPF), antingen f¨ore, eller efter sampling sker, f¨or att skala bort artefakter som ˚aterfinns mest i de h¨ogre frekvenserna [25]. Detta kan dock g¨ora att ljudet upplevs d¨ampat eller dovt d˚a m˚anga ljud best˚ar av adderade frekvenser som str¨acker sig ¨
over filtret [26].
I olika omr˚aden ¨ar aliasing oftast inte ¨onskv¨art eftersom de samplade signalerna inte represen-terar verkligheten, och bearberas signalerna vidare s˚a utg˚ar ber¨akningar fr˚an redan felaktig data. I musikv¨arldens DSP ¨ar aliasingartefakter i m˚anga avseende o¨onskv¨arda, men kan i vissa fall inne-ha estetiskt v¨arde. S¨arskilt med utg˚angspunkt i glitch-genren och det postdigitala samh¨allet [27]. Inom genren electronica ¨ar det exempelvis vanligt att brus och andra artefakter anv¨ands f¨or att skapa en viss st¨amning.
2.9.
Representation av flyttal (floating point numbers)
Eftersom m¨angden reella tal ¨ar o¨andlig, och minnet p˚a datorer ¨andlig, beh¨over talen approximeras och representeras med flyttal (p˚a engelska; ’floats’ eller ’floating point numbers’). En standard som n¨astan alla tekniska till¨ampningar med aritmetik anv¨ander ¨ar IEEE754 (Standard for floating point arithmetic) [28], [29]. Enligt standarden definieras ett flyttal av fyra komponenter: ett tecken (sign) s, en mantissa M, en bas b, samt en exponent e. Dessa komponenter som tillsammans bildar flyttalet skrivs med formeln (−1)s· M · besamt ¨ar av best¨amda storlekar. F¨or ett 32-bitars bin¨art flyttal (se figur 6 nedan) utg¨or den f¨orsta biten, tecknet s, talets polaritet och kan antingen vara satt till 0 f¨or plus (+) eller 1 f¨or minus (-). De n¨astkommande bitarna fram till och med bit 23 (bit-numrering fr˚an 0 till 31) ¨ar talets exponent. Det speciella med exponenten ¨ar att den ¨ar f¨orskjuten med v¨ardet 127, vilket inneb¨ar att det riktiga v¨ardet f˚as genom att subtrahera exponentens v¨arde med 127. Basen b f¨or 32-bitars bin¨ara flyttal ¨ar alltid 2 och beh¨over inte d¨arf¨or inte lagras bland de 32 bitarna. De resterande 23 bitar ¨ar mantissan som avser flyttalets precision, allts˚a hur m˚anga siffror och decimaler som kan approximeras. Precisionen ¨ar egentligen 24 bitar, men den f¨orsta biten f¨or mantissan ¨ar alltid 1 (20) och ¨ar d¨arf¨or en implicit ledande bit som inte lagras bland bitarna. Mantissan best˚ar s˚aledes av bitar som r¨aknas i br˚akdelar; bit 22 har v¨ardet 2−1, bit 21 v¨ardet 2−2 och bit n v¨ardet 2n−23. Nedan f¨oljer en f¨orklaring till hur bitm¨ostret i Figur 6 bildar talet 0.15625:
sign : (−1)0= 1
exponent : 22+ 23+ 24+ 25+ 26− 127 = 124 − 127 = −3 mantissa : 2−2+ 1(implicit bit) = 0.25 + 1 = 1.25
Med formeln f˚ar vi:
(−1)s· M · be= (−1)0· 1.25 · 2−3= 1 · 1.25 · 0.125 = 0.15625
Figur 6: 32-bitars flyttal
Exponentbitarna ¨ar vanligtvis inte alla satta till 0 s˚avida inte ett subnormalt tal ska representeras [29]. De subnormala talen ¨ar flyttal som ¨amnar ˚at att fylla en underfl¨odesglipa (underflow gap) omkring talet 0. Fig 7 nedan illustrerar detta grafiskt med en tallinje:
Figur 7: Subnormala flyttalsv¨arden (bl˚att)
Som n¨amnt tidigare best˚ar mantissan av en implicit ledande bit som inte lagras i minnet. N¨ar subnormala tal representeras ¨ar dock denna ledande bit 0 eftersom alla exponentbitar ¨ar 0. D˚a mantissan ¨ar 0 finns det 223 v¨arden p˚a den positiva likv¨al den negativa sidan av 0 p˚a tallinjen (se figur 7). En till viktig aspekt att n¨amna ¨ar att flyttalen i stora drag ¨ar logaritmiskt utspridda; med flest distinkta v¨arden n¨armast 0 och f¨arre v¨arden ju l¨angre bort fr˚an 0 talet ¨ar.
3.
Tidigare arbeten
3.1.
Tyme Sefari MKII
Tyme Sefari MKII [6] ¨ar en modul skapad av The Harvestman som har vissa liknande funktioner som g˚ar att j¨amf¨ora med The Buffer. Modulen kan ¨andra start- och stopptid f¨or ljudsp˚ar, antingen med tv˚a reglage (LOOP MARKER POSITION) eller med styrsp¨anning (0-5 v). ljudsp˚arets fre-kvens g˚ar att reglera manuellt med ett rattreglage eller med styrsp¨anning (0-5 v). Den vitala skillna-den mellan Tyme Sefari MKII och The Buffer ¨ar Tyme Sefari inte st¨odjer styrsp¨anningsadressering till minnespekare utan begr¨ansar anv¨andaren till reglering av ljudsp˚arets uppspelningshastighet.
3.2.
The Slidepipe
Argo [30] skriver om sitt instrument The Slidepipe, en h˚ardvarukontroller som anv¨ands till att manipulera ljudsp˚ar i realtid. Ambitionen med The Slidepipe var att f¨orenkla manipulationen av ljudsp˚ar, s¨arskilt med avseende tidslinjekontroll vilket Argo fann vara den viktigaste aspekten f¨or samplers. Instrumentet best˚ar av tre r¨or med tv˚a flyttbara plattor p˚a varje r¨or (se figur 9). R¨oren ¨
ar en metafor f¨or en tidslinje som motsvarar ljudsp˚arets start- och stopptid. Genom f¨orflyttning av plattorna kan start- och stopptid ¨andras; v¨anstra plattan f¨or starttid och h¨ogra f¨or stopptid. Flyttas exempelvis plattorna v¨aldigt t¨att ihop spelas endast en liten del av det samplade ljudsp˚aret. I teorin borde svepning i minnet liksom i The Buffer uppn˚as d˚a plattorna s¨atts emot varandra och en svepande r¨orelse f¨orflyttar b˚ada plattor samtidigt ˚at samma h˚all. ¨Ar r¨orelsen konstant borde ljudsp˚aret spelas upp med konstant hastighet.
4.
Problemformulering
F¨or traditionella samplers ¨ar det vanligt att styrsp¨anningen kontrollerar tonh¨ojden, normalt 1 volt per oktav. Det kr¨avs allts˚a en konstant styrsp¨anning f¨or att spela upp ett ljudsp˚ar med konstant hastighet. Genom att ge anv¨andaren mer kontroll i en simulerad synthesizermodul som hanterar ljudsp˚ar kan denna ut¨okade kontroll ge upphov till nya kreativa uttryck f¨or skapande av ljud och musik. Denna ut¨okade kontroll inneb¨ar att man med hj¨alp av simulerad styrsp¨anning kommer styra positionen av tv˚a minnespekare tillh¨orande ett ljudsp˚ars minnesbuffer: en f¨or l¨asning respektive skrivning till minnet. F¨or att d˚a kunna spela upp ett ljudsp˚ar med konstant hastighet kr¨avs det en linj¨ar stigande styrsp¨anning vars derivata ¨ar lika med uppspelningshastigheten. I figur 10 nedan illustreras en inmatad sp¨anningsramp i gul f¨arg. Derivatan av funktionen blir i detta exempel en konstant vars v¨arde motsvarar uppspelningshastigheten.
Figur 10: “Volt-derivata”
Det intressanta med att ge tillg˚ang direkt till minnespekarna genom styrsp¨anning ¨ar fr¨amst den n¨ara kontakten med ljudet: den ¨okade kontrollen kommer ge upphov nya, kanske helt oh¨orda, kreativa uttryck och ljud. ¨Aven ov¨antade artefakter kan vara av intresse. D¨arf¨or handlar den ena fr˚agest¨allningen om vilka samband som kan hittas mellan insp¨anningen och det resulteran-de ljuresulteran-det; finns resulteran-det isolerbara resultat? Och hur kan modulens anv¨andas rent praktiskt? Vidare ¨
ar ¨aven gr¨ansen p˚a maximalt adresserbart utrymme av intresse; hur stor kan adressrymden f¨or ljudsp˚ar vara? Eftersom denna ¨ovre gr¨ans korrelerar med implementation samt ljudfilstyp k¨andes fr˚agest¨allningen relevant och viktig att utforska. Nedan beskrivs de konkreta fr˚agest¨allningarna:
4.1.
Fr˚
agest¨
allningar
• Vid uppspelning med styrsp¨anning; vilka isolerbara och generaliserbara praktiska till¨ampningar och resultat kan h¨oras i utljudet, och hur ser kopplingen ut mellan insp¨anning och ljudresul-tat?
• F¨or en styrsp¨anning p˚a -10 till +10 volt (totalt omf˚ang 20 volt) samt anv¨andandet av ett 32-bit system, hur stort minnesomr˚ade kan maximalt adresseras f¨or styrsp¨anningen s˚a att pekarna sveper ¨over varje frame av ljudsp˚aret?
F¨or att inte ge den f¨orsta fr˚agest¨allningen en f¨or stor bredd begr¨ansar jag arbetet till att inne-fatta unders¨okning av insp¨anning i form av konstant sp¨anning samt de 4 vanligaste v˚agformerna: sinusv˚ag, fyrkantsv˚ag, triangelv˚ag och s˚agtandsv˚ag. Jag kommer ¨aven unders¨oka n˚agra samband som f˚as n¨ar flera v˚agformer kombineras samt beskriva hur dessa till¨ampas praktiskt p˚a modulen. Den sista fr˚agest¨allningen har inget entydigt svar utifr˚an hur den ¨ar formulerad; beroende p˚a hur styrsp¨anningen ¨ar representerad i systemet s˚a varierar adresseringen av minnet, hur sj¨alva adresseringen implementeras har ocks˚a en inverkan p˚a fr˚agest¨allningens svar. D¨arf¨or begr¨ansar jag min fr˚agest¨allning genom att bara anv¨anda 32-bitars flyttal som representation av styrsp¨anning, samt Wav-formatet f¨or ljudsp˚ar. Styrsp¨annings-intervallet som anges ovan (-10 till +10) begr¨ansas till 0 till +10 v p˚a grund av min implementation av linj¨ar styrsp¨annings-adressering.
5.
Metod
F¨or att kunna besvara fr˚agest¨allningarna implementerade jag en samplermodul, The Buffer, i VCV Rack som sedan utv¨arderades med en explorativ unders¨okning samt experiment i form av praktiska till¨ampningar av modulen.
Den f¨orsta fr˚agest¨allningen g¨allande vilka kopplingar som g˚ar att finna i insp¨anning och resul-terande ljud av modulen unders¨okte jag med ett praktiskt experiment. H¨ar valdes just denna metod d¨arf¨or att jag vill finna samband mellan insp¨anning och ljud-output. Dessa kommer jag inte beskriva matematiskt utan snarare i termer av praktiska till¨ampningar av modulen. Fokus l¨aggs p˚a de samband som g˚ar att finna vid inmatning av styrsp¨anning och ljud-output.
Den andra fr˚agest¨allningen, om hur stort minnesomr˚ade som maximalt g˚ar att adressera pekar-na, utforskade jag genom en explorativ unders¨okning. Denna typ av metod k¨andes mest l¨amplig eftersom fr˚agest¨allningen enklast besvaras genom unders¨okning av aspekter som h¨or till minnesa-dressering och flyttal. Fr˚agest¨allningen utforskades ocks˚a med matematiska ber¨akningar som be-skriver de teoretiska begr¨ansningarna f¨or minnesbufferns storlek i enlighet med fr˚agest¨allningens begr¨ansningar.
6.
Etik och Samh¨
alleliga aspekter
6.1.
Deltagarexperiment
Under p˚ag˚aende anv¨andartester av den implementerade modulen var deltagarna medvetna om att testet gjordes helt frivilligt och att de n¨ar som helst under processen kunde v¨alja att avsluta. Del-tagarnas personliga uppgifter exkluderades ¨aven ur deltagarformul¨aret, ingen information som kan anv¨andas till att identifiera en individ ¨ar inkluderad. Den enda informationen g¨allande deltagarnas demografi som samlades in var ang˚aende musikaliska f¨orkunskaper samt hur bekant deltagaren var med modul¨ara synthesizers.
6.2.
Plunderphonics
Samplad ljud fr˚an naturen ¨ar inget som ¨ar upphovsr¨attsskyddat material. D¨aremot om exempel-vis Michael Jacksons Beat it”:s f¨orsta tre takter skulle samplas av n˚agon och finnas tillg¨anglig i offentliga sammanhang finns risken att denna n˚agonblir tagen f¨or brott mot upphovsr¨attslagen. Plunderphonics [31], en term som myntades av John Oswald p˚a 80-talet, inneb¨ar skapandet av ny musik genom befintlig musik. Spela en instrumental version av “Beat it“ bakl¨anges med sm˚a fragment p˚a n˚agon sekund fr˚an AC/DC:s “Thunderstruck“, Metallicas “One“ och Rammsteins “Du hast“ s˚a r¨aknas resultatet som plunderphonics. Om plunderphonics klassas som brott mot upphovsr¨attslagen ¨ar omtvistat och best¨ams d¨arf¨or utifr˚an enskilda fall; ¨ar musiken tillr¨ackligt liknande kan ˚atal v¨ackas.
Ett k¨ant fall d˚a upphovsr¨attslagen brutits vid sampling ¨ar d˚a The Verve’s ‘Bittersweet Symp-hony’ anv¨ande en sample (4 takter) fr˚an en orkestral version av The Rolling Stones ’The Last Time’ [32]. N¨ar domen var f¨alld var The Verve tvungna att betala 100% av sin vinst p˚a deras l˚at. Det var Allen Klein p˚a ABKCO Industries (upphovsr¨atts¨agare till ’The Last Time’) som lyckades f¨orhandla fram den f¨allande domen.
6.3.
Exempelmusik fr˚
an The Buffer
Eftersom m˚anga l˚atar faller under upphovsr¨attslagen finns l˚aten Around the world av Daft Punk tillg¨anglig som l¨ank och inte som nedladdningsbar fil i Bilaga C. D¨aremot finns samma l˚at, fast omgjort av The Buffer, som en direkt nedladdningsbar fil d˚a denna inte borde falla under upp-hovsr¨attslagen eftersom l˚aten ¨ar omgjort; vissa element k¨anns igen men l˚atens struktur och melodi ¨
7.
Utveckling samt unders¨
okning av The Buffer
Implementationen av The Buffer skedde i milj¨on Visual Code i kodspr˚aket C++. VCV Rack [13] valdes som l¨amplig simulerad plattform d˚a programvaran ¨ar open-source under licensen GNU Ge-neral Public License 3.0 [33]. VCV Rack tillhandah˚aller ett API [34] samt en modulmall i C++ som underl¨attade utvecklingen av The Buffer, vilka ¨aven var anledningarna till att implementatio-nen gjordes i C++. Efter implementatioimplementatio-nen var klar unders¨okte jag modulen med utg˚angspunkt i fr˚agest¨allningarna, f¨orst med anv¨andartester och sedan p˚a egen hand genom en explorativ un-ders¨okning.
7.1.
Design av anv¨
andargr¨
anssnittet
I den tidigaste designen av anv¨andargr¨anssnittet utgick jag ifr˚an vad som f¨orv¨antades av modulen: portar f¨or att svepa i minnet f¨or in- respektive uppspelning av ljudsp˚ar. Vidare beh¨ovdes ¨aven en port f¨or ljud-output samt input f¨or linjeing˚ang (exempelvis mikrofon). F¨orst gjordes ett par skissar p˚a papper; dessa fungerade som en mall och ¨aven inspiration till hur gr¨anssnittet skulle ut-vecklas i ett ritprogram. Filtypen som VCV Rack anv¨ander till grafik ¨ar .SVG-filer, och fr˚an VCV Racks hemsida f¨oreslogs anv¨andning av programmet Inkscape [35]: ett vektorbaserat ritprogram som hanterar SVG-filer.
Det f¨orsta utkastet till design av gr¨anssnittet visas i nedan i Figur 11. Som synligt var portar, knappar och andra attribut malplacerade och detta berodde p˚a att alla attribut lades till program-matiskt i efterhand i C++: M¨ojligheten till att anv¨anda Python i Inkscape f¨or att med enkelhet placera attribut fanns, men p˚a grund av sv˚arhittad information gjordes placeringar manuellt med inmatning av x- och y-koordinater. Det f¨orsta utkastet fungerade d¨arf¨or som utg˚angspunkt till f¨orb¨attring. Notera ¨aven LOAD-knappen i Figur 11. Knappen togs bort i n¨astkommande versioner och byttes ut mot ett alternativ “Load sample“ i en h¨ogerklicksmeny f¨or att spara plats och ge modulen en mindre st¨okig look.
Den f¨orsta fungerande designen visas i Figur 12 nedan. Portar, knappar och lampor ¨ar r¨attplacerade relativt etiketterna som avser vad attributens syfte ¨ar. “READ“- och “WRITE“-portarna avser l¨asning respektive skrivning till minnet med styrsp¨anning. Under portarna finns tv˚a lampor: den ena som lyser om ett ljudsp˚ar f¨or n¨arvarande finns laddat till buffern, och den andra ifall ett ljudsp˚ar spelas just nu. Det som saknades i denna version var en port f¨or input till linjeing˚ang, men syftet med denna version var fr¨amst att kunna till¨ampa “READ“-porten f¨or att senare bygga ut funk-tionaliteten till “WRITE“-porten. Den enda m¨ojligheten till att ladda in ett ljudsp˚ar till modulen var att h¨ogerklicka p˚a modulen f¨or att f˚a upp menyalternativet “Load sample“. N¨ar ett ljudsp˚ar blivit inladdat i minnesbuffern p˚ab¨orjades uppspelning genom att trycka p˚a “TRIGGER PLAY“-knappen eller genom inmatning av styrsp¨anning till porten “READ“. Ut¨over “OUT“-porten fanns ¨
aven ytterligare en knapp lokaliserad under etiketten “TRIGGER PLAY“: knappens syfte var att p˚ab¨orja inspelning till minnesbuffern. Knappen saknar etikett d˚a denna funktion enbart var f¨or att unders¨oka hur inspelning skulle g˚a till. Det visade sig senare att en port till mikrofon kr¨avdes. En grundfunktionalitet som k¨andes viktig att bevara i den slutgiltiga versionen var m¨ojligheten till normal upp- samt inspelning av ljudsp˚ar med knappar, samtidigt som funktionerna f¨or upp- och inspelning med styrsp¨anning skulle kvarst˚a. Vidare k¨andes den visuella ˚aterkopplingen f¨or upp-spelning alldeles grundlig med enbart lampor. Dessa problem l¨oste jag med hj¨alp tv˚a str¨ombrytare med tv˚a l¨agen (0 respektive 1), 4 l¨agesindikatorlampor, samt en sk¨arm som ritar upp v˚agformen och illustrerar var i ljudsp˚aret uppspelning sker f¨or tillf¨allet. Figur 13 nedan visar modulens nuva-rande gr¨anssnitt, med str¨ombrytarna inst¨allda p˚a upp- och inspelning med styrsp¨anning. I detta l¨age g˚ar det varken att spela in eller spela upp ljudsp˚ar med knapparna “PLAY“, eller “REC“, inte heller fungerar “STOP“-knappen. Syftet med de tv˚a str¨ombrytarna ¨ar att kunna v¨axla mellan modulens upp- och inspelningsl¨agen. Om exempelvis str¨ombrytaren f¨or “READ“/“PLAY“ i Figur 13 v¨axlas till sitt nedre l¨age g˚ar det att trycka p˚a “PLAY“-knappen f¨or att starta uppspelning av ett inladdat ljudsp˚ar med normalhastighet, “READ“-porten ¨ar d˚a avaktiverad. I detta l¨age fungerar “STOP“-knappen och stoppar p˚ag˚aende uppspelning av ljud.
Figur 11: F¨orsta de-signf¨ors¨oket
Figur 12: F¨orsta fungerande
versionen av The Buffer Figur 13: Nuvarande gr¨anssnitt
7.2.
Implementation av The Buffer i C++
Modulutvecklingen utgick ifr˚an en mall som inneh¨oll kod f¨or en simpel VCO. Den ¨overgripande strukturen f¨or alla moduler innefattar en struct som inneh˚aller enums som listar attribut tillh¨orande modulen (knappar, reglage, input/output, lampor) samt variabler. Ut¨over det finns en funktion i struct:en, process(), som ˚aberopas lika ofta som vald sample rate (44100 g˚anger per sekund som standard). Det ¨ar i process() d¨ar all kod som ber¨or modulens DSP och logik ligger. Slutligen finns ytterligare en struct, utanf¨or ModuleName, som inneh˚aller funktioner som l¨agger till de attribut som modulen best˚ar av: exempelvis knappar, reglage och lampor.
I koden nedan illustrerar jag med f¨orenklad kod (p˚a gr¨ansen till pseudokod) hur en rudiment¨ar mo-dul med tv˚a portar, och en knapp ser ut. I process() skickas signaler fr˚an en mikrofon (MIC INPUT) till en output-port (AUDIO OUTPUT) n¨ar en knapp blir aktiverad:
//structen med enums, variabler samt process-funktionen
struct ModuleName{ enum ParamIds{ PLAY_PARAM } enum InputIds{ MIC_INPUT
}
enum OutputIds { AUDIO_OUTPUT }
var variables; //All variables goes here
//configuration of parameter values (a button in this case) ModuleName() {
configParam(PLAY_PARAM, 0.0, 1.0, 0.0, "Play button"); }
//called for each sample of the chosen sample rate
void process(){
//if play button is pressed
if(params[PLAY_PARAM].value == 1.0){
//Send audio signals to output from MIC_INPUT
outputs[AUDIO_OUTPUT].value = inputs[MIC_INPUT].value }
} };
//adding the attributes to the module and binding them to the corresponding enum
struct ModuleNameWidget{ setPanel("ModuleName.SVG");
addParam(createParam<Button>(Vector("x", "y"), moduleName::PLAY_PARAM));
addInput(createInput<Port>(Vector("x", "y"), ModuleName::MIC_INPUT));
addOutput(createInput<Port>(Vector("x", "y"), ModuleName::AUDIO_OUTPUT));
}
Den del i koden av The Buffer som anv¨ands till att besvara den tredje fr˚agest¨allningen (maximal storlek p˚a minnesomr˚ade f¨or adressering med styrsp¨anning) finns i process(), den funktionen utg¨or sj¨alva k¨arnan av modulen. Av det sk¨alet slopar jag att beskriva hela koden i detalj och l¨agger ist¨allet fokus p˚a vad som sker i process(). Det ¨ar i den funktionen som modulens attribut kopplas till funktionalitet (bortsett fr˚an sk¨armen som ritar upp ljudv˚agor).
process-funktionen f¨or The Buffer best˚ar i grunden av if-satser som skapar ett logiskt fl¨ode som ¨
andras beroende p˚a hur str¨ombrytarna (“READ“/“PLAY“, “WRITE“/“REC“) ¨ar inst¨allda. Ef-tersom logiken f¨or b˚ada str¨ombrytarna ¨ar n¨astintill densamma beskriver jag enbart hur uppspelning med str¨ombrytaren inst¨alld p˚a “PLAY“ (normal uppspelning) samt “READ“ (styrsp¨anning) fun-gerar. N¨ar str¨ombrytaren ¨ar inst¨alld p˚a PLAY blir villkoren f¨or en viss if-sats sann och s¨atter en boolean, isButtonPlay, till true. Dessutom n˚as nu en n¨astlad if-sats vars syfte ¨ar att s¨atta en annan boolean, isPlaying, till true ifall “PLAY“-knappen aktiveras. N¨asta kodstycke, som utg¨ors av if-satser, kollar om uppspelning ¨ar till˚atet samt sanningsv¨ardet f¨or isButtonPlay och isPlaying: //PLAY button enabled
if(buffer != NULL && isPlaying && sampleIndex <= tot_samples){
if(sampleIndex >= 0){
outputs[AUDIO_OUTPUT].value = buffer[sampleIndex]; sampleIndex++;
} }
//To be explained in upcoming subsection //READ input enabled
else if(buffer != NULL && !isButtonPlay && inputs[READ].active){
sampleIndex = clamp( (int) (inputs[READ].value * (tot_samples * 0.1)), 0, tot_samples - 1); outputs[AUDIO_OUTPUT].value = buffer[sampleIndex];
}
//Buffer is NULL / other error
else{
isPlaying = false;
outputs[AUDIO_OUTPUT].value = 0; }
Innan ljud kan spelas upp m˚aste buffer ha allokerats med ett ljudsp˚ar. Detta ˚astadkoms genom nyttjandet av libsndfiles bibliotek [21]. F¨orst skapas ett handtag till ljudfilen varp˚a funktionen SNDFILE *sf_open(const char *path, int mode, SF_INFO *sfInfo);
anropas. Antalet bytes som beh¨ovs allokeras f¨or minnesbuffern ber¨aknas genom att multiplicera antalet frames med antalet kanaler f¨or ljudsp˚aret, vilket f˚as fr˚an sfInfo-structen. Slutligen anv¨ands funktionen
sf_count_t sf_readf_float(SNDFILE *sndfile, float *ptr, sf_count_t frames); f¨or att fylla minnesbuffern som ptr pekar p˚a, med data fr˚an sndfile.
Nu n¨ar ljudfilen ¨ar inladdat i buffern till˚ats uppspelning med “PLAY“-knappen, f¨orutsatt att sampleIndex inte ¨ar st¨orre ¨an tot samples. sampleIndex ¨ar en int som anv¨ands som indexering f¨or minnesbuffern, den f˚ar inte ¨overskrida tot samples f¨or att inte passera minnesbufferns ¨ovre gr¨ans. Om str¨ombrytaren st¨alls in p˚a “READ“ n˚as ist¨allet ‘else if‘-satsen, uppspelning med styrsp¨anning till˚ats och isButtonPlay samt isPlaying f¨orblir NULL.
7.3.
Adressera minnesadresser till styrsp¨
anning
Det f¨orsta f¨ors¨oket till att adressera minnesadresser till styrsp¨anning var att finna ett s¨att att i f¨orv¨ag koppla varje diskret v¨arde av styrsp¨anningen (32-bitars flyttal) till varje index i minnes-buffern. Efter en stunds unders¨okning kom jag fram till att det ¨ar enklare att ber¨akna ett index, sampleIndex, f¨or varje g˚ang process() ˚aberopas. sampleIndex m˚aste f¨orst begr¨ansas till att vara minst 0 och h¨ogst antal samples som ljudsp˚aret best˚ar av minus 1. Detta f¨or att inte sampleIn-dex ska g˚a utanf¨or minnesbufferns gr¨anser. F¨or att uppn˚a detta anv¨ande jag funktionen clamp som begr¨ansar ett numeriskt v¨arde mellan ett angivet intervall. Styrsp¨anningens v¨arde m˚aste ¨
aven vara minst 0.0 och h¨ogst 10.0, detta f¨or att sampleIndex enkelt ska ber¨aknas genom att multiplicera det totala antalet samples f¨or sp˚aret (tot samples), med 0.1 och sedan multiplicera produkten med styrsp¨anningen CV (Kallas inputs[READ].value i koden). Om exempelvis 10 volt matas in, och ljudsp˚aret ¨ar 1 sekund l˚angt med en sample rate p˚a 44,1 kHz, kommer produkten bli CV · tot samples · 0.1 = 441000 · 0.1 · 10.0 = 441000. sampleIndex kommer d˚a allts˚a anta v¨ardet 44999, vilket i detta fall ¨ar minnesbufferns ¨ovre gr¨ans. Alla andra v¨arden p˚a CV kommer resultera i att sampleIndex antar v¨arden mellan 0 till 44999, vilket uppn˚ar m˚alet f¨or adressering. Nedan visar jag kodstycket (‘else if‘-satsen i koden ovanf¨or) som utf¨or ber¨akningen f¨or adresseringen: // int clamp(value, min, max)
sampleIndex = clamp( (int) (inputs[READ].value * (tot_samples * 0.1)), 0, tot_samples - 1); outputs[AUDIO_OUTPUT].value = buffer[sampleIndex];
Ett intressant fenomen som uppst˚ar vid adressering p˚a det h¨ar s¨attet ¨ar aliasing-artefakter [23], [24]. Eftersom uppspelning sker genom att ett index ber¨aknas f¨or n¨asta sample, s˚a kan uppspelning p˚ab¨orjas var som helst i ljudv˚agen. Det h¨ar ger upphov till klickande/sprakande ljud, n¨astan som radiobrus. Med andra ord s˚a ¨andras ljudsp˚arets samplingsfrekvens (sample rate) med utg˚angspunkt i den ursprungliga samplingsfrekvensen.
7.4.
Storlek av minnesomr˚
ade vid adressering av styrsp¨
anning
F¨or att finna en minnesstorlek p˚a ljudbuffern som m¨ojligg¨or svepning med styrsp¨anning per frame utf¨orde jag en explorativ unders¨okning. F¨orst kollade jag hur styrsp¨anningen ¨ar representerad i VCV Rack, vilket jag gjorde genom att l¨asa dokumentationen f¨or getVoltage [34], som ¨ar en get-funktion som returnerar sp¨anningen som ett flyttal. Ett flyttal ¨ar vanligtvis 32 bitar stor, men f¨or att bekr¨afta detta anv¨ande jag sizeof -operatorn som mycket riktigt returnerade 4 bytes (32 bitar). Mantissan f¨or 32-bitars flyttal ¨ar 23 bitar stor, med en implicit ledande bit som alltid ¨ar 1 [29]. Vid f¨orsta anblick t¨ankte jag att flyttal med en mantissa p˚a totalt 24 bitar (implicit bit medr¨aknad) borde till˚ata 224= (16777216) olika v¨arden, men, ett 32-bitars flyttal kan anta betydligt fler v¨arden eftersom f¨or varje bit-kombination i exponenten kan mantissan anta 223 v¨arden. Exponenten som ¨
ar 8 bitar stor ger totalt 28− 1 = 255 m¨ojliga v¨arden; om alla bitar ¨ar 1 tolkas flyttalet som NaN (Not a Number) eller o¨andligheten, d¨arf¨or finns 255 v¨arden och inte 256. Det inneb¨ar att det totalt finns 223·255 = 2139095040 distinkta positiva flyttalsv¨arden, medr¨aknat alla subnormala tal. De sp¨anningsv¨arden som modulen st¨odjer ¨ar 0 till 10 volt. Detta betyder att antalet frames ska vara lika som antalet distinkta v¨arden av styrsp¨anning som finns mellan 0 till 10.0, eftersom varje v¨arde kopplar d˚a mot en frame i ljudsp˚aret. Om detta ska fungera utifr˚an de begr¨ansningar jag angivit f¨or fr˚agest¨allningen kr¨aver det att en modul fr˚an VCV Rack ska kunna generera alla flyt-talsv¨arden inom intervallet [0, 10] volt. Det kr¨aver dessutom att varje flyttalsv¨arde ¨ar associerad till en minnesadress, vilken min implementation dessv¨arre inte uppn˚ar. Det ¨ar d¨aremot av intresse att finna den teoretiskt st¨orsta gr¨ansen eftersom jag anv¨ander utr¨akningarna i det slutgiltiga svaret till min fr˚agest¨allning.
Jag har delat upp summeringen av alla v¨arden i 4 intervall eftersom det ¨ar vid intervallens ¨ovre gr¨ans som exponenten ¨okar med 1 bit-v¨arde, vilket underl¨attar summeringen. F¨or intervallet [0, 2.0) finns 223· 27= 8388608 · 128 = 1073741824 v¨arden. Figur 14 nedan visar p˚a hur bitm¨onstret ser ut ett v¨arde ifr˚an 2.0, och d¨ar 27 (0 inkluderat) exponentbitar har anv¨ants [36]. D¨arefter f¨oljer betydligt f¨arre v¨arden: Mellan [2.0, 4.0) finns 223 = 8388608 olika flyttal; mellan [4.0, 8.0) finns 223 = 8388608; mellan [8.0, 10.0] finns 221+ 1 = 2097153. Detta summerar totalt ihop till 1073741824 + 8388608 + 8388608 + 2097153 = 1092616193 distinkta flyttalsv¨arden f¨or intervallet [0, 10.0].
Figur 14: IEEE-754 Floating point converter
Om antalet frames f¨or ljudsp˚aret ¨ar 1 092 616 193 s˚a betyder det att storleken p˚a minnesbuf-fern nu kan r¨aknas ut: om vi antar en sample rate p˚a 44100 Hz, 16-bitars bit depth samt att tv˚a kanaler anv¨ands (stereo), f˚ar vi fram storleken enligt f¨oljande:
Vi vet att varje frame best˚ar av 4 bytes (2 st. 16-bitars samples). Eftersom hela ljudsp˚aret best˚ar av 1 092 616 193 frames inneb¨ar det att den maximala storleken p˚a buffern f˚ar vara 1092616193 · 4 = 4 370 464 772 B = 4,37 GB. Minnesbuffern kan allts˚a totalt inneh˚alla ljudsp˚ar p˚a 4,37 gigabyte. I tanken kan detta fungera; varje distinkt styrsp¨anningsv¨arde associeras med en distinkt adress. Men utifr˚an fr˚agest¨allningens begr¨ansningar och min implementation ¨ar detta inte m¨ojligt: den st¨orsta
till˚atna storleken f¨or ljudfil ¨ar 4 GB (Wav-formatet), och min styrsp¨anningsadressering ¨ar linj¨ar. Eftersom flyttalen ¨ar n¨ast intill logaritmiskt utspridda, och adresseringen ber¨aknas med formeln sampleIndex = CV · tot samples · 0.1 s˚a kommer aldrig alla v¨arden inom [0, 10] att anv¨andas. F¨or att ge ett svar p˚a fr˚agest¨allningen som st¨ammer ¨overens med min implementation s˚a t¨anker jag besvara fr˚agan med utg˚angspunkt i att uppn˚a den minsta m¨ojliga linj¨ara ¨okningen av styrsp¨anning genom intervallet [0, 10].
Eftersom intervallet [0, 2.0] inneh˚aller flest v¨arden av de 4 intervallen, totalt 1 073 741 825 v¨arden, betyder det att en ¨okning (differensen) med 1 bit ¨ar decimalt mindre ¨an om samma procedur hade gjorts f¨or intervallet med minst v¨arden ([8.0, 10.0]) d¨ar 2 097 153 v¨arden finns. D¨arf¨or m˚aste den minsta linj¨ara ¨okningen som kan ske genom [0, 10.0] vara samma som den minsta m¨ojliga ¨
okningen inom intervallet [8.0, 10.0]: Med exponentbiten satt till 23 = 8 och mantissans f¨orsta bit satt till 1 blir den ¨okningen lika med S = 8 · 2−23 = 9.5367431640625 · 10−7. P˚a samma s¨att som innan ber¨aknar jag storleken p˚a buffern genom antalet frames multiplicerat med 4 bytes (2 st. 16-bitars samples), antalet frames f˚ar jag genom att dela 10 (max f¨or styrsp¨anning) med S :
10
9.5367431640625·10−7 = 10485760 frames.
10485760·4 = 41943040 B. Allts˚a, f¨or att uppn˚a konsekutiv svepning ¨over varje frame i ett ljudsp˚ar med 2 kanaler (stereo) med min linj¨ara styrsp¨anningsadressering kan maximalt ett minnesomr˚ade p˚a 41 943 040 Bytes (41,94 MB = ungef¨ar 4 minuters ljudsp˚ar med 16-bitars bit depth) adresseras.
7.5.
Samband mellan insp¨
anning och ljud-output
Eftersom modulens styrsp¨anningsadressering ¨ar deterministisk, dvs. att varje insp¨anning fr˚an 0 till 10 volt har ett best¨amt resultat i utsp¨anningen, b¨or det finnas ett samband mellan insp¨anning och utsp¨anning. Och eftersom experimentet ber¨or de praktiska till¨ampningarna av modulen g˚ar jag inte in p˚a matematiska detaljer, utan begr¨ansar mig till att beskriva n˚agra samband mellan insp¨anning och ljud-output samt hur dessa anv¨ands praktiskt. Det finns n¨astintill o¨andligt m˚anga olika v˚agformer, varf¨or jag begr¨ansar mig till att utforska samband mellan konstant insp¨anning samt 4 grundl¨aggande v˚agformer: s˚agtandsv˚ag, triangelv˚ag, fyrkantsv˚ag och sinusv˚ag. Jag be-skriver ¨aven n˚agra anv¨andbara praktiska till¨ampningar och samband vid ¨overlagring av multipla v˚agformer och insp¨anningsv¨arden.
7.5..1 Direkta samband - 4 v˚agformer + konstant sp¨anning
Det enklaste sambandet g˚ar att finna vid inmatning av en konstant sp¨anning: Samma index i ljudbuffern kommer att spelas upp, detta ger d¨aremot inte n˚agot h¨orbart resultat d˚a det kr¨avs f¨or¨andring av samplad amplitud f¨or att ljud ska skapas. Vid praktiska till¨ampningar av modulen ¨
ar detta enkla samband dock anv¨andbart: med en konstant sp¨anning kan man f¨orflytta uppspelning-spekaren till en specifik plats i ljudsp˚aret f¨or att styra var man vill att uppspelning ska p˚ab¨orjas. D¨arf¨or b¨or en konstant sp¨anning i sammanhang av The Buffer ses som ett ’attribut’ som v¨aljer utg˚angspunkt f¨or uppspelning. En enkel attenuator [37] med offset-funktion kan anv¨andas h¨ar f¨or att generera en konstant sp¨anning vars v¨arde g˚ar att modulera antingen med reglage eller extern styrsp¨anning.
Om ist¨allet en s˚agtandsv˚ag matas in (se fig. 15 nedan), med l¨agsta v¨arde 0 V och h¨ogsta v¨arde 10 V, kommer ljudet spelas upp loopandes fr˚an start till slut med konstant hastighet, vars upp-spelningsfrekvens beror p˚a lutningen (derivatan) av s˚agtandsv˚agen. Notera att n¨ar v˚agen n˚att sin maxh¨ojd (10 V) f¨orflyttas uppspelningspekaren till index 0 i ljudbuffern i detta exempel. Inverteras v˚agen och lutningen blir negativ loopas ljudsp˚aret ist¨allet bakl¨anges, fr˚an slut till start.
Figur 15: S˚agtandsv˚ag
En s˚agtandsv˚ag i modulens sammanhang b¨or ses som ett attribut som spelar upp ett ljudsp˚ar med konstant hastighet. Om vi ¨andrar v˚agens h¨ogsta v¨arde (10 V) och minsta v¨arde (0 V) kan vi spela upp korta sekvenser av ljudsp˚aret. I Fig 16 nedan kan vi se olika variationer av s˚agtandsv˚agor som p˚averkar det resulterande ljudet p˚a olika s¨att: Om vi antar att uppspelningen mellan punkt a och b p˚ag˚ar i hastighetsfaktorn 1 (normal hastighet), s˚a ¨ar uppspelningshastigheten 12 mellan punkt b och c, allts˚a h¨alften s˚a l˚angsam. Notera h¨ar att v˚agens topp ¨ar 5 volt vilket motsvarar uppspelning fram till exakt h¨alften av ljudsp˚aret. Fr˚an punkt c till d spelas ist¨allet hela ljudklippet upp fast med uppspelningsfaktorn 2 (dubbel hastighet). Mellan punkt d och e p˚ag˚ar tystnad. Efter punkt e skapar de sm˚a v˚agorna uppspelning av korta sekvenser tagna fr˚an ljudsp˚aret.
Figur 16: Modifierad s˚agtandsv˚ag
Sambandet vid inmatning av en triangelv˚ag (fig. 17 nedan), ¨ar n¨astan lika som med en s˚agtandsv˚ag bortsett fr˚an att en ping-pong-effekt uppn˚as: ljudsp˚aret loopas fr˚an start till slut och sedan slut till start, och s˚a vidare. Med andra ord s˚a spelas hela ljudsp˚aret upp i konstant hastighet normalt och sedan med samma hastighet bakl¨anges, och s˚a vidare.
Figur 17: Triangelv˚ag
En fyrkantsv˚ag (fig. 18 nedan) ger upphov till ett klickande ljud d˚a uppspelningspekaren f¨orflyttas mellan tv˚a konstanta v¨arden som v˚agen alternerar mellan. I figuren nedan alternerar uppspelning-spekaren mellan index 0 och sista indexet i ljudbuffern.
Om insp¨anningen inte l¨angre ¨ar linj¨ar blir det resulterande ljudet f¨orvr¨angt, detta p˚a grund av att uppspelningen i ljudbuffern inte l¨angre ¨ar konsekutiv. ¨Ar insp¨anningen en sinusv˚ag spelas
Figur 18: Fyrkantsv˚ag
ljudsp˚aret upp med en uppspelningsfrekvens som motsvarar derivatan f¨or sinusv˚agen. Att bara mata in en sinusv˚ag i modulen ger d¨aremot i praktiken enbart upphov till brus, och d¨arf¨or beh¨ovs ett l˚agpassfilter som skalar av ¨overtoner som tycks st¨ora uppspelningen. Detta g¨or att v˚agen i sm˚a drag ¨andrar form och b¨attre fungerar ihop med uppspelning med styrsp¨anning.
Figur 19: Sinusv˚ag
7.5..2 Overlagrade v˚¨ agformer samt ¨ovriga till¨ampningar
Det ¨ar i kombination, eller med andra ord ¨overlagring, med multipla v˚agformer som modulens anv¨andbarhet och kreativa potential blir tydligare. F¨or att ¨overlagra multipla insp¨anningar kan en enkel mixer anv¨andas; alla insp¨anningar adderas och skickas till output-porten sedan vidare till The Buffers “READ“-port
Den enligt mig mest anv¨andbara till¨ampningen jag funnit ¨ar n¨ar modulen anv¨ands ihop med en sequencer i kombination med en linj¨art stigande/sjunkande ramp (s˚agtandsv˚ag eller triangelv˚ag). Den linj¨ara rampen fungerar som “uppspelningsmotor“; den driver ljudet ˚at en riktning i konstant hastighet, medan sequencern agerar “teleport¨or“; med sina konstanta sp¨anningsl¨agen f¨orflyttar den uppspelningen av ljudet till olika tidpunkter i ljudsp˚aret. I kombination med varandra f˚as hoppan-de uppspelningar i olika tidpunkter, hoppan-detta kan anses falla inom genren glitch. Om l¨agenas speltid f¨or sequencern modifieras s˚a kan ¨aven en rytm skapas. En intressant effekt kan uppn˚as h¨ar: medan ljudsp˚aret g˚ar i ett visst tempo s˚a kan sequencern f¨orflytta uppspelningspekaren i ett annat tempo; n˚agot som ut¨over f¨or¨andring till oigenk¨annlighet kan ge illusionen av att ljudsp˚arets taktart har ¨
andrats.
Om en fyrkantsv˚ag ¨overlagras med en linj¨ar ramp fungerar den som till¨ampningen i ovanst˚aende stycke, fast med en sequencer med 2 sp¨anningsl¨agen.
Ytterligare en anv¨andbar till¨ampning som ger intressanta resultat ¨ar n¨ar en l˚angsam s˚agtandsv˚ag kombineras med en d¨ampad (liten amplitud), snabbare oscillerande s˚agtandsv˚ag som spelar upp sm˚a “korn“ av ljudsp˚aret. Detta emulerar timestrech-granul¨arsyntes [38]; en typ av ljudsyntes d¨ar “korn/bitar“ av ett ljud anv¨ands till att skapa nya musikaliska uttryck. Resultatet av denna ¨
overlagring ¨ar att den l˚angsamma s˚agtandsv˚agen driver ljudet fram˚at i konstant hastighet samti-digt som den snabbare s˚agtandsv˚agen f¨orflyttar uppspelningspekaren bak˚at ett antal samples. Det l˚ater ungef¨ar som en skiva som hakat upp sig p˚a ett st¨alle, fast d¨ar ljudet ¨and˚a successivt r¨or sig
fram˚at.
Den sista och lite mindre omfattande till¨ampningen jag funnit ¨ar vibrato ¨over ljudsp˚aret: Detta ˚astadkoms med en l˚angsammare s˚agtandsv˚ag (skapar normal uppspelning) med en sinusv˚ag vars amplitud ¨ar mycket liten (skapar sm˚a darrningar i ljudet). ¨Ar amplituden f¨or stor f¨or sinusv˚agen sveper uppspelningspekaren bara snabbt igenom ljudsp˚aret och “¨overr¨ostar“ s˚agtandsv˚agen.
7.6.
Utf¨
orande av anv¨
andartester
I syfte att utv¨ardera modulens anv¨andbarhet utf¨orde jag anv¨andartester p˚a frivilliga deltagare. Notera att dessa inte ¨ar utf¨orda p˚a vetenskaplig basis utan ¨ar mer av en indikation p˚a modulens anv¨andbarhet. H¨ar unders¨okte jag fr¨amst om svepning med styrsp¨anning var av estetiskt v¨arde men ¨aven om modulens gr¨anssnitt k¨andes sj¨alvf¨orklarande eller till synes konstig. Anv¨andartesten jag utf¨orde best˚ar av ett deltagarformul¨ar d¨ar deltagaren f˚ar information om vad The Buffer ¨ar och har f¨or funktioner. Sedan fick deltagaren fylla i svarsrutor f¨or 3 fr˚agor g¨allande personens erfarenhet kring musikinstrument, modul¨ara synthesizers och ljuddesign. Beroende p˚a vilken erfarenhetsgrad personen hade kunde jag d˚a hj¨alpa hen att komma ig˚ang men ¨aven f¨orst˚a hur involverad hen ¨ar i ¨
amnet. Deltagaren fick ¨aven en beskrivning p˚a testets syfte, samt hur testet utf¨ors. Syftet ¨ar fr¨amst att unders¨oka ifall svepning med styrsp¨anning i en minnesbuffer ¨ar av estetiskt och praktiskt v¨arde. Det sekund¨ara syftet ¨ar att f˚a feedback p˚a hur modulens gr¨anssnitt upplevs.
Utf¨orandet av testet g˚ar till genom att deltagare f¨orst f˚ar bekanta sig med modulen i 5 minuter, varp˚a deltagaren sedan f˚ar anv¨anda The Buffer i kombination med ett antal f¨orbest¨amda modu-ler. Detta f¨or att demonstrera och hj¨alpa deltagaren att anv¨anda modulen p˚a s¨att som jag funnit anv¨andbara. Efter deltagaren f˚att experimentera lite med modulerna och olika ljud s˚a f¨oljde jag upp testet med n˚agra fr˚agor. Deltagarna fick svara p˚a om de tyckte att svepning i minnet var este-tiskt tilltalande, samt om de ans˚ag att det var av praktisk och estetisk nytta. De sista tv˚a fr˚agorna fr˚agade jag om modulens gr¨anssnitt och om det var l¨attf¨orst˚aeligt, och om de ans˚ag att modulens element som exempelvis knappar, portar (input/output) var v¨alplacerade och v¨alutformade.
7.7.
Resultat av anv¨
andartester
Av de totalt 8 deltagarna var de 2 som inte hade n˚agra tidigare musikaliska erfarenheter. Jag valde fr¨amst personer som hade h˚allit p˚a med musik tidigare p˚a grund av den h¨oga inl¨arningskurvan f¨or modul¨arsyntes. Musiker har ocks˚a l¨attare att se det estetiska och praktiska v¨ardet i modulen eftersom de har erfarenhet i att skapa musik och s¨atta samman musikaliska komponenter. Nedan f¨oljer stapeldiagram av svaren p˚a mina f¨oljdfr˚agor jag st¨allde deltagarna efter anv¨andartesten var klara; deltagarna fick fylla i den grad de inst¨ammer till p˚ast˚aendena. De tre f¨orsta diagrammen handlar om styrsp¨anningsadressering och de tre sista om gr¨anssnittet:
8.
Diskussion
8.1.
Svepa med styrsp¨
anning i minnesbuffer
Fr˚an en b¨orjan, innan jag implementerade The Buffer, t¨ankte jag att svepning med styrsp¨anning i en minnesbuffer skulle l˚ata oerh¨ort icke-estetiskt och ¨aven sv˚art att styra f¨or att f˚a ¨onskad effekt. Mina f¨oraningar br¨ots efter att min handledare kopplade ihop n˚agra moduler till The Buffer: han hade skapat en remix av Around the world av Daft Punk, och simulerat granul¨ar ljudsyntes (syntes d¨ar sm˚a ’korn/segment’ av ljudklipp anv¨ands att skapa ljud). Det gjorde han genom att ¨overlagra en l˚angsamt stigande linj¨ar ramp (denna ansvarar f¨or ljudklippets normala uppspelning) med en snabbare s˚agtandsv˚ag som gjorde att sm˚a korn av ljudklippet spelades upp medan den snabbare v˚agen oscillerade. I den sista bilagan i dokumentet finns ett exempel av denna remix av The Buffer, samt en l¨ank till originalet.
Den enda musikaliska till¨ampningen jag funnit som i teorin kan simulera svepning i minnet ¨ar The Slidepipe [30]. Om plattorna s¨atts s˚a n¨ara varandra att loopen sker ¨over 1 sample s˚a skulle kanske det l˚ata ungef¨ar som styrsp¨anningssvepning. The Slidepipe anv¨ander d¨aremot inte styr-sp¨anning och dess avsedda bruk g¨or troligtvis att denna simulering inte fungerar i praktiken.
8.2.
Adressering av minne till styrsp¨
anning samt maximalt adresserbart
minnesomr˚
ade
S¨attet jag f¨orst ville adressera styrsp¨anning till minnesadresser var genom att associera varje di-stinkt flyttalsv¨arde mellan intervallet [0, 10.0] till en minnesadress. Detta ins˚ag jag dels vara sv˚art att implementera, och ¨aven opraktiskt eftersom buffern hade beh¨ovt vara ¨over 4 GB stor vilket hade gjort uppspelning med styrsp¨anning sv˚arkontrollerat: en liten f¨or¨andring i styrsp¨anningen hade orsakat stora hopp i uppspelningen. Resultatet blev att jag implementerade en relativt enkel linj¨ar adressering som beroende p˚a storlek av ljudsp˚aret adresserar fler styrsp¨anningsv¨arden till minnesplatser om ljudklippet ¨ar stort, och f¨arre om det ¨ar litet. Min implementation gjorde att jag var tvungen att begr¨ansa min fr˚agest¨allning ytterligare genom att minska omf˚anget -10 till +10 volt, till 0 till +10 volt. Minnesomr˚adet jag kom fram till var 41 943 040 B (41,94 MB) och f¨or att bekr¨afta i praktiken i VCV Rack att detta fungerar skrev jag en if-sats efter att samplesIndex ber¨aknats som kollar ifall det f¨oreg˚aende indexet ¨ar lika med sampleIndex - 2 (eftersom sampleIn-dex b¨or ¨oka med 2 efter varje ber¨akning). Ett till synes udda problem uppstod f¨orst: avrundningsfel vid multiplikation av inputs[READ].value · (tot samples · 0.1) fast¨an mitt testprogram utf¨orde alla index-ber¨akningar felfritt med samma v¨arden. Avrundningsfel sker n¨ar flyttal inte har nog med minne f¨or att lagra hela v¨ardet, och jag l¨oste detta genom att i f¨orv¨ag ber¨akna (tot samples · 0.1) och l¨agga produkten i en enskild variabel.
En viktig aspekt att notera ¨ar att mitt svar p˚a den tredje fr˚agest¨allningen ¨ar det maximalt st¨orsta minnesomr˚ade enligt min implemention. Hade jag inte begr¨ansat fr˚agest¨allningen hade jag beh¨ovt implementera en icke-linj¨ar styrsp¨anningsadressering, och d˚a hade mitt f¨orsta resultat, 4,37 GB, troligtvis varit svaret p˚a fr˚agest¨allningen. Det kan ¨aven finnas flera s¨att att adressera styrsp¨anning till minnesadresser som resulterar i andra storlekar p˚a buffern.
8.3.
Anv¨
andartester
Ang˚aende minnessvepningens anv¨andbarhet och nytta pekar resultaten i diagrammen p˚a att fler finner estetisk och praktisk nytta ¨an att det l˚ater tilltalande. En deltagaren inst¨amde i l˚ag grad att minnessvepning l˚ater estetiskt tilltalande, samma som inst¨amde delvis ang˚aende den estetiska och praktiska nyttan. En trolig orsak till detta ¨ar att deltagaren inte hade musikaliska erfarenheter och d¨arf¨or hade sv˚art f¨or att s¨atta modulens ljud i perspektiv. Musiksmak var n˚agot jag inte tog h¨ansyn till i anv¨andartesten och detta kan ha p˚averkat resultaten; n˚agon som k¨anner avsmak f¨or elektronisk musik kan ha sv˚arare f¨or att uppskatta modulen, medan n˚agon som ¨alskar genren glitch troligtvis finner st¨orre v¨arde i modulen.
Gr¨anssnittet hade de flesta av deltagarna inget problem med att f¨orst˚a. Vid f¨orsta anblick tyckte d¨aremot fyra deltagare att gr¨anssnittet var sv˚arf¨orst˚aeligt. Ingen av deltagarna hade tidigare arbe-tat med modul¨arsyntes och d¨arf¨or kan moduler ge skenet av att vara komplexa och sv˚arf¨orst˚adda. Efter att jag introducerade deltagarna tyckte de flesta att gr¨anssnittet var l¨att att f¨orst˚a, och i j¨amf¨orelse med Tyme Sefari MKII [6] har The Buffer ett mycket enklare gr¨anssnitt och f¨arre antal funktioner vilket g¨or modulen l¨att att anv¨anda. Tv˚a av deltagarna undrade varf¨or portarna “RE-AD“ och “WRITE“ hette just “RE“RE-AD“ och “WRITE“, och tv˚a tyckte f¨orst att switch-knapparnas funktion var sv˚arf¨orst˚adda, n˚agot som speglas i resultatet i det sista stapeldiagrammet. P˚a samma s¨att som i stycket ovanf¨or har deltagarnas erfarenheter en signifikant betydelse i hur gr¨anssnittet uppfattas, n˚agot som ocks˚a kan ha p˚averkat resultatet.
En deltagare sa att modulen liknade, eller var som en f¨orl¨angning, av funktioner som finns i en DAW (Digital Audio Workstation) vid namnet Reason [39]. Reason inneh˚aller ocks˚a racks, med simulerade analoga moduler, ungef¨ar som VCV Rack fast med fler funktioner. Hen fann b˚ade estetisk och praktiskt nytta av modulen, fr¨amst n¨ar man beh¨over anv¨anda ljudeffekter. Modulen fungerar d˚a bra till att ta ett ljudklipp, f¨orvr¨anga det, och sedan l¨agga det i bakgrunden f¨or att skapa en glitch-atmosf¨ar kring de andra instrumenten.
8.4.
Alternativ styrsp¨
anningsadressering och styrsp¨
anningsrepresentation
Eftersom implementationen av modulen utgick fr˚an VCV Rack, samt att VCV Rack anv¨ander flyttal som representation av styrsp¨anning, begr¨ansades jag till att anv¨anda just flyttal n¨ar jag adresserar styrsp¨anning till index i minnesbuffern. Detta ¨ar inte optimalt d˚a indexering sker med heltal, vilket kr¨aver att flyttalen m˚aste f¨orst omvandlas till heltal; antingen genom avrundning upp˚at, ned˚at eller genom att talets decimaler trunkeras. Precisionen f¨or 32-bitars flyttal minskar ¨
aven ju l¨angre bort fr˚an 0 flyttalet ¨ar, vilket vidare bidrar till avrundningsfel. Dessutom, eftersom antalet distinkta flyttalsv¨arden inte ¨ar j¨amnt f¨ordelade, g˚ar det inte att dra nytta av alla v¨arden med min implementation, om ens med n˚agon annan implementation. Det kr¨aver i s˚a fall att en linj¨ar och j¨amnt f¨ordelad m¨angd ska mappas till en icke-linj¨ar och icke-j¨amnt f¨ordelad m¨angd. D¨arf¨or skulle styrsp¨anningen mer l¨ampligt representeras med heltal eller fixed-point med avseende p˚a antal anv¨andbara v¨arden, samt enkelhet (d˚a beh¨ovs ingen omvandling eftersom b˚ada typer-na kan anv¨andas vid indexering). Variabler av typen fixed-point ¨ar i grunden heltal [40], med skillnaden att ett antal bitar v¨aljs ut till att representera decimaler. Men eftersom C++ inte har n˚agot inbyggd bibliotek f¨or fixed-point s˚a t¨anker jag mig att styrsp¨anningen enklast skulle repre-senteras med heltal. 32-bitars heltal (32-bit signed int) kan anta alla v¨arden mellan −2147483648 till 2147483647 [41]. D˚a skulle f¨orslagsvis styrsp¨anningen kunna g˚a mellan −1000000000 volt till +1000000000 volt (avrundat till n¨armaste 1-miljard-tal). Anledningen till just detta intervall ¨ar att det skulle fungera bra ihop med min implementation; alla positiva v¨arden skulle d˚a kunna anv¨andas med min modul ifall minnesbuffern var 1 000 000 000 samples stor (cirka 4 GB). Formeln sampleIndex = CV ·tot samples·0.1 som ber¨aknar index f¨or minnesbuffern beh¨over juste-ras f¨or att fungera ihop med den nya styrsp¨anningsrepresentationen. Eftersom de styrsp¨anningsv¨arden som The Buffer st¨odjer just nu g˚ar fr˚an 0 till 10 volt, skulle formeln beh¨ova ¨andras s˚a att tot samples·0.1 blir 1. Om minnesbufferns storlek ¨ar fast kan formeln ¨aven f¨orenklas till sampleIndex = CV , clamp-funktionen beh¨ovs ocks˚a h¨ar s˚a modulen inte f˚ar runtime-fel och anv¨ander index ut-anf¨or minnesbufferns gr¨anser. Detta minimerar antalet ber¨akningar som kr¨avs och g¨or att styr-sp¨anningen, ut¨over clamp-funktionen, kan anv¨andas direkt som index till minnesbuffern.