From 18af38266abd7e4543dd14d5329cd13db3b048f5 Mon Sep 17 00:00:00 2001 From: Javier Serrano Polo Date: Sun, 25 Mar 2007 21:58:17 +0000 Subject: [PATCH] polyb302 instrument, detuning without signals git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@466 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 24 + configure.in | 7 +- data/locale/ca.qm | Bin 107246 -> 109295 bytes data/locale/ca.ts | 177 +++++- include/instrument_track.h | 8 +- include/knob.h | 42 +- include/note_play_handle.h | 3 +- plugins/Makefile.am | 1 + plugins/polyb302/Makefile.am | 33 ++ plugins/polyb302/artwork.png | Bin 0 -> 81804 bytes plugins/polyb302/logo.png | Bin 0 -> 4538 bytes plugins/polyb302/polyb302.cpp | 961 ++++++++++++++++++++++++++++++++ plugins/polyb302/polyb302.h | 251 +++++++++ src/core/note_play_handle.cpp | 16 +- src/tracks/instrument_track.cpp | 9 +- 15 files changed, 1470 insertions(+), 62 deletions(-) create mode 100644 plugins/polyb302/Makefile.am create mode 100644 plugins/polyb302/artwork.png create mode 100644 plugins/polyb302/logo.png create mode 100644 plugins/polyb302/polyb302.cpp create mode 100644 plugins/polyb302/polyb302.h diff --git a/ChangeLog b/ChangeLog index dd6824562..5e94259b3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,27 @@ +2007-03-25 Javier Serrano Polo + + * plugins/polyb302/artwork.png: + * plugins/polyb302/logo.png: + * plugins/polyb302/Makefile.am: + * plugins/polyb302/polyb302.cpp: + * plugins/polyb302/polyb302.h: + initial release, polyphonic version of lb302 plugin + + * include/instrument_track.h: + * include/note_play_handle.h: + * src/core/note_play_handle.cpp: + * src/tracks/instrument_track.cpp: + trigger detuning without signals + + * configure.in: + fixed singerbot error + + * include/knob.h: + arranged private/protected members + + * data/locale/ca.ts: + updated translation + 2007-03-07 Javier Serrano Polo * plugins/singerbot/singerbot.cpp: diff --git a/configure.in b/configure.in index 11142e60d..bb2375eab 100644 --- a/configure.in +++ b/configure.in @@ -2,8 +2,8 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.50) -AC_INIT(lmms, 0.2.1-svn20070307, lmms-devel/at/lists/dot/sf/dot/net) -AM_INIT_AUTOMAKE(lmms, 0.2.1-svn20070307) +AC_INIT(lmms, 0.2.1-svn20070325, lmms-devel/at/lists/dot/sf/dot/net) +AM_INIT_AUTOMAKE(lmms, 0.2.1-svn20070325) AM_CONFIG_HEADER(config.h) @@ -359,9 +359,9 @@ if test ! -z "$HAVE_SAMPLERATE_H" ; then if test ! -z "$FESTIVAL_SUPPORT" ; then AC_DEFINE(SINGERBOT_SUPPORT) fi - AM_CONDITIONAL(SINGERBOT_SUPPORT, test ! -z "$FESTIVAL_SUPPORT" ) AC_LANG_POP(C++) fi +AM_CONDITIONAL(SINGERBOT_SUPPORT, test ! -z "$FESTIVAL_SUPPORT" ) # libsndfile-stuff @@ -590,6 +590,7 @@ AC_CONFIG_FILES([Makefile plugins/live_tool/Makefile plugins/midi_import/Makefile plugins/organic/Makefile + plugins/polyb302/Makefile plugins/plucked_string_synth/Makefile plugins/singerbot/Makefile plugins/stk/Makefile diff --git a/data/locale/ca.qm b/data/locale/ca.qm index aa307327c007e23c0428ab26655bda98ed96f938..a14147c3e55af5bb8a3d6a18e4bf52aba9ca39fd 100644 GIT binary patch delta 9707 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 diff --git a/data/locale/ca.ts b/data/locale/ca.ts index 61e1d284d..4ca0a6238 100644 --- a/data/locale/ca.ts +++ b/data/locale/ca.ts @@ -407,7 +407,7 @@ http://lmms.sourceforge.net Use this knob for setting the arpeggio time in milliseconds. The arpeggio time specifies how long each arpeggio-tone should be played. - Usa aquesta roda per a ajustar el temps d'arpegi en milisegons. El temps d'arpegi especifica la durada de cada nota de l'arpegi. + Usa aquesta roda per a ajustar el temps d'arpegi en mil·lisegons. El temps d'arpegi especifica la durada de cada nota de l'arpegi. Arpeggio gate: @@ -738,7 +738,7 @@ http://lmms.sourceforge.net If you click here, selected values will be cut into the clipboard. You can paste them anywhere in any pattern by clicking on the paste-button. - Si piques aqui, els valors seleccionats seran tallats cap al portapapers. Pots enganxar-los a qualsevol banda de qualsevol patró picant el botó enganxar. + Si piques aquí, els valors seleccionats seran tallats cap al portapapers. Pots enganxar-los a qualsevol banda de qualsevol patró picant el botó enganxar. If you click here, selected values will be copied into the clipboard. You can paste them anywhere in any pattern by clicking on the paste-button. @@ -746,7 +746,7 @@ http://lmms.sourceforge.net If you click here, the values from the clipboard will be pasted at the first visible tact. - Si piques aqui, els valors del portapapers seran enganxats al primer compàs visible. + Si piques aquí, els valors del portapapers seran enganxats al primer compàs visible. Automation Editor - no pattern @@ -790,7 +790,7 @@ http://lmms.sourceforge.net If you click here, erase-mode will be activated. In this mode you can erase single values. You can also press 'Shift+E' on your keyboard to activate this mode. - Si piques aqui, s'activarà el mode esborrar. En aquest mode pots esborrar valors solts. També pots pitjar 'Maj+E' al teclat per a activar aquest mode. + Si piques aquí, s'activarà el mode esborrar. En aquest mode pots esborrar valors solts. També pots pitjar 'Maj+E' al teclat per a activar aquest mode. If you click here, select-mode will be activated. In this mode you can select values. This is neccessary if you want to cut, copy, paste, delete or move values. You can also press 'Shift+S' on your keyboard to activate this mode. @@ -798,7 +798,7 @@ http://lmms.sourceforge.net If you click here, move-mode will be activated. In this mode you can move the values you selected in select-mode. You can also press 'Shift+M' on your keyboard to activate this mode. - Si piques aqui, el mode moure serà activat. En aquest mode pots moure els valors que has seleccionat en el mode seleccionar. També pots pitjar 'Maj+M' al teclat per a activar aquest mode. + Si piques aquí, el mode moure serà activat. En aquest mode pots moure els valors que has seleccionat en el mode seleccionar. També pots pitjar 'Maj+M' al teclat per a activar aquest mode. @@ -1038,7 +1038,7 @@ Es mostrarà l'assistent per a reconfigurar LMMS. < &Back - < &Enrera + < &Enrere &Finish @@ -1383,15 +1383,15 @@ directori de treball de LMMS. Executar ara l'assistent? Q/Resonance: - Q/Resonància: + Q/Ressonància: Use this knob for setting Q/Resonance for the selected filter. Q/Resonance tells the filter, how much it should amplify frequencies near Cutoff-frequency. - Usa aquesta roda per a ajustar la Q/Resonància per al filtre seleccionat. Q/Resonància diu al filtre quant ha d'amplificar les freqüències a prop de la freqüència de tall. + Usa aquesta roda per a ajustar la Q/Ressonància per al filtre seleccionat. Q/Ressonància diu al filtre quant ha d'amplificar les freqüències a prop de la freqüència de tall. Q/Resonance - Q/Resonància + Q/Ressonància 2x LowPass @@ -1419,7 +1419,7 @@ directori de treball de LMMS. Executar ara l'assistent? Q/RESO - Q/RESO + Q/RESSO FILTER @@ -1972,11 +1972,11 @@ Fent doble clic a qualsevol connector mostrarà informació sobre els ports. VCF Resonance - Resonància VCF + Ressonància VCF Resonance: - Resonància: + Ressonància: RES @@ -2311,7 +2311,7 @@ Les tecles F1-F10 apaguen els 10 primers instruments a l'Editor de Ritme Ba Currently there's no help available in LMMS. Please visit http://wiki.mindrules.net for documentation on LMMS. - Actualment no hi ha ajuda diponible a LMMS. + Actualment no hi ha ajuda disponible a LMMS. Per favor, visita http://wiki.mindrules.net per a documentació sobre LMMS. @@ -2786,7 +2786,7 @@ usa la roda del ratolí per a ajustar el volum d'un pas If you click here, selected notes will be cut into the clipboard. You can paste them anywhere in any pattern by clicking on the paste-button. - Si piques aqui, les notes seleccionades seran tallades cap al portapapers. Pots enganxar-les a qualsevol banda de qualsevol patró picant el botó enganxar. + Si piques aquí, les notes seleccionades seran tallades cap al portapapers. Pots enganxar-les a qualsevol banda de qualsevol patró picant el botó enganxar. If you click here, selected notes will be copied into the clipboard. You can paste them anywhere in any pattern by clicking on the paste-button. @@ -2794,7 +2794,7 @@ usa la roda del ratolí per a ajustar el volum d'un pas If you click here, the notes from the clipboard will be pasted at the first visible tact. - Si piques aqui, les notes del portapapers seran enganxades al primer compàs visible. + Si piques aquí, les notes del portapapers seran enganxades al primer compàs visible. Paste notes from clipboard (Ctrl+V) @@ -2870,7 +2870,7 @@ usa la roda del ratolí per a ajustar el volum d'un pas If you click here, erase-mode will be activated. In this mode you can erase single notes. You can also press 'Shift+E' on your keyboard to activate this mode. - Si piques aqui, s'activarà el mode esborrar. En aquest mode pots esborrar notas soltes. També pots pitjar 'Maj+E' al teclat per a activar aquest mode. + Si piques aquí, s'activarà el mode esborrar. En aquest mode pots esborrar notes soltes. També pots pitjar 'Maj+E' al teclat per a activar aquest mode. If you click here, select-mode will be activated. In this mode you can select notes. This is neccessary if you want to cut, copy, paste, delete or move notes. You can also press 'Shift+S' on your keyboard to activate this mode. @@ -2878,7 +2878,7 @@ usa la roda del ratolí per a ajustar el volum d'un pas If you click here, move-mode will be activated. In this mode you can move the notes you selected in select-mode. You can also press 'Shift+M' on your keyboard to activate this mode. - Si piques aqui, el mode moure serà activat. En aquest mode pots moure les notes que has seleccionat en el mode seleccionar. També pots pitjar 'Maj+M' al teclat per a activar aquest mode. + Si piques aquí, el mode moure serà activat. En aquest mode pots moure les notes que has seleccionat en el mode seleccionar. També pots pitjar 'Maj+M' al teclat per a activar aquest mode. @@ -2993,6 +2993,141 @@ usa la roda del ratolí per a ajustar el volum d'un pas Tool for live performance Eina per a actuació en directe + + Incomplete polyphonic immitation tb303 + Imitació polifònica incompleta tb303 + + + + polyb302Synth + + VCF Cutoff Frequency + Freqüència de Tall VCF + + + Cutoff Freq: + Freq Tall: + + + CUT + TALL + + + VCF Resonance + Ressonància VCF + + + Resonance: + Ressonància: + + + RES + RES + + + VCF Envelope Mod + Mod Envoltant VCF + + + Env Mod: + Mod Env: + + + ENV MOD + MOD ENV + + + VCF Envelope Decay + Decaïment Envoltant VCF + + + Decay: + Decaïment: + + + DEC + DEC + + + Slide + Lliscament + + + 303-es-que, 24dB/octave, 3 pole filter + 303-es-que, 24dB/octava, filtre 3 pols + + + Slide Decay + Decaïment de Lliscament + + + Slide Decay: + Decaïment de Lliscament: + + + SLIDE + LLISCA + + + VCO fine detuning + Desafinament fi VCO + + + VCO Fine Detuning: + Desafinament Fi VCO: + + + DETUNE + DESAF + + + Distortion + Distorsió + + + DIST: + DIST: + + + DIST + DIST + + + Waveform + Forma d'ona + + + WAVE: + ONA: + + + WAVE + ONA + + + Sawtooth + Dent de serra + + + Inverted Sawtooth + Dent de serra invertida + + + Triangle + Triangular + + + Square + Quadrada + + + Rounded Square + Quadrada Arrodonida + + + Moog + Moog + projectNotes @@ -3125,7 +3260,7 @@ usa la roda del ratolí per a ajustar el volum d'un pas Toggles the effect on or off. - Encèn o apaga l'efecte. + Encén o apaga l'efecte. Wet/Dry mix @@ -3433,7 +3568,7 @@ Latència: %2 ms Here you can setup the internal buffer-size used by LMMS. Smaller values result in a lower latency but also may cause unusable sound or bad performance, especially on older computers or systems with a non-realtime kernel. - Aquí pots configurar el tamany de la memòria intermèdia interna usada per LMMS. Els valors més petits donen menor latència però també poden causar so inservible o baix rendiment, especialment a ordinadors antics o sistemes amb un nucli sense temps real. + Aquí pots configurar la grandària de la memòria intermèdia interna usada per LMMS. Els valors més petits donen menor latència però també poden causar so inservible o baix rendiment, especialment a ordinadors antics o sistemes amb un nucli sense temps real. Choose LMMS working directory @@ -3483,7 +3618,7 @@ Latència: %2 ms If you have a machine with more then one processor (e.g. dual-core systems) you should use a parallelizing-level above 1 which means that LMMS will try to split up sound-processing into several threads which should should be run on several cores by the underlaying operating-system. Please note that in some cases parallelizing won't work with small buffer-sizes. If you experience problems (i.e. lot of xruns), try to increase buffer-size. Si tens una màquina amb més d'un processador (p.e. sistemes amb nucli dual) hauries d'usar un nivell de paral·lelització més gran que 1, que vol dir que LMMS tractarà de dividir el processament de so en varis fils que haurien d'executar-se en varis nuclis pel sistema operatiu subjacent. -Fixa't que en alguns casos la paral·lelització no funcionarà amb memòries intermèdies de petit tamany. Si experimentes problemes (p.e. molts xruns), prova d'augmentar el tamany de la memòria intermèdia. +Fixa't que en alguns casos la paral·lelització no funcionarà amb memòries intermèdies de grandària petita. Si experimentes problemes (p.e. molts xruns), prova d'augmentar la grandària de la memòria intermèdia. Choose LADSPA plugin directory @@ -4277,7 +4412,7 @@ El botó 'N' normalitzarà la forma d'ona. The 'S' knob sets the stiffness of the selected string. The stiffness of the string affects how long the string will ring out. The lower the setting, the longer the string will ring. - La roda 'S' ajusta la rigidesa de la corda seleccionada. La rigidesa de la corda afecta el temps que la corda resonarà. Quan més baix el valor, més temps sonarà la corda. + La roda 'S' ajusta la rigidesa de la corda seleccionada. La rigidesa de la corda afecta el temps que la corda ressonarà. Quan més baix el valor, més temps sonarà la corda. Pick position diff --git a/include/instrument_track.h b/include/instrument_track.h index 714a6c24a..1d91a6ec0 100755 --- a/include/instrument_track.h +++ b/include/instrument_track.h @@ -189,7 +189,7 @@ public slots: signals: void baseNoteChanged( void ); - void sentMidiTime( const midiTime & _time ); + void noteDone( const note & _n ); protected: @@ -232,6 +232,8 @@ private: tones m_baseTone; octaves m_baseOctave; + vlist m_processHandles; + // widgets on the top of a instrument-track-window tabWidget * m_generalSettingsWidget; @@ -276,10 +278,6 @@ private: void FASTCALL setBaseTone( tones _new_tone ); void FASTCALL setBaseOctave( octaves _new_octave ); - -signals: - void noteDone( const note & _n ); - } ; diff --git a/include/knob.h b/include/knob.h index 135b0d09f..784abbbc4 100644 --- a/include/knob.h +++ b/include/knob.h @@ -104,6 +104,19 @@ signals: protected: + static float s_copiedValue; + static textFloat * s_textFloat; + + float m_mouseOffset; + QPoint m_origMousePos; + bool m_buttonPressed; + + QPixmap * m_knobPixmap; + QString m_hintTextBeforeValue; + QString m_hintTextAfterValue; + + float m_initValue; + virtual void contextMenuEvent( QContextMenuEvent * _me ); virtual void dragEnterEvent( QDragEnterEvent * _dee ); virtual void dropEvent( QDropEvent * _de ); @@ -118,46 +131,25 @@ protected: void drawKnob( QPainter * _p ); void setPosition( const QPoint & _p ); - -// TODO: Need to figure out what is really used by tempoSyncKnob -// to get the private/protected attributes sorted out. Right -// now, just make everything protected. -//private: - void layoutKnob( bool _update = TRUE ); float getValue( const QPoint & _p ); + + +private: + void layoutKnob( bool _update = TRUE ); void recalcAngle( void ); void valueChange( void ); void rangeChange( void ); - void buttonReleased( void ); - - - static float s_copiedValue; - static textFloat * s_textFloat; - - - float m_mouseOffset; - QPoint m_origMousePos; - bool m_buttonPressed; - - float m_pageSize; float m_angle; float m_totalAngle; - - QPixmap * m_knobPixmap; int m_knobNum; - QString m_hintTextBeforeValue; - QString m_hintTextAfterValue; QString m_label; - - float m_initValue; - } ; #endif diff --git a/include/note_play_handle.h b/include/note_play_handle.h index 842bc8f26..90e45194e 100644 --- a/include/note_play_handle.h +++ b/include/note_play_handle.h @@ -207,6 +207,8 @@ public: m_instrumentTrack->m_instrument->waitForWorkerThread(); } + void processMidiTime( const midiTime & _time ); + #if SINGERBOT_SUPPORT int patternIndex( void ) { @@ -250,7 +252,6 @@ private: private slots: - void processMidiTime( const midiTime & _time ); void updateFrequency( void ); } ; diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 4d5b8ba1e..69cdc45ca 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -26,6 +26,7 @@ SUBDIRS = \ midi_import \ organic \ plucked_string_synth \ + polyb302 \ $(SINGERBOT_DIR) \ $(STK_DIR) \ triple_oscillator \ diff --git a/plugins/polyb302/Makefile.am b/plugins/polyb302/Makefile.am new file mode 100644 index 000000000..bd94dece1 --- /dev/null +++ b/plugins/polyb302/Makefile.am @@ -0,0 +1,33 @@ +AUTOMAKE_OPTIONS = foreign 1.4 + + +INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/src/lib -I. + + +AM_CXXFLAGS := $(AM_CXXFLAGS) $(QT_CXXFLAGS) -DPLUGIN_NAME="polyb302" + + +%.moc: ./%.h + $(MOC) -o $@ $< + + +MOC_FILES = ./polyb302.moc + +BUILT_SOURCES = $(MOC_FILES) ./embedded_resources.h +EMBEDDED_RESOURCES = $(wildcard *png) + +./embedded_resources.h: $(EMBEDDED_RESOURCES) + $(BIN2RES) $(EMBEDDED_RESOURCES) > $@ + +EXTRA_DIST = $(EMBEDDED_RESOURCES) + + +CLEANFILES = $(MOC_FILES) ./embedded_resources.h + + + +pkglib_LTLIBRARIES = libpolyb302.la + +libpolyb302_la_SOURCES = polyb302.cpp polyb302.h + +$(libpolyb302_la_SOURCES): ./embedded_resources.h diff --git a/plugins/polyb302/artwork.png b/plugins/polyb302/artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..719a9e3549def0e28aeaf21140b2e1bc858156ea GIT binary patch literal 81804 zcmXt9cQhQ|-yS8gL|H9*Ur`e^dbe1;glJKsMi;%8AeQJsbkRFO5WPgNU%f9Ov3h5* z%Io*Xd*;mCf9A~Gd*{x1%ICRJS{h0Oc+_|R01zm{pgNE3&Hqji=HnG7ZpJ+uYJ`@ho@y?eg8-a*dMdbR>3Ecz6f|gD+Yime0OjGLM1Dxe*ex zL9W24sQU^EZRga`e-(y6Gu@axO~enEc|pSOQLN#u?>!$-?7i@N2^Ak$-ZCv;RDzF) zzxX@!=8h1(|EFpGrmA7SRroV_UHp{px>G+*-SBWxz<+*YgY-Q6@G9>10prATmd~as z%R#!wv0rh*4TuXh$z9yqfyYf?i2SeLxB&2!F`NzVK;UzLzfS6LT_8G6b`s?dEQthETd9ni$vJ_PY z3ZKo>eH+>#{2(Fhcz6h&cCQo$07`AP@B&MGXH-$P+HXbZ!IIdY0L+-Wq3WPecp5=I zNgXj}Bsj_A=l%qk7+|tv{?{I=<*%OzOYpc&@e%%UQVr_Hj28I|&47{YfH8IO^5Vi+ ztyIfDzov6YmD$4HU*yy80uuO2hLmVtRt4LSdLiaJ?f zJhN_vUL0CVY{r8n?UHvR#}g{jiBsTg1Iz1vmulxbtJ1oqH4S zlxLti2=~)WgsBM4!SF>4R}d3+JUcj1rmiLtf=iy32-ouQf>Wkp7)0YMtE6MffI5We zE``Dw3sVa%wej0f@1X;qLjYnqb8~oh45qRoncOj)G6Yk6K=C`6Ux6%?An8RC{L^AM zI02*`zP_jjA-VJfrY2&;=&=4{ z$JY82J0`Mx*J>Sp9A*b}v2!H2aQNqFcFphap8l+WxIQr+30^3s>%JOb?uDRYY5?N` zj9|dWEOI^3YTt{A#O5~wFVXdQ|0Tef2*$oD&p&Z>lsleF1rn?a0B|?>*?IL; z%g!Qh5>vR$SW6mfI_3|)c5oYslgv57t$Dzo2Ir#!>wwf>2-Vj5SF5zZgZ8RDAwYDx zw$Vx`G(8L_1cU{#aH+7D`XNwU;z_FfYE<&W?HG|XFIV=Sp?-Rc$@4SM)mW#up7Us< zatQBNFubR=^b-|EWtAlle$dk=I1CR&OuZVq`~+R2m3mtNWBULcE(Z$7i~s1`#GYBdO z=Q9kT|1#?D?tfyo$-_U#t6s_<8@-kT)hg&fm(Dqniq6 zAj#fOL#nD$R5k)!8wtBr%Zf&0cX0F4OrV{~c9o`jF9$x0*ji*4NS3LE!c~fOb{A-X z^>%AyvPz}Es0N5NB05`HE&^;n{bk$ACA+2wwgIi$bxt~8@VBuwQDDccPo@SctJ<3& z*m)o(URRJTD9?&B{1icL?B|l*q+$;YPub|&_LJF785w*Kx3y?;H8?Q-(fG5NM29QI z$Ax7#`kvl0romKYQSEE0hLLA`@BYSL#v~mMjyDdf5JU1WhL&mxZF@OpG&C*Sg)eKc zzAr>E`2e5R`(*U6Ig(nOziL$|zGLQZh3m?^NRlfaeM)(0PnXmMfDq|$fQby?b*06> z^vu$Le~O~jg=1>V9FJ2m+o}<1%YexIQ$cbv%*<3sd+z7jy+OF$q{IaG9Gg}&Go*lJ z_96zD5ibvJ1-#{FO`1!EcZ-oOC_E*>RAlVmX~BC-D8-9oek2ap0Y$(O#>|-OpoRsV zBL`#*WfweZP?S`O?~0l@LhGZKuS*2@<5NW|SeZPiUsuim+P$A8fLMl`Q&PUNbsE~= z@Z@*{eODzDz@@GmUC5Ou++q)3zG^#P8%-H+#F9X+!oppXcD&!KK({RnWOmi24nOg(P&kWb9@Pcee8IdwC?u|WT0!M&*(xTrMbJy2566VQ6ie~!BbTVL@ zVbsU00Pxn5+fmih(rPi|8wKbktyB0Y<{a zAHTobY=tCRnOwjji5}y8;>@^kC|OFbj&g51YJ6$RH*=eoI0Dv&%GnbsfE20>wHykx z3Od+%Brx$X z3=%H)y?nQF+zTkJKy+HPN=v;C&Hf-jtYyZBA7y?p7^x!tn|tk<&Lv)0+#SUQziwZt!a z&gsdqGmkmOaGVBY^GPDh^)`$%34x*=EpBOLBPMK1KMUT4sT#_$1$w3icRjˢ=c zA{|19VeSwuk~rm&T^o4B34nE!X!`b<{}6VIo3Y?Ij7ZRU2CWzMy}**uZY(gGRmK9c zUg{72oG$;hownu7u_-2`nj?r9H=Q}Z z46U;(qF1N_e&SCPQlwVJAqUc7g(kJf#wIJ_@59*IgEiMYIIYWv$4{3n2b36{vd8gmYW zra`_lCaDzDN+jy?6ET6NVAudujI_Kw6(a;ng7ZR5=3|E<7xA?ks2feKU8xwvjEAcL zfwxSW+gP?jA=X(M>Ioboe&iW|AFuJ0@kgqy0q~q2XfZWS0k9=KNh6|W!v2iIw7Ud(@MJkUa z6Xaz6YRC2)>{~%&>_NnmttYi_8LVkDtmh+B>f_F)NFtku&{POP(BQ~iPibGk2D)D#so8GBZJY1o`Rwj*XR zpL~xMP_3(B!e)w09bPFwyQ(FTB7SCqF0isFZ{2_8vJk8x_|A_FCoCTuTeXIbzeU=4 zHap<&@Lho)o9pdObC*~N$s8eN>P}8&x+GE2GEg#YYeFLefC+5R5QBOR)SPC)jf5g_ zS1Ezga(WWG6x_TR4ra^ea#aRDm^eIj`zJN1rv)0Jk5K!OQLfzTb$LJS0hXd1JM0l_ z)P5c$vJVV(?N`3c79bv*l#YA1wxBblyC-q8m$=;P%cY0O#R{cZ^dA|8Q=ZtW@ivBo z^ZBC>!`(lJ>GSJxMr9Z$K)-i?j|2yXl%hp_Y>@5W5G2}Jmx+}ucyfGNi5SEYFUksE z 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

m$qJM7le^nky0{`R^ZWXm&{|_%$0desZ8^; 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 UH%NdBnE(I)07*qoM6N<$g14XllK=n! literal 0 HcmV?d00001 diff --git a/plugins/polyb302/logo.png b/plugins/polyb302/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..456a42675d6fc96c7ad3991e0c7677f02621d9f5 GIT binary patch literal 4538 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 + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * lb302FilterIIR2 is based on the gsyn filter code by Andy Sloane. + * + * lb302Filter3Pole is based on the TB303 instrument written by + * Josep M Comajuncosas for the CSounds library + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + +#include "qt3support.h" + +#ifdef QT4 + +#include + +#else + +#include + +#endif + + +#include "polyb302.h" +#include "audio_device.h" +#include "instrument_track.h" +#include "instrument_play_handle.h" +#include "led_checkbox.h" +#include "note_play_handle.h" +#include "templates.h" +#include "buffer_allocator.h" +#include "knob.h" + +#undef SINGLE_SOURCE_COMPILE +#include "embed.cpp" +#include "polyb302.moc" + + +// Envelope Recalculation period +#define ENVINC 64 + +// +// New config +// +#define LB_24_IGNORE_ENVELOPE +#define LB_FILTERED +//#define LB_24_RES_TRICK + +#define LB_DIST_RATIO 4.0 +#define LB_24_VOL_ADJUST 3.0 + + + + +using namespace std; +extern "C" +{ + +plugin::descriptor polyb302_plugin_descriptor = +{ + STRINGIFY_PLUGIN_NAME( PLUGIN_NAME ), + "PoLyB302", + QT_TRANSLATE_NOOP( "pluginBrowser", + "Incomplete polyphonic immitation tb303" ), + "Javier Serrano Polo ", + 0x0100, + plugin::Instrument, + new QPixmap( PLUGIN_NAME::getIconPixmap( "logo" ) ), + NULL +} ; + + +// necessary for getting instance out of shared lib +plugin * lmms_plugin_main( void * _data ) +{ + return( new polyb302Synth( static_cast( _data ) ) ); +} + +} + + + +// +// lb302Filter +// + +lb302Filter::lb302Filter( lb302FilterState * _p_fs, engine * _engine ) : + engineObject( _engine ), + m_fs( _p_fs ), + m_vcf_c0( 0 ), + m_vcf_e0( 0 ), + m_vcf_e1( 0 ) +{ +} + + + + +void lb302Filter::recalc( void ) +{ + m_vcf_e1 = exp( 4.909 + 1.5876 * m_fs->envmod + 2.1553 * m_fs->cutoff + + 1.2 * m_fs->reso ); + m_vcf_e0 = exp( 4.8434 - 0.8 * m_fs->envmod + 2.1553 * m_fs->cutoff + + 0.7696 * m_fs->reso ); + m_vcf_e0 *= M_PI / eng()->getMixer()->sampleRate(); + m_vcf_e1 *= M_PI / eng()->getMixer()->sampleRate(); + m_vcf_e1 -= m_vcf_e0; +} + + + + +void lb302Filter::envRecalc( void ) +{ + // Filter Decay. vcf_decay is adjusted for Hz and ENVINC + m_vcf_c0 *= m_fs->envdecay; + m_vcf_rescoeff = exp( -1.20 + 3.455 * m_fs->reso ); +} + + + + +void lb302Filter::playNote( void ) +{ + m_vcf_c0 = m_vcf_e1; +} + + + +// +// lb302FilterIIR2 +// + +lb302FilterIIR2::lb302FilterIIR2( lb302FilterState * _p_fs, engine * _engine ) : + lb302Filter( _p_fs, _engine ), + m_vcf_d1( 0 ), + m_vcf_d2( 0 ), + m_vcf_a( 0 ), + m_vcf_b( 0 ), + m_vcf_c( 1 ) +{ + m_dist = new effectLib::distortion<>( 1.0, 1.0f ); +} + + + + +lb302FilterIIR2::~lb302FilterIIR2() +{ + delete m_dist; +} + + + + +void lb302FilterIIR2::recalc( void ) +{ + lb302Filter::recalc(); + //m_dist->setThreshold(0.5+(m_fs->dist*2.0)); + m_dist->setThreshold( m_fs->dist * 75.0 ); +} + + + + +void lb302FilterIIR2::envRecalc( void ) +{ + lb302Filter::envRecalc(); + + // e0 is adjusted for Hz and doesn't need ENVINC + float w = m_vcf_e0 + m_vcf_c0; + float k = exp( -w / m_vcf_rescoeff ); + // Does this mean c0 is inheritantly? + m_vcf_a = 2.0 * cos( 2.0 * w ) * k; + m_vcf_b = -k * k; + m_vcf_c = 1.0 - m_vcf_a - m_vcf_b; +} + + + + +float lb302FilterIIR2::process( const float & _samp ) +{ + float ret = m_vcf_a * m_vcf_d1 + m_vcf_b * m_vcf_d2 + m_vcf_c * _samp; + // Delayed samples for filter + m_vcf_d2 = m_vcf_d1; + m_vcf_d1 = ret; + + if( m_fs->dist > 0 ) + { + ret = m_dist->nextSample( ret ); + } + // output = IIR2 + dry + return( ret ); +} + + + +// +// lb302Filter3Pole +// + +lb302Filter3Pole::lb302Filter3Pole( lb302FilterState * _p_fs, + engine * _engine ) : + lb302Filter( _p_fs, _engine ), + m_ay1( 0 ), + m_ay2( 0 ), + m_aout( 0 ), + m_lastin( 0 ) +{ +} + + + + +void lb302Filter3Pole::recalc( void ) +{ + // DO NOT CALL BASE CLASS + m_vcf_e0 = 0.000001; + m_vcf_e1 = 1.0; +} + + + + +// TODO: Try using k instead of vcf_reso +void lb302Filter3Pole::envRecalc( void ) +{ + lb302Filter::envRecalc(); + + + // e0 is adjusted for Hz and doesn't need ENVINC + float w = m_vcf_e0 + m_vcf_c0; + float k = ( m_fs->cutoff > 0.975 ) ? 0.975 : m_fs->cutoff; + //TODO: Fix high quality + float kfco = 50.0f + k * ( 2300.0f - 1600.0f * m_fs->envmod + + w * ( 700.0f + 1500.0f * k + ( 1500.0f + k * ( + eng()->getMixer()->sampleRate() / 2.0f - 6000.0f ) ) + * m_fs->envmod ) ); + //+iacc*(.3+.7*kfco*kenvmod)*kaccent*kaccurve*2000 + + +#ifdef LB_24_IGNORE_ENVELOPE + // m_kfcn = m_fs->cutoff; + m_kfcn = 2.0 * kfco / eng()->getMixer()->sampleRate(); +#else + m_kfcn = w; +#endif + m_kp = ( ( -2.7528 * m_kfcn + 3.0429 ) * m_kfcn + 1.718 ) * m_kfcn + - 0.9984; + m_kp1 = m_kp + 1.0; + m_kp1h = 0.5 * m_kp1; +#ifdef LB_24_RES_TRICK + k = exp( -w / m_vcf_rescoeff ); + m_kres = k * ( ( ( -2.7079 * m_kp1 + 10.963 ) * m_kp1 - 14.934 ) * m_kp1 + + 8.4974 ); +#else + m_kres = m_fs->reso * ( ( ( -2.7079 * m_kp1 + 10.963 ) * m_kp1 + - 14.934 ) * m_kp1 + 8.4974 ); +#endif + // ENVMOD was DIST*/ + m_value = 1.0 + ( m_fs->dist * ( 1.5 + 2.0 * m_kres + * ( 1.0 - m_kfcn ) ) ); +} + + + + +float lb302Filter3Pole::process( const float & _samp ) +{ + float ax1 = m_lastin; + float ay11 = m_ay1; + float ay31 = m_ay2; + m_lastin = _samp - tanh( m_kres * m_aout ); + m_ay1 = m_kp1h * ( m_lastin + ax1 ) - m_kp * m_ay1; + m_ay2 = m_kp1h * ( m_ay1 + ay11 ) - m_kp * m_ay2; + m_aout = m_kp1h * ( m_ay2 + ay31 ) - m_kp * m_aout; + + return( tanh( m_aout * m_value ) * LB_24_VOL_ADJUST + / ( 1.0 + m_fs->dist ) ); +} + + + +// +// PoLyBSynth +// + +polyb302Synth::polyb302Synth( instrumentTrack * _track ) : + instrument( _track, &polyb302_plugin_descriptor ) +{ + m_vcf_cut_knob = new knob( knobBright_26, this, + tr( "VCF Cutoff Frequency" ), + eng(), _track ); + m_vcf_cut_knob->setRange( 0.0f, 1.5f, 0.005f ); // Originally [0,1.0] + m_vcf_cut_knob->setInitValue( 0.75f ); + m_vcf_cut_knob->move( 75, 130 ); + m_vcf_cut_knob->setHintText( tr( "Cutoff Freq:" ) + " ", "" ); + m_vcf_cut_knob->setLabel( tr( "CUT" ) ); + + m_vcf_res_knob = new knob( knobBright_26, this, tr( "VCF Resonance" ), + eng(), _track ); + m_vcf_res_knob->setRange( 0.0f, 1.25f, 0.005f ); // Originally [0,1.0] + m_vcf_res_knob->setInitValue( 0.75f ); + m_vcf_res_knob->move( 120, 130 ); + m_vcf_res_knob->setHintText( tr( "Resonance:" ) + " ", "" ); + m_vcf_res_knob->setLabel( tr( "RES" ) ); + + m_vcf_mod_knob = new knob( knobBright_26, this, + tr( "VCF Envelope Mod" ), + eng(), _track ); + m_vcf_mod_knob->setRange( 0.0f, 1.0f, 0.005f ); // Originally [0,1.0] + m_vcf_mod_knob->setInitValue( 1.0f ); + m_vcf_mod_knob->move( 165, 130 ); + m_vcf_mod_knob->setHintText( tr( "Env Mod:" ) + " ", "" ); + m_vcf_mod_knob->setLabel( tr( "ENV MOD" ) ); + + m_vcf_dec_knob = new knob( knobBright_26, this, + tr( "VCF Envelope Decay" ), + eng(), _track ); + m_vcf_dec_knob->setRange( 0.0f, 1.0f, 0.005f ); // Originally [0,1.0] + m_vcf_dec_knob->setInitValue( 0.1f ); + m_vcf_dec_knob->move( 210, 130 ); + m_vcf_dec_knob->setHintText( tr( "Decay:" ) + " ", "" ); + m_vcf_dec_knob->setLabel( tr( "DEC" ) ); + + m_slideToggle = new ledCheckBox( "Slide", this, tr( "Slide" ), + eng(), _track ); + m_slideToggle->move( 10, 200 ); + + +// m_accentToggle = new ledCheckBox( "Accent", this, +// tr( "Accent" ), +// eng(), _track ); +// m_accentToggle->move( 10, 200 ); +// m_accentToggle->setDisabled(true); + + +// m_deadToggle = new ledCheckBox( "Dead", this, +// tr( "Dead" ), +// eng(), _track ); +// m_deadToggle->move( 10, 220 ); + + m_db24Toggle = new ledCheckBox( "24dB/oct", this, + tr( "303-es-que, 24dB/octave, 3 pole filter" ), + eng(), _track ); + m_db24Toggle->move( 10, 150 ); + + + m_slide_dec_knob = new knob( knobBright_26, this, tr( "Slide Decay" ), + eng(), _track ); + m_slide_dec_knob->setRange( 0.0f, 1.0f, 0.005f ); // Originally [0,1.0] + m_slide_dec_knob->setInitValue( 0.6f ); + m_slide_dec_knob->move( 210, 75 ); + m_slide_dec_knob->setHintText( tr( "Slide Decay:" ) + " ", "" ); + m_slide_dec_knob->setLabel( tr( "SLIDE" ) ); + + m_vco_fine_detune_knob = new knob( knobBright_26, this, + tr( "VCO fine detuning" ), + eng(), _track ); + m_vco_fine_detune_knob->setRange( -100.0f, 100.0f, 1.0f ); + m_vco_fine_detune_knob->setInitValue( 0.0f ); + m_vco_fine_detune_knob->move( 165, 75 ); + m_vco_fine_detune_knob->setHintText( tr( "VCO Fine Detuning:" ) + " ", + "cents" ); + m_vco_fine_detune_knob->setLabel( tr( "DETUNE" ) ); + + + m_dist_knob = new knob( knobBright_26, this, tr( "Distortion" ), + eng(), _track ); + m_dist_knob->setRange( 0.0f, 1.0f, 0.01f ); // Originally [0,1.0] + m_dist_knob->setInitValue( 0.0f ); + m_dist_knob->move( 210, 190 ); + m_dist_knob->setHintText( tr( "DIST:" ) + " ", "" ); + m_dist_knob->setLabel( tr( "DIST" ) ); + + + m_wave_knob = new knob( knobBright_26, this, tr( "Waveform" ), + eng(), _track ); + m_wave_knob->setRange( 0.0f, 5.0f, 1.0f ); // Originally [0,1.0] + m_wave_knob->setInitValue( 0.0f ); + m_wave_knob->move( 120, 75 ); + m_wave_knob->setHintText( tr( "WAVE:" ) + " ", "" ); + m_wave_knob->setLabel( tr( "WAVE" ) ); + + +#ifdef QT4 + setAutoFillBackground( TRUE ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( + "artwork" ) ); + setPalette( pal ); +#else + setErasePixmap( PLUGIN_NAME::getIconPixmap( "artwork" ) ); +#endif + + connect( m_vcf_cut_knob, SIGNAL( valueChanged( float ) ), + this, SLOT ( filterChanged( float ) ) ); + connect( m_vcf_res_knob, SIGNAL( valueChanged( float ) ), + this, SLOT ( filterChanged( float ) ) ); + connect( m_vcf_mod_knob, SIGNAL( valueChanged( float ) ), + this, SLOT ( filterChanged( float ) ) ); + connect( m_vcf_dec_knob, SIGNAL( valueChanged( float ) ), + this, SLOT ( filterChanged( float ) ) ); + connect( m_vco_fine_detune_knob, SIGNAL( valueChanged( float ) ), + this, SLOT ( detuneChanged( float) ) ); + connect( m_db24Toggle, SIGNAL( toggled( bool ) ), + this, SLOT ( db24Toggled( bool) ) ); + connect( m_dist_knob, SIGNAL( valueChanged(float) ), + this, SLOT ( filterChanged( float ) ) ); + connect( m_wave_knob, SIGNAL( valueChanged( float ) ), + this, SLOT ( waveChanged( float ) ) ); +} + + + + +polyb302Synth::~polyb302Synth() +{ +} + + + + +void polyb302Synth::saveSettings( QDomDocument & _doc, QDomElement & _this ) +{ + m_vcf_cut_knob->saveSettings( _doc, _this, "vcf_cut" ); + m_vcf_res_knob->saveSettings( _doc, _this, "vcf_res" ); + m_vcf_mod_knob->saveSettings( _doc, _this, "vcf_mod" ); + m_vcf_dec_knob->saveSettings( _doc, _this, "vcf_dec" ); + + m_vco_fine_detune_knob->saveSettings( _doc, _this, "vco_detune" ); + m_wave_knob->saveSettings( _doc, _this, "shape" ); + m_dist_knob->saveSettings( _doc, _this, "dist" ); + m_slide_dec_knob->saveSettings( _doc, _this, "slide_dec" ); + + m_slideToggle->saveSettings( _doc, _this, "slide" ); +// m_deadToggle->saveSettings( _doc, _this, "dead" ); + m_db24Toggle->saveSettings( _doc, _this, "db24"); +} + + + + +void polyb302Synth::loadSettings( const QDomElement & _this ) +{ + m_vcf_cut_knob->loadSettings( _this, "vcf_cut" ); + m_vcf_res_knob->loadSettings( _this, "vcf_res" ); + m_vcf_mod_knob->loadSettings( _this, "vcf_mod" ); + m_vcf_dec_knob->loadSettings( _this, "vcf_dec" ); + + m_vco_fine_detune_knob->loadSettings( _this, "vco_detune" ); + m_dist_knob->loadSettings( _this, "dist" ); + m_wave_knob->loadSettings( _this, "shape" ); + m_slide_dec_knob->loadSettings( _this, "slide_dec" ); + + m_slideToggle->loadSettings( _this, "slide" ); +// m_deadToggle->loadSettings( _this, "dead" ); + m_db24Toggle->loadSettings( _this, "db24" ); +} + + + + +QString polyb302Synth::nodeName( void ) const +{ + return( polyb302_plugin_descriptor.name ); +} + + + + +void polyb302Synth::playNote( notePlayHandle * _n, bool ) +{ + //int nidx = _n->index(); + + //if( _n->nphsOfInstrumentTrack(_n->getInstrumentTrack()).first() != _n ) + //if( _n->released() && _n->nphsOfInstrumentTrack( _n->getInstrumentTrack() ).count() > 1 ) + // return; + +/* + if (_n->released() ) { + if( notePlayHandle::nphsOfInstrumentTrack( getInstrumentTrack() ).size() > 0 + && notePlayHandle::nphsOfInstrumentTrack( getInstrumentTrack(), + TRUE ).last() == _n ) + { + return; + } + } +*/ + + handleState * hstate; + if( !_n->m_pluginData ) + { + hstate = new handleState( this ); + _n->m_pluginData = hstate; + m_handleStates.push_back( hstate ); + } + else + { + hstate = (handleState *)_n->m_pluginData; + } + + float freq = getInstrumentTrack()->frequency( _n ); + + if( _n->totalFramesPlayed() <= hstate->m_lastFramesPlayed ) + { + // TODO: Try moving to the if() below +// if( m_deadToggle->value() == 0 ) + { + hstate->m_sample_cnt = 0; + hstate->m_vca_mode = 0; + hstate->m_vca_a = 0; + } + + // Adjust inc on SampRate change or detuning change + hstate->m_vco_inc = hstate->m_vco_detune + / eng()->getMixer()->sampleRate(); + + // Initiate Slide + // TODO: Break out into function, + // should be called again on detuneChanged + if( hstate->m_vco_slideinc ) + { + hstate->m_vco_slide = hstate->m_vco_inc + - hstate->m_vco_slideinc; + hstate->m_vco_slidebase = hstate->m_vco_inc; + hstate->m_vco_slideinc = 0; + } + else + { + hstate->m_vco_slide = 0; + } + // End break-out + + // Slide note, save inc for next note + if (m_slideToggle->value()) + { + hstate->m_vco_slideinc = hstate->m_vco_inc; + // May need to equal m_vco_slidebase+m_vco_slide if last + // note slid + } + + + hstate->recalcFilter(); + +// if( m_deadToggle->value() == 0 ) + { + // Swap next two blocks?? + hstate->m_vcf->playNote(); + // Ensure envelope is recalculated + hstate->m_vcf_envpos = ENVINC; + + // Double Check + hstate->m_vca_mode = 0; + hstate->m_vca_a = 0.0; + } + } + + const Uint32 frames = eng()->getMixer()->framesPerAudioBuffer(); + sampleFrame * buf = bufferAllocator::alloc( frames ); + + if( buf ) + { + hstate->process( buf, frames, freq ); + getInstrumentTrack()->processAudioBuffer( buf, frames, _n ); + + bufferAllocator::free( buf ); + } + + hstate->m_lastFramesPlayed = _n->totalFramesPlayed(); +} + + + + +void polyb302Synth::deleteNotePluginData( notePlayHandle * _n ) +{ + handleState * hstate = (handleState *)_n->m_pluginData; + m_handleStates.remove( hstate ); + delete hstate; +} + + + + +void polyb302Synth::db24Toggled( bool ) +{ + for( vlist::iterator it = m_handleStates.begin(); + it != m_handleStates.end(); ++it ) + { + ( *it )->db24Toggled(); + } +} + + + + +void polyb302Synth::detuneChanged( float ) +{ + for( vlist::iterator it = m_handleStates.begin(); + it != m_handleStates.end(); ++it ) + { + ( *it )->detuneChanged(); + } +} + + + + +// TODO: Split into one function per knob. envdecay doesn't require +// recalcFilter. +void polyb302Synth::filterChanged( float ) +{ + for( vlist::iterator it = m_handleStates.begin(); + it != m_handleStates.end(); ++it ) + { + ( *it )->filterChanged(); + } +} + + + + +// TODO: Set m_vco_shape in here. +void polyb302Synth::waveChanged( float ) +{ + switch( (int)rint( m_wave_knob->value() ) ) + { + case 0: + m_wave_knob->setHintText( tr( "Sawtooth " ), "" ); + break; + case 1: + m_wave_knob->setHintText( tr( "Inverted Sawtooth " ), + "" ); + break; + case 2: + m_wave_knob->setHintText( tr( "Triangle " ), "" ); + break; + case 3: + m_wave_knob->setHintText( tr( "Square " ), "" ); + break; + case 4: + m_wave_knob->setHintText( tr( "Rounded Square " ), "" ); + break; + case 5: + m_wave_knob->setHintText( tr( "Moog " ), "" ); + break; + } +} + + + + + + + + +polyb302Synth::handleState::handleState( polyb302Synth * _synth ) : + engineObject( _synth->eng() ) +{ + m_vco_inc = 0.0; + m_vco_c = 0; + m_vco_k = 0; + + m_vco_slide = 0; + m_vco_slideinc = 0; + + m_fs.cutoff = 0; + m_fs.envmod = 0; + m_fs.reso = 0; + m_fs.envdecay = 0; + m_fs.dist = 0; + + m_vcf_envpos = ENVINC; + m_vco_detune = 0; + + m_vca_mode = 2; + m_vca_a = 0; + //m_vca_attack = 1.0 - 0.94406088; + m_vca_attack = 1.0 - 0.96406088; + m_vca_decay = 0.99897516; + + m_vco_shape = SAWTOOTH; + + // Experimenting between original (0.5) and 1.0 + m_vca_a0 = 0.5; + + if( _synth->m_db24Toggle->isChecked() ) + { + m_vcf = new lb302Filter3Pole( &m_fs, eng() ); + } + else + { + m_vcf = new lb302FilterIIR2( &m_fs, eng() ); + } + recalcFilter(); + + m_lastFramesPlayed = 0; + + m_synth = _synth; + + filterChanged(); + detuneChanged(); +} + + + + +polyb302Synth::handleState::~handleState() +{ + delete m_vcf; +} + + + + +void polyb302Synth::handleState::db24Toggled( void ) +{ + delete m_vcf; + if( m_synth->m_db24Toggle->isChecked() ) + { + m_vcf = new lb302Filter3Pole( &m_fs, eng() ); + } + else + { + m_vcf = new lb302FilterIIR2( &m_fs, eng() ); + } + recalcFilter(); +} + + + + +void polyb302Synth::handleState::detuneChanged( void ) +{ + m_vco_detune = powf( 2.0f, + (float)m_synth->m_vco_fine_detune_knob->value() + / 1200.0f ); + m_vco_inc = m_vco_detune / eng()->getMixer()->sampleRate(); + + // If a slide note is pending, + if( m_vco_slideinc ) + { + m_vco_slideinc = m_vco_inc; + } + + // If currently sliding, + // May need to rescale m_vco_slide as well + if( m_vco_slide ) + { + m_vco_slidebase = m_vco_detune + / eng()->getMixer()->sampleRate(); + } +} + + + + +// TODO: Split into one function per knob. envdecay doesn't require +// recalcFilter. +void polyb302Synth::handleState::filterChanged( void ) +{ + m_fs.cutoff = m_synth->m_vcf_cut_knob->value(); + m_fs.reso = m_synth->m_vcf_res_knob->value(); + m_fs.envmod = m_synth->m_vcf_mod_knob->value(); + m_fs.dist = LB_DIST_RATIO * m_synth->m_dist_knob->value(); + + float d = 0.2 + 2.3 * m_synth->m_vcf_dec_knob->value(); + d *= eng()->getMixer()->sampleRate(); + // decay is 0.1 to the 1/d * ENVINC + m_fs.envdecay = pow( 0.1, ENVINC / d ); + // vcf_envdecay is now adjusted for both + // sampling rate and ENVINC + recalcFilter(); +} + + + + +// OBSOLETE. Break apart once we get Q_OBJECT to work. >:[ +void polyb302Synth::handleState::recalcFilter( void ) +{ + m_vcf->recalc(); + + // THIS IS OLD 3pole/24dB code, I may reintegrate it. Don't need it + // right now. Should be toggled by LB_24_RES_TRICK at the moment. + + /*kfcn = 2.0 * (((vcf_cutoff*3000))) / m_LB_HZ; + kp = ((-2.7528*kfcn + 3.0429)*kfcn + 1.718)*kfcn - 0.9984; + kp1 = kp+1.0; + kp1h = 0.5*kp1; + kres = (((vcf_reso))) * (((-2.7079*kp1 + 10.963)*kp1 - 14.934)*kp1 + 8.4974); + value = 1.0+( (((0))) *(1.5 + 2.0*kres*(1.0-kfcn))); // ENVMOD was DIST*/ + + m_vcf_envpos = ENVINC; // Trigger filter update in process() +} + + + + +void polyb302Synth::handleState::process( sampleFrame * _outbuf, + const Uint32 _size, + float _freq ) +{ + for( Uint32 i = 0; i < _size; i++ ) + { + // update m_vcf + if( m_vcf_envpos >= ENVINC ) + { + m_vcf->envRecalc(); + + m_vcf_envpos = 0; + + if( m_vco_slide ) + { + m_vco_inc = m_vco_slidebase - m_vco_slide; + // Calculate coeff from dec_knob on knob change. + // TODO: Adjust for ENVINC + m_vco_slide *= 0.9 + + ( m_synth->m_slide_dec_knob->value() + * 0.0999 ); + } + } + + m_sample_cnt++; + m_vcf_envpos++; + + // 01/21/07 Changed to VCF -> VCA instead of VCA -> VCF +#ifdef LB_FILTERED + float samp = m_vcf->process( m_vco_k ) * 2.0 * m_vca_a; +#else + float samp = m_vco_k * m_vca_a; +#endif + + for( int c = 0; c < DEFAULT_CHANNELS; c++ ) + { + _outbuf[i][c] = samp; + } + + + // update vco + m_vco_c += m_vco_inc * _freq; + if( m_vco_c > 0.5 ) + { + m_vco_c -= 1.0; + } + + switch( (int)rint( m_synth->m_wave_knob->value() ) ) + { + case 0: m_vco_shape = SAWTOOTH; break; + case 1: m_vco_shape = INVERTED_SAWTOOTH; break; + case 2: m_vco_shape = TRIANGLE; break; + case 3: m_vco_shape = SQUARE; break; + case 4: m_vco_shape = ROUND_SQUARE; break; + case 5: m_vco_shape = MOOG; break; + default: m_vco_shape = SAWTOOTH; break; + } + + // add m_vco_shape_param the changes the shape of each curve. + // merge sawtooths with triangle and square with round square? + switch( m_vco_shape ) + { + case SAWTOOTH: // p0: curviness of line + // Is this sawtooth backwards? + m_vco_k = m_vco_c; + break; + + case INVERTED_SAWTOOTH: // p0: curviness of line + // Is this sawtooth backwards? + m_vco_k = -m_vco_c; + break; + + // TODO: I think TRIANGLE is broken. + // p0: duty rev.saw<->triangle<->saw p1: curviness + case TRIANGLE: + m_vco_k = m_vco_c * 2.0 + 0.5; + if( m_vco_k > 0.5 ) + { + m_vco_k = 1.0 - m_vco_k; + } + break; + + case SQUARE: // p0: slope of top + m_vco_k = ( m_vco_c < 0 ) ? 0.5 : -0.5; + break; + + case ROUND_SQUARE: // p0: width of round + m_vco_k = ( m_vco_c < 0 ) ? + sqrtf( 1 - m_vco_c * m_vco_c * 4 ) + - 0.5 : + -0.5; + break; + + // Maybe the fall should be exponential/sinsoidal + // instead of quadric. + case MOOG: + // [-0.5, 0]: Rise, [0,0.25]: Slope down, + // [0.25,0.5]: Low + m_vco_k = m_vco_c * 2.0 + 0.5; + if( m_vco_k > 1.0 ) + { + m_vco_k = -0.5; + } + else if( m_vco_k > 0.5 ) + { + float w = 2 * ( m_vco_k - 0.5 ) - 1; + m_vco_k = 0.5 - sqrtf( 1 - w * w ); + // MOOG wave gets filtered away + m_vco_k *= 2.0; + } + break; + } + + // Make it louder. For the better? + //m_vco_k*=2.0; + + // Handle Envelope + // TODO: Add decay once I figure out how to extend past the end + // of a note. + if( m_sample_cnt >= 0.5 * eng()->getMixer()->sampleRate() ) + { + m_vca_mode = 2; + } + if( m_vca_mode == 0 ) + { + m_vca_a += ( m_vca_a0 - m_vca_a ) * m_vca_attack; + } + else if( m_vca_mode == 1 ) + { + m_vca_a *= m_vca_decay; + // the following line actually speeds up processing + if( m_vca_a < 1 / 65536.0 ) + { + m_vca_a = 0; + m_vca_mode = 2; + } + } + + } +} diff --git a/plugins/polyb302/polyb302.h b/plugins/polyb302/polyb302.h new file mode 100644 index 000000000..0e63d0eab --- /dev/null +++ b/plugins/polyb302/polyb302.h @@ -0,0 +1,251 @@ +/* + * polyb302.h - declaration of class polyb302 which is a bass synth attempting + * to emulate the Roland TB303 bass synth + * + * Copyright (c) 2006-2007 Paul Giblock + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * lb302FilterIIR2 is based on the gsyn filter code by Andy Sloane. + * + * lb302Filter3Pole is based on the TB303 instrument written by + * Josep M Comajuncosas for the CSounds library + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + + +#ifndef _POLYB302_H_ +#define _POLYB302_H_ + +#include "instrument.h" +#include "effect_lib.h" + + +class knob; +class ledCheckBox; +class notePlayHandle; + + +typedef struct +{ + float cutoff; + float reso; + float envmod; + float envdecay; + float dist; +} lb302FilterState; + + + + +class lb302Filter : public engineObject +{ +public: + lb302Filter( lb302FilterState * _p_fs, engine * _engine ); + virtual ~lb302Filter() {}; + + virtual void recalc( void ); + virtual void envRecalc( void ); + virtual float process( const float & _samp ) = 0; + virtual void playNote( void ); + + +protected: + lb302FilterState * m_fs; + + // Filter Decay + float m_vcf_c0; // c0=e1 on retrigger; c0*=ed every sample; cutoff=e0+c0 + float m_vcf_e0; // e0 and e1 for interpolation + float m_vcf_e1; + float m_vcf_rescoeff; // Resonance coefficient [0.30,9.54] + +}; + + + + +class lb302FilterIIR2 : public lb302Filter +{ +public: + lb302FilterIIR2( lb302FilterState * _p_fs, engine * _engine ); + virtual ~lb302FilterIIR2(); + + virtual void recalc( void ); + virtual void envRecalc( void ); + virtual float process( const float & _samp ); + + +protected: + float m_vcf_d1; // d1 and d2 are added back into the sample with + float m_vcf_d2; // vcf_a and b as coefficients. IIR2 resonance + // loop. + + // IIR2 Coefficients for mixing dry and delay. + float m_vcf_a; // Mixing coefficients for the final sound. + float m_vcf_b; + float m_vcf_c; + + effectLib::distortion<> * m_dist; + +}; + + + + +class lb302Filter3Pole : public lb302Filter +{ +public: + lb302Filter3Pole( lb302FilterState * _p_fs, engine * _engine ); + + virtual void envRecalc( void ); + virtual void recalc( void ); + virtual float process( const float & _samp ); + + +protected: + float m_kfcn, + m_kp, + m_kp1, + m_kp1h, + m_kres; + float m_ay1, + m_ay2, + m_aout, + m_lastin, + m_value; +}; + + + + +class polyb302Synth : public instrument +{ + Q_OBJECT +public: + polyb302Synth( instrumentTrack * _track ); + virtual ~polyb302Synth(); + + virtual void FASTCALL playNote( notePlayHandle * _n, + bool _try_parallelizing ); + virtual void FASTCALL deleteNotePluginData( notePlayHandle * _n ); + + + virtual void FASTCALL saveSettings( QDomDocument & _doc, + QDomElement & _parent ); + virtual void FASTCALL loadSettings( const QDomElement & _this ); + + virtual QString nodeName( void ) const; + + +public slots: + void db24Toggled( bool ); + void detuneChanged( float ); + void filterChanged( float ); + void waveChanged( float ); + + +private: + class handleState : public engineObject + { + public: + handleState( polyb302Synth * _synth ); + virtual ~handleState(); + + enum vco_shape_t { + SAWTOOTH, INVERTED_SAWTOOTH, SQUARE, TRIANGLE, MOOG, + ROUND_SQUARE + }; + + // Oscillator + // Sample increment for the frequency. Creates Sawtooth. + float m_vco_inc; + // Raw oscillator sample [-0.5,0.5] + float m_vco_k; + // Raw oscillator sample [-0.5,0.5] + float m_vco_c; + + // Current value of slide exponential curve. Nonzero=sliding + float m_vco_slide; + // Slide base to use in next node. Nonzero=slide next note + float m_vco_slideinc; + // The base vco_inc while sliding. + float m_vco_slidebase; + + float m_vco_detune; + + vco_shape_t m_vco_shape; + + // User settings + lb302FilterState m_fs; + lb302Filter * m_vcf; + + float m_lastFramesPlayed; + + // More States + // Update counter. Updates when >= ENVINC + int m_vcf_envpos; + + float m_vca_attack; // Amp attack + float m_vca_decay; // Amp decay + float m_vca_a0; // Initial amplifier coefficient + float m_vca_a; // Amplifier coefficient. + + // Envelope State + int m_vca_mode; // 0: attack, 1: decay, 2: idle + + // My hacks + int m_sample_cnt; + + // TODO: split synth slots + polyb302Synth * m_synth; + + void recalcFilter( void ); + + void process( sampleFrame * _outbuf, const Uint32 _size, + float _freq ); + + void db24Toggled( void ); + void detuneChanged( void ); + void filterChanged( void ); + + } ; + + + knob * m_vcf_cut_knob; + knob * m_vcf_res_knob; + knob * m_vcf_dec_knob; + knob * m_vcf_mod_knob; + + knob * m_vco_fine_detune_knob; + + knob * m_dist_knob; + knob * m_wave_knob; + + ledCheckBox * m_slideToggle; +// ledCheckBox * m_accentToggle; +// ledCheckBox * m_deadToggle; + ledCheckBox * m_db24Toggle; + + knob * m_slide_dec_knob; + + vlist m_handleStates; + +} ; + + +#endif diff --git a/src/core/note_play_handle.cpp b/src/core/note_play_handle.cpp index 1f2c3c19f..c9bb0aee5 100644 --- a/src/core/note_play_handle.cpp +++ b/src/core/note_play_handle.cpp @@ -66,11 +66,8 @@ notePlayHandle::notePlayHandle( instrumentTrack * _it, setDetuning( _n.detuning() ); if( detuning() ) { - connect( m_instrumentTrack, - SIGNAL( sentMidiTime( const midiTime & ) ), - this, - SLOT( processMidiTime( const midiTime & ) ) ); processMidiTime( pos() ); + m_instrumentTrack->m_processHandles.push_back( this ); connect( detuning(), SIGNAL( valueChanged( float ) ), this, SLOT( updateFrequency() ) ); } @@ -106,9 +103,16 @@ notePlayHandle::~notePlayHandle() noteOff( 0 ); } - if( m_instrumentTrack != NULL && m_pluginData != NULL ) + if( m_instrumentTrack != NULL ) { - m_instrumentTrack->deleteNotePluginData( this ); + if( detuning() ) + { + m_instrumentTrack->m_processHandles.remove( this ); + } + if( m_pluginData != NULL ) + { + m_instrumentTrack->deleteNotePluginData( this ); + } } for( notePlayHandleVector::iterator it = m_subNotes.begin(); diff --git a/src/tracks/instrument_track.cpp b/src/tracks/instrument_track.cpp index 2b1b917a1..72649c7e1 100644 --- a/src/tracks/instrument_track.cpp +++ b/src/tracks/instrument_track.cpp @@ -972,7 +972,13 @@ bool FASTCALL instrumentTrack::play( const midiTime & _start, bb_track = NULL; sendMidiTime( _start ); } - emit sentMidiTime( _start ); + + // Handle automation: detuning + for( vlist::iterator it = m_processHandles.begin(); + it != m_processHandles.end(); ++it ) + { + ( *it )->processMidiTime( _start ); + } if ( tcos.size() == 0 ) { @@ -1349,6 +1355,7 @@ void instrumentTrack::invalidateAllMyNPH( void ) m_notesMutex.unlock(); // invalidate all note-play-handles linked to this channel + m_processHandles.clear(); eng()->getMixer()->checkValidityOfPlayHandles(); m_trackType = INSTRUMENT_TRACK;