FPGA-baserad synth

Berätta om dina pågående projekt.
overclocked
Inlägg: 71
Blev medlem: 13 juni 2006, 21:34:24
Ort: Gävle

Re: FPGA-baserad synth

Inlägg av overclocked »

Yo lite feedback på hur långt jag kommit:

1) Hittade en extra MIDI-kabel så nu kan jag Routa MIDI:n från mitt keyboard via datorn först och sen ut till SKSynth
2) Hämtade hem MCC för att kunna styra parametrarna via det. Eftersom det programmet är fristående så krävs ju att man släpper porten från Cubase imellan, är det så du gör? Själv installerade jag MIDI-OX och MIDI-Yoke vilket gör att man kan ha båda igång samtidigt. Riktigt trevligt. Tyvärr fungerande ENDAST Pitchbend idag vet inte varför. Jag valde Base64-configen och inget annan slider gjorde nånting åt ljudet skumt nog.. Jag ser att den skickar MIDI-commands för t.ex. ADSR, men inget händer i SKSynth.. Har du en Config som funkar så tar jag gärna den som input så den felkällan försvinner.. men det är troligen nåt helt annat.

Jag ändrade en rad i sk_synth.vhdl:

Kod: Markera allt

when s5 =>
     output_i <= std_logic_vector(signed(output_i) + mix_mul_res + X"800000");
men trots detta så distar synthen fortfarande, har jag gjort rätt ändring för att flytta upp output till mitten av 24-bitar området? Blir lite förvirrande med Square som den kör default. Jag ska bygga om en variant som både har endast 8 röster och defaultar till Sinus. Då syns det nog bättre vad waveform problemen ligger..
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: FPGA-baserad synth

Inlägg av stekern »

Ändringen du gjort adderar (2^24)/2 på varje röst, jag skulle ha adderat på outputen i top modulen.
Men om du vill göra ändringen där så gör den såhär:

Kod: Markera allt

...
if i = NUM_VOICES then
	i := 0;
	output_i <= X"000000";
	output <= output_i + X"800000";
else
... 
Min MCC setup ligger nu här: http://www.sk-electronics.com/sk-synth/SK-Synth.set
Jag använder också MIDI-Yoke för att få både Sonar och MCC att fungera samtidigt.

Angående linjäriteten på ADSRen, jag vet, jag har fuskat där. :D
Men (jag tycker) det funkar tillräckligt bra som det är, så det får vara så tills mer pressande saker är fixade
overclocked
Inlägg: 71
Blev medlem: 13 juni 2006, 21:34:24
Ort: Gävle

Re: FPGA-baserad synth

Inlägg av overclocked »

Tack för råden då ska jag försöka bygga om den ikväll så kanske Disten försvinner till slut..

Ett otroligt fint optimerings-jobb du gjort Stekern!
Lite intressant data efter att jag gjort Update via SVN och lekt litegrann, gjort Synthesize till min Spartan-3E 1600E:

16-röster:
Number of Slices 3303/14752 22%
Max Freq: 60Mhz

128-röster:
Number of Slices: 14'307/14'752 96%
Max Freq: 52Mhz

Nu vet inte jag om hela konstruktionen skalar med ändå upp till 128 röster eller om ISE optimerar bort saker som inte är generellt skrivna, men annars är det ju smått otroligt vad du fått plats med!

Hur sjutton fungerar SIN-tabellen nu? 7/36 BRAM använda för 128-röster? Betyder det att den nu är implementerad i Distributed RAM eller vad? Jag fattar inte riktigt.. :-)
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: FPGA-baserad synth

Inlägg av stekern »

Det borde bara bli ett ROM av SIN-tabellen oberoende av röster, men det kanske är som du säger att de är utspridda i distributed ram då.
Du kan ju kolla i Design Summary under Advanced HDL Synthesis vad den säger där om du är nyfiken.
Jag har upptäckt en liten bugg, outputen från filtret ligger inte på noll utan på miniminivån när man drar ner cut-off frekvensen till minimi.
Jag håller som bäst på och undersöker detta nu.
overclocked
Inlägg: 71
Blev medlem: 13 juni 2006, 21:34:24
Ort: Gävle

Re: FPGA-baserad synth

Inlägg av overclocked »

Ett meddelande som jag får i 11.2:an ang. filter. Kanske inte är din bugg men jag skickar vidare..

Xst:1610 - "C:/FPGA/SK-Synth/vhdl/Biquad_IIR_filter.vhdl" line 101: Width mismatch. <y0_i> has a width of 48 bits but assigned expression is 49-bit wide.

Ska kolla vidare, om jag inte missminner mig så implementerades SIN-minnet varken av DistRAM eller BRAM utan logik. Detta kan ju rent av vara ett fördel.. Jag ska kolla vidare.
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: FPGA-baserad synth

Inlägg av stekern »

Jo jag vet om den grejen, det är redan fixat i mitt "working" directory, gör ingen praktisk skillnad dock.
Buggen är snarare en egenskap av filtret.
En konstant DC-signal med cut-off frekvensen till filtret satt till 0 genererar alltid en 0'a oavsett DC-signalens ursprungliga signalnivå.
Detta trasslar givetvis till det när filtret förväntar sig endast positiva tal (unsigned).
Botemedlet torde vara att konstruera om filtret så det hanterar även negativa tal (signed)
overclocked
Inlägg: 71
Blev medlem: 13 juni 2006, 21:34:24
Ort: Gävle

Re: FPGA-baserad synth

Inlägg av overclocked »

OK.

Jag har provat lite mer! Roligt att greja med musik och elektronik samtidigt som är mina två stora hobbyintressen! Nu böjar det ju låta bra också sedan jag fixade bort disteffekterna! Ditt råd med att flytta additionen till toppnivån funkade great! Rent ljud nu, låter skitbra trots sk. SpaceInvaders-ljud. PWM direkt ut på FPGA-pinnen med ett enkelt RC-nät som lågpass.

Hela kedjan av verktyg funkar också bra... jag kör alltså:

Hårdvara:
  • Spartan3E 1600-kortet + ArcadeExtender (egetutvecklat extension-kort "passande" flertalet Spartan-3-kort)
    Standard PC maskin
    Min gamla Kawai K4
    TASCAM USB-MIDI-in/out
Mjukvara:
  • Windows Vista
    ISE 11.2 + Impact för programmeringen
    Cubase Lite Sequencer
    MCC som soft-MIDI-controller
    MIDI-Yoke+MIDI-OX för MIDI-Routing
Angående problem med visst antal stämmor:
Felet "kom tillbaka" när jag började undersöka det mer. Det är ENDAST 2 stämmor som inte kan byggas i ISE 11.2. Den bryter med ett Webcase, dvs. kan bero på en intern bugg i miljön och felet är i min miljö:

Kod: Markera allt

FATAL_ERROR:Xst:xstmacronode.c:108:1.29.2.4 - Invalid In Port Name : D from filter_0_voicenr, index==-1  Process will terminate. For technical support on this issue, please open a WebCase with this project attached at http://www.xilinx.com/support.

Process "Synthesis" failed
Två funktioner som jag tycker saknas i det där verktyget MCC är att kunna sätta kanalen för sig (alltså att snabbt kunna byta vilken MIDI-kanal alla kontroller går emot) och att den borde ju SÄNDA de inställningar som finns satta när man laddar ett visst ljud... det gör den väl inte? Så om man som jag använder MCC både för din SKSynth-setting men även för att "spara" ett favoritljud för tillfället så måste jag ändå "röra" på alla spakar för att få tillbaka ljudet! GRR.. Man ska väl köra ännu ett program för att kunna ha Preset-hantering då eller? Lite dumt!

Angående att köra godtycklig klocka på SK-Synth:
Detta funkar men ger då vissa effekter som iofs är ganska självklara. Både synthens frekvens blir högre och ADSR kurvorna ändrar sin timing. Detta kanske är det beteende man vill ha eftersom annars skulle det väl krävas mer logik bara för att kunna dela ner än högre klocka mer.. det är i alla fall så det ser ut nu.

Så från och med nu kör jag med en DCM insatt i mellan som delar ned min 50Mhz till 16Mhz så får vi samma basklocka och slipper det problemet. Då funkar allt skitbra och jag slipper dra ner K4:ans Transpose till -12 och fortfarande tycka att tonerna känns för ljusa.. ;-)

Angående att köra godtyckligt antal kanaler på SK-Synth:
Detta fungerar så långt som att bygga, men t.ex. 16-kanals versionen som jag labbar med till och från är inte lika stabil/fungerande som 8-kanals versionen. Toner hänger sig kvar och om man leker med MCC så börjar det snart låta som.. ja brus! Så det finns redan en enkel brusfunktion.. :-) Kanske är några register som inte mappas på rätt sätt för delar över 8 kanaler.. jag ska ta mig en titt på få se.. När man gör samma övning i 8-kanalers versionen funkar det bra och stabilt.

Orsaken att jag labbar med >8 kanaler är att om man ställer upp Release för Filter och Amp så tar snabbt dessa 8-kanaler slut när man sitter och jammar och då mutas tonerna så klart. Coolt att genom att sätta rätt värden på Release-värden (både Filter och Amp) så har man i stort sett ett simpelt Reverb men den äter kanaler!!

Annat smått och gott
Nåt som skulle vara coolt skulle vara om varje MINI-kanal hade egna settings för ljudet, då kunde ju synthen bli ännu mer användbar. Sätt att basljud på MIDI-kanal 1 och ett skönt Pad-ljud på MIDI-kanal 2. Har du tänkt något på det? För att det ska bli riktigt användbart bör ju Voices

Ännu en fråga kring ADSR-hanteringen, har ska jag ställa ADSR-värdena för att tonen ska sluta låta innan jag släpper knappen.. det verkar ju inte gå nu eller? Det borde vara möjligt.

Jag labbar vidare och rapporterar eftersom.. som du säkert märkt! Fortsätt jobba med denna fantastiska konstruktion! När jag fått ordning på en 16-kanalers version som fungerar så ska jag lägga upp ett nytt jam-demo och några bilder på grejorna jag använder om nån är intresserad.

PS: Är det ingen annan som aktivt sitter och labbar med detta? Det borde ni göra, det är ju hur kul som helst! Gäller ju dock att ha lite tid... DS
overclocked
Inlägg: 71
Blev medlem: 13 juni 2006, 21:34:24
Ort: Gävle

Re: FPGA-baserad synth

Inlägg av overclocked »

Toner hänger sig kvar och om man leker med MCC så börjar det snart låta som.. ja brus! Så det finns redan en enkel brusfunktion.. :-) Kanske är några register som inte mappas på rätt sätt för delar över 8 kanaler.. jag ska ta mig en titt på få se.. När man gör samma övning i 8-kanalers versionen funkar det bra och stabilt.
Efter lite mer labbande så fungerar ADS rätt OK, men filter och Release buggar ur med många kanaler. Att toner hänger sig är jag inte säker på om det endast gäller >8 kanaler..
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: FPGA-baserad synth

Inlägg av stekern »

Nu har jag fått lite ordning på filter"buggen", ny revision committad i SVNen (mycket svengelska det blir ;))

Jag kikade lite och att köra på 16MHz och 16 kanaler blir lite för tight för timingen.
Filtret har en samplingsfrekvens på 96000, sen skall det multipliceras med antalet kanaler = 1536000
Filtret behöver 13 klockcykler för att fullborda sina beräkningar men vi har bara 16e6/1536000 = 10.4 klockcykler till godo.

Som du säger så påverkas inte notfrekvensen och envelopen av inställningen av klockfrekvensen i SK-Synth_Pack (sorry jag förbisåg dessa).
Man får gå in och meka lite i perl skriptet som genererar noteromet och enveloperomet.
här finns färdiga för 50MHz
http://www.sk-electronics.com/sk-synth/noterom.vhdl
http://www.sk-electronics.com/sk-synth/ ... n-50MHz.pl
http://www.sk-electronics.com/sk-synth/enveloperom.vhdl
http://www.sk-electronics.com/sk-synth/ ... n-50MHz.pl

Angående att få tonen att sluta låta innan du släpper knappen så borde en inställning med A=0, D=ca 20, S=0 och R=0 göra susen ;)

Att få synthen multitimbral (dvs att kunna ha flera olika ljud på olika kanaler) kräver en hel del mekande, då är det nog nästan lättast att göra fler instanser av SK-Synth och mappa olika midi-kanaler till dessa.

Jag testade just att bygga en version med 2 kanaler och det var inga problem.

Att noter hänger sig har jag inte haft problem med sen jag ändrade om i midi-timingen. Det är ju möjligt att denna inställning inte är ultimat för din setup dock.

Väntar med spänning på fler jam-demos ;)
overclocked
Inlägg: 71
Blev medlem: 13 juni 2006, 21:34:24
Ort: Gävle

Re: FPGA-baserad synth

Inlägg av overclocked »

Kort nattrapport,

Tack för dina tips kring allting, speciellt kring flerkanalsproblem! Du har helt rätt!
Enligt din uträkning skulle i så fall en 16Mhz hinna med 12 kanaler, Jag byggde en sån och allt funkar perfekt! GRYMT!

Sen tog jag dina filer, byggde mig en 50Mhz version med rätt timing på allt (dina nya filer), räknade ut följande:
50Mhz / 96khz / 13 = 40,06 antal kanaler

Och tammetusen fick jag inte en HELT fungerande SKSynth med till synes 40 samtidiga ljud! Satt och jammade fett nyss med rätt lång efterklang och inte direkta problem. Ställer med Filtret och Amp-ADSR på vissa nivåer så klickar det en del och även en del brus hörs i botten (sista delen innan ljudet försvinner) men det kan nog delvis tillräknas PWM-ljudet. Har hört liknande på min egen synth.

Provade också att köra ett pianostycke av Mozart och det lät med rätt inställning helt perfekt! Vet inte hur många samtidiga ljud den behövde men med efterklang så var det troligen över 16 iallafall.

SNYGGT JOBBAT! Jag skickar några exempel-MP3 framöver!

Gonatt!
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: FPGA-baserad synth

Inlägg av stekern »

Jag har ändrat om lite så synthen nu bara lyssnar på 1 midi kanal och inte alla som innan (=ny revision i SVN).

Jag vet inte om vilken rev du kör med nu, men en stor del av klickandet åsamkades av att filtret satte utgången till 0 när ingången var på mitten av vågformen, sen när noten avbröts hoppade "linan" abrupt upp till mitten. (fixat i revision 32)

Det återstående klickandet består av att NCOerna inte är syncade till note off (till note on är de, jag har även förbättrat detta lite i senaste revision så den synkar till filtrets sampelclocka).
Att note offen inte är synkad till NCOerna medför att när en note off kommer, så kommer utnivån abrupt hoppa till 0 oberoende vad det för närvarande värdet är.
Ett sätt att rundgå detta är att dra upp amp och filter releaserna tills klicket försvinner.
Jag vet inte riktigt hur jag ska kunna lösa detta problem på ett smidigt sätt, jag måste på nåt sätt vänta ut den nuvarande vågformens period när en note off kommer.

EDIT:
En bild beskriver problemet mer än tusen ord:
Bild

EDIT2:
Det är en del klockcykler (5) utöver filtrets (13) som behöver utföras så den verkliga begränsande faktorn borde vara:
CLK/96000/18
Filtrets beräknande kan dock plockas ut ur den statemaskinen, så max teoretiska antalet kanaler utan att ändra samplingsfrekvensen på filtret fås av faktorn 13
overclocked
Inlägg: 71
Blev medlem: 13 juni 2006, 21:34:24
Ort: Gävle

Re: FPGA-baserad synth

Inlägg av overclocked »

Tack för den uppdateringen Stekern.

Har just nu en dubbel 50Mhz 16-stämmors SK-Synth (enligt din idé) där dessa bådas parametrar då självklart kan ställas helt oberoende av varann. Om jag minns rätt tog den c:a 50% av 1600E så det finns plats kvar. Hade ett tag problem med MIDI-OX/MIDI-Yoke/Cubase där jag fick problem med rundgång i MIDI-Routingen.. är det inte det ena som strular så.. :-) Så coolt att ISE fortfarande rapporterar samma MaxFreq: 78Mhz trots att man kastat in en synth till. Det beror ju mest på att ingen Congestion(förstoppning) har börjat visa sig i och med en relativt låg resursanvändning.

Provade också att bygga en trippel 16-stämmors men då rapporterade ISE ett rätt intressant fel i Place&Route-steget (tom ink. en felstavning så den visas nog inte allt för ofta):

Kod: Markera allt

ERROR:Place:665 - The design has 24 block-RAM components of which 3 block-RAM components require the adjacent multiplier
   site  to remain empty. This is because certain input pins of adjacent block-RAM and multiplier sites share routing
   ressources. In addition, the design has 36 multiplier components. Therefore, the design would require a total of 39
   multiplier sites on the device. The current device has only 36 multiplier sites.
Detta problem är rätt oviktigt och jag provade det mest för kul! Men jag tycker ISE borde kunna lösa detta genom att välja att implementera vissa av MUL's i LUT's.. Men detta kan man ju också styra själv.. Alternativt implementera några av BRAM som DistributedRAM.
Jag har dock lite idéer på hur man kan optimera detta så problemet helt försvinner.

Osså ett litet demo som jag inte är alltför stolt över.. nån egen tolkning av en gammal Jarre-låt men vafan! SKSynth ljudet kommer ifrån ovan nämnda dubbel-instans där basljudet kör på en synthen (MIDI kanal 1) och ackorden från den andra (MIDI kanal 2) och sen fuskade jag lite och la in en annat gratis VSTi-instruments trummor.. men inga effekter har används iallafall.

SKSynthJam2
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: FPGA-baserad synth

Inlägg av stekern »

Nu blir jag ju avis, vill också bygga en multitimbral version ;)

Jag kom på iden att filtret borde läggas efter amplitudenvelopet, men när jag började meka det så löpte allt amok, så jag la ner det för tillfället.
Jag vet inte varför, det borde fungera lika bra efter som före (bättre efter, eftersom då borde det räcka att sätta en liten amplitud release för att bli av med det ovan nämnda problemet med NCO-synkandet)

Hursomhelst så håller jag på och fixar så LFOn kan modulera filterfrekvensen och amplituden.

Sen har jag kollat lite på VST SDK's att implementera MIDI-kontroller till synthen i, för jag irriterar mig också på att MCC saknar en "send all" knapp.
Jag kollade lite på VSTModuleArchitectureSDK, men det verkar inte som att Sonar stödjer det så jag antar att det är vst2.4 eller 3.0 som gäller då. Jag är inte nåt vidare insatt i VST-djungeln så tips är välkomna.
Det jag alltså vill göra är en VST-plugin som kan skicka diverse Control Change kommandon till synthen.
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: FPGA-baserad synth

Inlägg av stekern »

Nu har jag fixat så LFOn kan styra filterfrekvensen och amplituden.

Uträknandet av filterfrekvensen kan skötas bättre än vad jag gjort nu, men då krävs ännu fler states i "main" statemaskinen (jag vart redan nu tvungen att lägga till ett par för att få amplitudberäknandet att bli bra).
16MHz räcker inte till för fler states så jag får lägga till en DCM och multiplicera upp den om jag ska fixa detta.

lite filterLFO: http://www.sk-electronics.com/sk-synth/ ... test12.mp3
helikopter: http://www.sk-electronics.com/sk-synth/ ... test13.mp3
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: FPGA-baserad synth

Inlägg av stekern »

Det har vart tyst i den här tråden länge, men det betyder inte att projektet har stannat av, även om det gått lite på sparlåga emellanåt.

Jag har inte gjort några enorma ändringar i själva synthen förutom att dra upp klockan i 48MHz och lagt till en midi-aktivitets led.

Det jag gjort på sistonde är att meka ihop ett program för att kunna styra synthen.
Det den gör är att styra alla synthens funktioner samt spara och ladda inställningarna som xml-patchfiler.
Det är fortfarande lite finputsande kvar att göra på det, men det är fullt fungerande.

En bild säger mer än 1000 ord:
Bild

Ett grundkriterie var att programmet skulle bli så portabelt som möjligt så därför valde jag att använda Qt.
Jag har testat att det fungerar både under Linux och Windows
(det borde fungera under Mac OS X också, men eftersom jag inte har tillgång till det har jag inte haft möjlighet att testa).
För MIDI-kommunikation har jag använt mig av RtMidi (http://www.music.mcgill.ca/~gary/rtmidi/), som jag varmt kan rekommendera.

Källkoden är inlagd i svnen (http://www.sk-electronics.com/svn/repos/SK-Synth/trunk/) under "SK-Synth_Control".
Jag slängde även ihop en zippad svn-snapshot och la här: http://www.sk-electronics.com/sk-synth/ ... 100805.zip
Skriv svar