• No results found

The Buffer - direktåtkomst av minnesbuffer för ljudspår

N/A
N/A
Protected

Academic year: 2021

Share "The Buffer - direktåtkomst av minnesbuffer för ljudspår"

Copied!
38
0
0

Loading.... (view fulltext now)

Full text

(1)

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

alardalens H¨

ogskola, V¨

aster˚

as, Sverige

Handledare: Rikard Lindell

alardalens H¨

ogskola, V¨

aster˚

as, Sverige

(2)

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.

(3)

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

(4)

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.

(5)

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.

(6)

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.

(7)

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.

(8)

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

(9)

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:

(10)

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.

(11)

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 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.

(12)

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.

(13)

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.

(14)

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.

(15)

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.

(16)

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 ¨

(17)

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.

(18)

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

(19)

}

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++;

} }

(20)

//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.

(21)

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 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

(22)

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.

(23)

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

(24)

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

(25)

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:

(26)
(27)
(28)

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.

(29)

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.

References

Related documents

The total settling time of the selected filter is required to generate the first conversion after the gain change; subsequent conversions occur at the selected update

Page 7, 2 nd paragraph, “The concentrations of Cr, Cu, Ni and Zn in sediment were higher than the severe effect level of GPMAS (1993) (Table 5).” The sentence should read ”

Inför hösten 2014 har vi en akut situation på Västra skolan. Prognosen säger att ca 140 barn kommer att vara inskrivna på fritids. Lokalerna är i dagsläget inte anpassade till

Kommunstyrelsens arbetsutskott gav förvaltningen i uppdrag att, i dialog med tekniska nämnden och Vara Koncern AB, arbeta fram koncerngemensamma riktlinjer för försäljning av

ÅTGÄRDER SOM BEHÖVS FÖR ATT BYGGA JÄRNVÄGEN OCH SOM FASTSTÄLLS OCH INGÅR I NY JÄRNVÄGSMARK SKYLDIGHETEN ATT GÖRA ANMÄLAN FÖR SAMRÅD ENLIGT 12:6 MB GÄLLER INTE FÖR

ida_itemname plottime ida_username. ida_itemname

Horisontal skala 1 : 1000 DATUM RITNINGSNUMMER FÖRVALTNING BLAD NÄSTA BLAD ÄNDR.

Detta betyder att frågan om den politiska maktens struktur, till exempel om den ska ha formen av en monarki eller en republik eller vilken konkret politik (reformpolitik) som