eq10q-2.2/gui/combopix/loshelf.png0000644000175000001440000000227713023240624016441 0ustar sapistausersPNG  IHDR^]gAMA asRGB cHRMz&u0`:pQ<bKGDC pHYs   vpAgOhzIDATHǵUAoWb;DϦ!HT{E*Ւ8Ub'ED 0\ rAJ!piB8{Ӄ[NH{طfBX[ y13 6@ʶ ±c8]Cf&Rիk?]."@ "DAJ# ٩۷Y^zZu ?k4w܏J[h6#@B"B/;P_cn[4~xqDr"I)Z.? ڗ˗ 0gZ}<~ǣ D= fCр}\+:g"nh} R k>1(09!8P~ CKZ۷^`fi%J9DZ۞8 kqqn"82sjѶQ//fF"*o|ѩJtEXtCommentCreated with GIMPW%tEXtdate:create2011-02-16T23:02:03+01:00ך%tEXtdate:modify2009-12-16T13:33:28+01:00`IENDB`eq10q-2.2/gui/combopix/hpf.png0000644000175000001440000000167613023240624015564 0ustar sapistausersPNG  IHDR^]bKGD pHYs  tIMERiTXtCommentCreated with GIMPd.e"IDATHǭVMhQf5i)VIUFm)IAɣx(T/O=b-֋C dsAc]6?Fv}|߼YB݆cv.,kDDu0=} 2@ܲЙPZ>o}?2\-?'G۷g/G"RPXm˶ "&cJApx˗33WyٳW/zPT ~ }? p&'O-ٳZ&;"_g{?|Jv3#b` y<od;5u:pHY]-nF,׮];,Jp<~X t0LZaF[eDG|nU*e8:hk "۶Q.lmf"4&j?Z#"Lbxx? l;0 6Mc3%Z,x yd20 DUP3aidfbT* ۞W75Ckځ{ml~3wTfF(e4kJ *4 uN۰mZn& Efwo;}𖀵5 LͩԖQ}nk#`ov;`YVlvwR "#t0>>R8 +C'\R&FGctPT*}m[Ov $®Dk<QEi@k cƋ[33wonc֓'/,jۿ)e@$\z& X5b"\.V߫EAD04t'/+>~IENDB`eq10q-2.2/gui/combopix/peak.png0000644000175000001440000000250013023240624015712 0ustar sapistausersPNG  IHDR^]gAMA asRGB cHRMz&u0`:pQ<bKGDC pHYs   vpAgOhIDATHǭ=L[W':D E2R%JT5j*F`L@D,;jQ!5RԥkSRE;Eu"UQ1]w쇍&C=w-d~^o3´!(B_Jm`UR-/SGzBC~o*B!Jm ܓx^??e2u!#,kiiɾg499zsgg ~,+xNmu5AXz-PJY8YQ;Vx^oWODx`ѣ$bÒV?wuuaYN%lfssT"A{{[`lCAMiiq+sw,/1 !T*>YL!D)J)>%:n3`KKuPݠ*%F \-R[bQBRK J)LӤiJ)::: dŢ$I9@2 0;abb2In- \2flto]N"44M.ŘRjLfsD)J@AR"VUj0^qTYRQEkR,~9'eI5-y*eYsmgMt'RFD"!k,-5nO@A)g5f…0dX Zx<ņ0 ['uu05eB0gzϟh{p)e TkN5VPXMoٽpz:v콙ՄP! m\75ioASGeٗ''C7wv yT{?PRJR:#), JJ/`w,΂}7R~[kƶm'H?h~htEXtCommentCreated with GIMPW%tEXtdate:create2011-02-16T23:02:03+01:00ך%tEXtdate:modify2009-12-16T13:34:05+01:00vIENDB`eq10q-2.2/gui/combopix/lpf.png0000644000175000001440000000173313023240624015562 0ustar sapistausersPNG  IHDR^]bKGD pHYs  tIME `iTXtCommentCreated with GIMPd.e?IDATHǭVOhW}ofgvc6٤' nMě"JN XP4X!vHoAzAޔ` YMvݙywL|0}Ghb``ss"3`5LN^F Prň' d&fmX\t@,2;;w%;,D7[ @D𚉼1UUquԩэWV~:_*LV½GEaHP

~/;3ag8rdvu@xtwwuML|sH.+u7ohۄB~^|EQXj@u')$*nݚmI)`ff~6V4u,.(`htkH~GIE@(dZ%2D*B<8ۖ*mED( ᓺHBH)fN1<|a#ƲnIo! ${*(nRE "8dH$`B5Q=J`;{IrYX)e@٪㞏lr 9O*';ΦyWQmEQF 9j'B(Aᛷv<'=_2`zڿ`'Q| `6QQD&F+뙩Ril݋=1"@Jɖ8^ɴ@,evVLL]jd?e;̰m̌!t-4MTPA@J EQFdF:C\bׯ⩇ `0YRSXZ :'#N.BLLnHBiblLq@v7o~Ȁ>D{q,1Q3K7wcGqXT R`~>J "IAT4UIm>Jm ?PVyƦNݲl+eP3#NBJxjڟD[TigM>tH)133t:9WJ`ss iRaX,_}ڶiBPFH|b}[ 8N(t !`xQA4\1.\۫GhRi=dYAD.m!y>&''aԿkwV/w_DcD[-ỉTU@,eeۍid2%t>`w, ٶZI\03öm03T [/jtEXtCommentCreated with GIMPW%tEXtdate:create2011-02-16T23:02:03+01:00ך%tEXtdate:modify2009-12-16T13:33:49+01:00IENDB`eq10q-2.2/gui/combopix/notch.png0000644000175000001440000000223413023240624016111 0ustar sapistausersPNG  IHDR^]gAMA asRGB cHRMz&u0`:pQ<bKGDC pHYs   vpAgOhWIDATHǭMh\U罗LqPQ̘EjAMKWn A0v]WV,R"E.gaIhbF"˦<}{f]= mr RxZ#"x^ŏq]qvS Wt]c ZFqvٳۅO7o=y?艶^@DEbnt.Lן?OWժ'z߮)H؈Hǹm̼Z*5ի?0Ze<};$eFgDoJL&胃ZB AnaEJ)pbeuT*:҉i(:ھ;c R 4 Q! Z\xL&C*JΟ=ոebz lBa{a~~ n˲QJž%!Ԛv[ăPT(mRiJъ"ZQm.b=mG 9!IJL 0l4ڵk?~~&=f36“%eNkMh8;G{J`tEXtCommentCreated with GIMPW%tEXtdate:create2011-02-16T23:02:03+01:00ך%tEXtdate:modify2009-12-16T13:34:19+01:00IENDB`eq10q-2.2/gui/widgets/vuwidget.h0000644000175000001440000000740713023240626016136 0ustar sapistausers/*************************************************************************** * Copyright (C) 2011 by Pere R�fols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef VU_WIDGET_H #define VU_WIDGET_H #include #include #include #include #include #define PEAK_CLEAR_TIMEOUT 2000 class VUWidget : public Gtk::DrawingArea { public: VUWidget(int iChannels, float fMin, float fMax, std::string title, bool IsGainReduction = false, bool DrawThreshold = false); ~VUWidget(); void setValue(int iChannel, float fValue); //Data accessors void set_value_th(double value); double get_value_th(); //signal accessor: typedef sigc::signal signal_FaderChanged; signal_FaderChanged signal_changed(); protected: //Override default signal handler: virtual bool on_expose_event(GdkEventExpose* event); virtual bool on_timeout_redraw(); virtual bool on_mouse_leave_widget(GdkEventCrossing* event); void clearPeak(int uChannel); //Mouse grab signal handlers virtual bool on_button_press_event(GdkEventButton* event); virtual bool on_button_release_event(GdkEventButton* event); virtual bool on_scrollwheel_event(GdkEventScroll* event); virtual bool on_mouse_motion_event(GdkEventMotion* event); //Surface redraws virtual void redraw_background(); virtual void redraw_foreground(); virtual void redraw_faderwidget(); virtual void redraw_vuwidget(); int m_iChannels; float m_fMin; //Min representable value in dB float m_fMax; //Max representable value in dB int m_textdBseparation; //Integer number of dB for each VU text step bool m_bIsGainReduction; bool bMotionIsConnected; float* m_fValues; float* m_fPeaks; int* m_iBuffCnt; float m_ThFaderValue; int m_iThFaderPositon; bool m_bDrawThreshold; //sigc::connection* m_peak_connections; private: struct timeval *m_start; //Array of timeval start, on for each channel struct timeval *m_end; //Array of timeval end, on for each channel int width; int height; std::string m_Title; sigc::connection m_motion_connection; bool m_redraw_fader, m_redraw_Vu, m_FaderFocus; //Fader change signal signal_FaderChanged m_FaderChangedSignal; //dB to pixels convertion function double dB2Pixels(double dB_in); //Cairo surfaces Cairo::RefPtr m_background_surface_ptr, m_foreground_surface_ptr, m_fader_surface_ptr, m_vu_surface_ptr; }; #endif eq10q-2.2/gui/widgets/dynamicswindow.h0000644000175000001440000001512213023240626017330 0ustar sapistausers/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef DYN_MAIN_WIN_H #define DYN_MAIN_WIN_H #include #include #include #include #include #include #include //LV2 UI header #include #include "mainwidget.h" #include "vuwidget.h" #include "knob2.h" #include "toggle_button.h" #include "dynplot.h" #include "sidechainbox.h" #define PORT_KEY_LISTEN 2 #define PORT_THRESHOLD 3 #define PORT_ATACK 4 #define PORT_HOLD_MAKEUP 5 #define PORT_DECAY 6 #define PORT_RATIO 7 #define PORT_HPFFREQ 8 #define PORT_LPFFREQ 9 #define PORT_GAIN 10 #define PORT_INVU 11 #define PORT_GAINREDUCTION 12 #define PORT_KNEE 13 #define PORT_DRY_WET 14 #define PORT_FEEDBACK_RANGE_SCACTIVE 15 #define PORT_COMP_MODE 16 #define PORT_PUNCH 17 //Test print information, comment out for the final release //#define PRINT_DEBUG_INFO using namespace sigc; class DynMainWindow : public MainWidget { public: DynMainWindow(const char *uri, std::string bundlePath, std::string title, bool isCompressor, bool hasSideChain); virtual ~DynMainWindow(); // Informing GUI about changes in the control ports void gui_port_event(LV2UI_Handle ui, uint32_t port, uint32_t buffer_size, uint32_t format, const void * buffer) { float data = * static_cast(buffer); #ifdef PRINT_DEBUG_INFO std::cout<<"gui_port_event Entring....... "< 0.5); break; case PORT_THRESHOLD: m_InputVu->set_value_th(data); m_Plot->set_threshold(data); break; case PORT_ATACK: m_Attack->set_value(data); break; case PORT_HOLD_MAKEUP: m_Hold_Makeup->set_value(data); if(m_bIsCompressor) { m_Plot->set_makeup(data); } break; case PORT_DECAY: m_Release->set_value(data); break; case PORT_RATIO: m_Ratio->set_value(data); m_Plot->set_ratio(data); break; case PORT_GAINREDUCTION: m_GainReductionVu->setValue(0,data); m_Plot->set_gainreduction(data); break; case PORT_HPFFREQ: m_HPF->set_value(data); break; case PORT_LPFFREQ: m_LPF->set_value(data); break; case PORT_GAIN: m_InGainFader->set_value(data); break; case PORT_INVU: m_InputVu->setValue(0,data); m_Plot->set_inputvu(data); break; case PORT_KNEE: m_Knee->set_value(data); m_Plot->set_knee(data); break; case PORT_DRY_WET: m_DryWet->set_value(100.0*data); //In range of 0% to 100% break; case PORT_FEEDBACK_RANGE_SCACTIVE: if(m_bIsCompressor) { m_FeedBackMode_SideChainActive.set_active(data > 0.5); } else { m_Range->set_value(data); m_Plot->set_range(data); } break; case PORT_COMP_MODE: m_OptoMode.set_active(data > 0.5); break; case PORT_PUNCH: m_Punch->set_value(100.0*data); //In range of 0% to 100% break; } #ifdef PRINT_DEBUG_INFO std::cout<<"\t-- Return OK"< class SideChainBox : public Gtk::EventBox { public: SideChainBox( std::string sTitle = "Side-Chain", int top_padding = 20); virtual ~SideChainBox(); void set_label(const Glib::ustring& label); protected: virtual bool on_expose_event(GdkEventExpose* event); private: std::string m_title; int m_top_padding; }; #endifeq10q-2.2/gui/widgets/colors.h0000644000175000001440000000517713023240626015603 0ustar sapistausers/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #ifndef EQ10Q_COLORS_H #define EQ10Q_COLORS_H //Wdiget background colors #define BACKGROUND_R 0.19 //0.07 #define BACKGROUND_G 0.19 //0.08 #define BACKGROUND_B 0.22 //0.15 //Wdiget foreground colors #define FOREGROUND_R 0.8 //0.0 #define FOREGROUND_G 0.8 //0.65 #define FOREGROUND_B 0.8 //0.65 //Text Label Color #define TEXT_R 0.9 #define TEXT_G 0.9 #define TEXT_B 0.9 //Buttons background colors #define BUTTON_BACKGROUND_R 0.02 #define BUTTON_BACKGROUND_G 0.32 #define BUTTON_BACKGROUND_B 0.45 //Buttons Active background colors #define BUTTON_ACTIVE_BG_R 0.11 #define BUTTON_ACTIVE_BG_G 0.56 #define BUTTON_ACTIVE_BG_B 0.19 //Buttons inactive background colors #define BUTTON_INACTIVE_BG_R 0.00 #define BUTTON_INACTIVE_BG_G 0.15 #define BUTTON_INACTIVE_BG_B 0.25 //Buttons Mouse Over background colors #define BUTTON_OVER_BG_R 0.01 #define BUTTON_OVER_BG_G 0.46 #define BUTTON_OVER_BG_B 0.09 //Bands colors LUT const Glib::ustring bandColorLUT[] = {"#FF0000","#CDC009","#535EFB","#19FFAF","#FF01FF","#00FF00","#A52A2A","#FF8C2E","#B2DFEE","#7129EE" }; //Convert to Gdk::Color macro #define GDK_COLOR_MACRO(_color) ((gushort)floor(_color * (double)G_MAXUSHORT)) #endifeq10q-2.2/gui/widgets/eqparams.cpp0000644000175000001440000001752613023240626016447 0ustar sapistausers/*************************************************************************** * Copyright (C) 2011 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "eqparams.h" #include #include #include #include #define EQ10Q_SIGNATURE 12871 //#define USE_SLV2 ///TODO: check this-> esta donant problemes amb algunes versions de ardour, ull slv2 esta anticuat!!! #ifdef USE_SLV2 #include #include #include #include #include #endif EqParams::EqParams(int iNumBands): m_iNumberOfBands(iNumBands) { m_ptr_BandArray = (EqBandStruct*)malloc(sizeof(EqBandStruct) * m_iNumberOfBands); } EqParams::~EqParams() { free(m_ptr_BandArray); } bool EqParams::getBandEnabled(int iBand) { return m_ptr_BandArray[iBand].bIsEnabled; } float EqParams::getBandFreq(int iBand) { return m_ptr_BandArray[iBand].fFreq; } float EqParams::getBandGain(int iBand) { return m_ptr_BandArray[iBand].fGain; } float EqParams::getBandQ(int iBand) { return m_ptr_BandArray[iBand].fQ; } int EqParams::getBandType(int iBand) { return m_ptr_BandArray[iBand].iType; } float EqParams::getInputGain() { return m_fInGain; } float EqParams::getOutputGain() { return m_fOutGain; } void EqParams::setBandEnabled(int iBand, bool bIsEnabled) { m_ptr_BandArray[iBand].bIsEnabled = bIsEnabled; } void EqParams::setBandFreq(int iBand, float fFreq) { m_ptr_BandArray[iBand].fFreq = fFreq; } void EqParams::setBandGain(int iBand, float fGain) { m_ptr_BandArray[iBand].fGain = fGain; } void EqParams::setBandQ(int iBand, float fQ) { m_ptr_BandArray[iBand].fQ = fQ; } void EqParams::setBandType(int iBand, int iType) { m_ptr_BandArray[iBand].iType = iType; } void EqParams::setInputGain(float fInGain) { m_fInGain = fInGain; } void EqParams::setOutputGain(float fOutGain) { m_fOutGain = fOutGain; } void EqParams::loadFromTtlFile(const char *uri) { #ifdef USE_SLV2 //Load from ttl SLV2World lv2World = slv2_world_new(); slv2_world_load_all(lv2World); SLV2Plugins lv2Plugins = slv2_world_get_all_plugins(lv2World); SLV2Plugin lv2ThisPlugin = slv2_plugins_get_by_uri(lv2Plugins, slv2_value_new_uri(lv2World, uri)); //Load Data from plugin SLV2Value lv2Symbol; SLV2Value min, max, def; SLV2Port port; //Get InputGain lv2Symbol = slv2_value_new_string(lv2World, "input_gain"); port = slv2_plugin_get_port_by_symbol(lv2ThisPlugin, lv2Symbol); slv2_port_get_range(lv2ThisPlugin, port, &def, &min, &max); m_fInGain = slv2_value_as_float(def); //Get OutputGain lv2Symbol = slv2_value_new_string(lv2World, "output_gain"); port = slv2_plugin_get_port_by_symbol(lv2ThisPlugin, lv2Symbol); slv2_port_get_range(lv2ThisPlugin, port, &def, &min, &max); m_fOutGain = slv2_value_as_float(def); std::string sSymbol; char buffer[50]; for(int i = 0; i < m_iNumberOfBands; i ++) { //Get Band Gain sprintf (buffer, "filter%d_gain", i+1); sSymbol = buffer; lv2Symbol = slv2_value_new_string(lv2World, sSymbol.c_str()); port = slv2_plugin_get_port_by_symbol(lv2ThisPlugin, lv2Symbol); slv2_port_get_range(lv2ThisPlugin, port, &def, &min, &max); m_ptr_BandArray[i].fGain = slv2_value_as_float(def); //Get Band Freq sprintf (buffer, "filter%d_freq", i+1); sSymbol = buffer; lv2Symbol = slv2_value_new_string(lv2World, sSymbol.c_str()); port = slv2_plugin_get_port_by_symbol(lv2ThisPlugin, lv2Symbol); slv2_port_get_range(lv2ThisPlugin, port, &def, &min, &max); m_ptr_BandArray[i].fFreq = slv2_value_as_float(def); //Get Band Q sprintf (buffer, "filter%d_q", i+1); sSymbol = buffer; lv2Symbol = slv2_value_new_string(lv2World, sSymbol.c_str()); port = slv2_plugin_get_port_by_symbol(lv2ThisPlugin, lv2Symbol); slv2_port_get_range(lv2ThisPlugin, port, &def, &min, &max); m_ptr_BandArray[i].fQ = slv2_value_as_float(def); //Get Band Type sprintf (buffer, "filter%d_type", i+1); sSymbol = buffer; lv2Symbol = slv2_value_new_string(lv2World, sSymbol.c_str()); port = slv2_plugin_get_port_by_symbol(lv2ThisPlugin, lv2Symbol); slv2_port_get_range(lv2ThisPlugin, port, &def, &min, &max); m_ptr_BandArray[i].iType = (int) slv2_value_as_float(def); //Get Band Enabled sprintf (buffer, "filter%d_enable", i+1); sSymbol = buffer; lv2Symbol = slv2_value_new_string(lv2World, sSymbol.c_str()); port = slv2_plugin_get_port_by_symbol(lv2ThisPlugin, lv2Symbol); slv2_port_get_range(lv2ThisPlugin, port, &def, &min, &max); m_ptr_BandArray[i].bIsEnabled = slv2_value_as_float(def) > 0.5; } //Free all slv2_value_free(lv2Symbol); slv2_value_free(min); slv2_value_free(max); slv2_value_free(def); slv2_plugins_free(lv2World, lv2Plugins); slv2_world_free(lv2World); #else m_fInGain = 0; m_fOutGain = 0; float cur_freq = 30.0; for(int i = 0; i < m_iNumberOfBands; i ++) { m_ptr_BandArray[i].fGain = 0; m_ptr_BandArray[i].fQ = 2; m_ptr_BandArray[i].iType = 11; m_ptr_BandArray[i].bIsEnabled = 0; m_ptr_BandArray[i].fFreq = cur_freq; switch(m_iNumberOfBands) { case 4: cur_freq *=5.0; break; case 6: cur_freq *=3.0; break; case 10: cur_freq *=2.0; break; default: m_ptr_BandArray[i].fFreq = 1000; break; } } #endif } bool EqParams::loadFromFile(const char* path) { int preBandCount; int signature; std::ifstream f; f.open(path, std::ofstream::in); f.read((char*)(&signature), sizeof(signature)); if (signature != EQ10Q_SIGNATURE) { f.close(); return false; } f.read((char*)(&preBandCount), sizeof (preBandCount)); if(m_iNumberOfBands != preBandCount) { f.close(); return false; } f.read((char*)(&m_fInGain), sizeof (m_fInGain)); f.read((char*)(&m_fOutGain), sizeof (m_fOutGain)); f.read((char*)(m_ptr_BandArray), sizeof(EqBandStruct) * m_iNumberOfBands); f.close(); return true; } void EqParams::saveToFile(const char* path) { std::ofstream f; int signature = EQ10Q_SIGNATURE; f.open(path, std::ofstream::out); f.write((const char*)(&signature), sizeof(signature)); f.write((const char*)(&m_iNumberOfBands), sizeof (m_iNumberOfBands)); f.write((const char*)(&m_fInGain), sizeof (m_fInGain)); f.write((const char*)(&m_fOutGain), sizeof (m_fOutGain)); f.write((const char*)(m_ptr_BandArray), sizeof(EqBandStruct) * m_iNumberOfBands); f.close(); } eq10q-2.2/gui/widgets/midsidewindow.h0000644000175000001440000001160613023240626017142 0ustar sapistausers/*************************************************************************** * Copyright (C) 2015 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef MIDSIDE_MAIN_WIN_H #define MIDSIDE_MAIN_WIN_H #include #include #include #include #include #include //LV2 UI header #include #include "mainwidget.h" #include "vuwidget.h" #include "knob2.h" #include "toggle_button.h" #include "sidechainbox.h" #define PORT_AUDIO_IN_1 0 #define PORT_AUDIO_IN_2 1 #define PORT_AUDIO_OUT_1 2 #define PORT_AUDIO_OUT_2 3 #define PORT_GAIN_IN_1 4 #define PORT_GAIN_IN_2 5 #define PORT_GAIN_OUT_1 6 #define PORT_GAIN_OUT_2 7 #define PORT_SOLO_IN_1 8 #define PORT_SOLO_IN_2 9 #define PORT_SOLO_OUT_1 10 #define PORT_SOLO_OUT_2 11 #define PORT_VU_IN_1 12 #define PORT_VU_IN_2 13 #define PORT_VU_OUT_1 14 #define PORT_VU_OUT_2 15 using namespace sigc; class MidSideMainWindow : public MainWidget { public: MidSideMainWindow(const char *uri, std::string bundlePath, bool isLR2MS); virtual ~MidSideMainWindow(); // Informing GUI about changes in the control ports void gui_port_event(LV2UI_Handle ui, uint32_t port, uint32_t buffer_size, uint32_t format, const void * buffer) { float data = * static_cast(buffer); // Checking if params are the same as specified in the LV2 documentation if (format != 0) { return; } if (buffer_size != 4) { return; } // Updating values in GUI ======================================================== switch (port) { case PORT_GAIN_IN_1: m_InGain1->set_value(data); break; case PORT_GAIN_IN_2: m_InGain2->set_value(data); break; case PORT_GAIN_OUT_1: m_OutGain1->set_value(data); break; case PORT_GAIN_OUT_2: m_OutGain2->set_value(data); break; case PORT_SOLO_IN_1: m_InSolo1.set_active(data > 0.5); break; case PORT_SOLO_IN_2: m_InSolo2.set_active(data > 0.5); break; case PORT_SOLO_OUT_1: m_OutSolo1.set_active(data > 0.5); break; case PORT_SOLO_OUT_2: m_OutSolo2.set_active(data > 0.5); break; case PORT_VU_IN_1: m_InputVu1->setValue(0,data); break; case PORT_VU_IN_2: m_InputVu2->setValue(0,data); break; case PORT_VU_OUT_1: m_OutputVu1->setValue(0,data); break; case PORT_VU_OUT_2: m_OutputVu2->setValue(0,data); break; } } LV2UI_Controller controller; LV2UI_Write_Function write_function; protected: KnobWidget2 *m_InGain1, *m_InGain2, *m_OutGain1, *m_OutGain2; ToggleButton m_InSolo1, m_InSolo2, m_OutSolo1, m_OutSolo2; VUWidget *m_InputVu1, *m_InputVu2, *m_OutputVu1, *m_OutputVu2; Gtk::HBox m_HTopBox, m_HInBox, m_HOutBox; Gtk::VBox m_In1Box, m_In2Box, m_Out1Box, m_Out2Box, m_VTopBox; SideChainBox m_In1Frame, m_In2Frame, m_Out1Frame, m_Out2Frame; Gtk::Alignment m_InAlng1, m_InAlng2, m_OutAlng1, m_OutAlng2; Gtk::Alignment m_InVuAlng1, m_InVuAlng2, m_OutVuAlng1, m_OutVuAlng2; Gtk::Alignment m_InSoloAlng1, m_InSoloAlng2, m_OutSoloAlng1, m_OutSoloAlng2, m_labAlng; Gtk::Label m_LabTitle; //Signal Handlers void onInGain1Change(); void onInGain2Change(); void onOutGain1Change(); void onOutGain2Change(); void onInSolo1Change(); void onInSolo2Change(); void onOutSolo1Change(); void onOutSolo2Change(); void resetSoloState(); private: std::string m_pluginUri; std::string m_bundlePath; bool m_bisLR2MS; }; #endifeq10q-2.2/gui/widgets/knob2.cpp0000644000175000001440000003133413023240626015642 0ustar sapistausers/*************************************************************************** * Copyright (C) 2011 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include "knob2.h" #include "colors.h" #include //For the function Gdk::Cairo::set_source_pixbuf() //#include //Switched back to gdkmm.h for cairo portability problems #define KNOB_RADIUS 0.4 #define SCROLL_EVENT_PERCENT 0.005 #define MOUSE_EVENT_PERCENT 0.008 #define KNOB_CENTER_X 0.5 #define KNOB_CENTER_Y 0.5 #define TEXT_SIZE 22 #define KNOB_R_CALIBRATION 0.93 #define SLOW_MOTION_MULTIPLIER 0.05 KnobWidget2::KnobWidget2(float fMin, float fMax, std::string sLabel, std::string sUnits, const char *knobIconPath, int iType, bool snap2ZerodB ): m_fMin(fMin), m_fMax(fMax), bMotionIsConnected(false), m_Value(fMin), m_Label(sLabel), m_Units(sUnits), m_TypeKnob(iType), mouse_move_ant(0), m_snap2Zero(snap2ZerodB), m_focus(false), m_slowMultiplier(1.0), m_knobIconPath(knobIconPath) { m_image_ptr = Gdk::Pixbuf::create_from_file(m_knobIconPath); // Detect transparent colors for loaded image Cairo::Format format = Cairo::FORMAT_RGB24; if (m_image_ptr->get_has_alpha()) { format = Cairo::FORMAT_ARGB32; } // Create a new ImageSurface m_image_surface_ptr = Cairo::ImageSurface::create (format, m_image_ptr->get_width(), m_image_ptr->get_height()); // Create the new Context for the ImageSurface m_image_context_ptr = Cairo::Context::create (m_image_surface_ptr); // Draw the image on the new Context Gdk::Cairo::set_source_pixbuf (m_image_context_ptr, m_image_ptr, 0.0, 0.0); m_image_context_ptr->paint(); //Size Request acording knob image set_size_request((int)(1.5*(double)(m_image_ptr->get_width())), TEXT_SIZE + (int)(1.5*(double)(m_image_ptr->get_height()))); add_events(Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::POINTER_MOTION_MASK | Gdk::SCROLL_MASK | Gdk::LEAVE_NOTIFY_MASK); signal_button_press_event().connect(sigc::mem_fun(*this, &KnobWidget2::on_button_press_event),true); signal_button_release_event().connect(sigc::mem_fun(*this, &KnobWidget2::on_button_release_event),true); signal_scroll_event().connect(sigc::mem_fun(*this, &KnobWidget2::on_scrollwheel_event),true); signal_motion_notify_event().connect(sigc::mem_fun(*this, &KnobWidget2::on_mouse_motion_event),true); signal_leave_notify_event().connect(sigc::mem_fun(*this, &KnobWidget2::on_mouse_leave_widget),true); } KnobWidget2::~KnobWidget2() { } KnobWidget2::signal_KnobChanged KnobWidget2::signal_changed() { return m_KnobChangedSignal; } void KnobWidget2::set_value(float fValue) { m_Value = fValue; m_Value = m_Value < m_fMin ? m_fMin : m_Value; m_Value = m_Value > m_fMax ? m_fMax : m_Value; redraw(); } double KnobWidget2::get_value() { return m_Value; } void KnobWidget2::redraw() { Glib::RefPtr win = get_window(); if(win) { Gdk::Rectangle r(0, 0, get_allocation().get_width(), get_allocation().get_height()); win->invalidate_rect(r, false); } } bool KnobWidget2::on_mouse_leave_widget(GdkEventCrossing* event) { if(!bMotionIsConnected) { m_slowMultiplier = 1.0; m_focus = false; redraw(); } return true; } //Mouse events bool KnobWidget2::on_button_press_event(GdkEventButton* event) { int x,y; get_pointer(x,y); if( x > 0 && x < width && y > 0 && y < width && //I use width for y becous knob must be square, this discards text area event->type == GDK_BUTTON_PRESS) //Only grab single click { mouse_move_ant = y; if(event->button == 1) { bMotionIsConnected = true; m_slowMultiplier = 1.0; } else if(event->button == 3) { bMotionIsConnected = true; m_slowMultiplier = SLOW_MOTION_MULTIPLIER; } } return true; } bool KnobWidget2::on_button_release_event(GdkEventButton* event) { bMotionIsConnected = false; return true; } bool KnobWidget2::on_mouse_motion_event(GdkEventMotion* event) { if(bMotionIsConnected) { double increment = 0.0; switch(m_TypeKnob) { case KNOB_TYPE_FREQ: increment = m_slowMultiplier * MOUSE_EVENT_PERCENT*(m_fMax - m_fMin)*0.0002*m_Value; break; case KNOB_TYPE_LIN: increment = m_slowMultiplier * MOUSE_EVENT_PERCENT*(m_fMax - m_fMin); break; case KNOB_TYPE_TIME: increment = m_slowMultiplier * MOUSE_EVENT_PERCENT*5.0*(m_Value + 1.0); break; } float val = 0.0f; bool ismoving = false; if(event->y - mouse_move_ant < 0) { //Move up val = m_Value + increment*(abs(event->y - mouse_move_ant)); ismoving = true; } if(event->y - mouse_move_ant > 0) { //Move down val = m_Value - increment*(abs(event->y - mouse_move_ant)); ismoving = true; } //Snap to 0 dB if(m_snap2Zero && val < 0.5f && val > -0.5f) { val = 0.0f; } if(ismoving) { set_value(val); } mouse_move_ant = event->y; m_KnobChangedSignal.emit(); } else { //Grab focus if mouse over knob m_focus = event->x > 0 && event->x < width && event->y > 0 && event->y < width; redraw(); } return true; } bool KnobWidget2::on_scrollwheel_event(GdkEventScroll* event) { double increment = 0.0; switch(m_TypeKnob) { case KNOB_TYPE_FREQ: increment = SCROLL_EVENT_PERCENT*(m_fMax - m_fMin)*0.0001*m_Value; break; case KNOB_TYPE_LIN: increment = SCROLL_EVENT_PERCENT*(m_fMax - m_fMin); break; case KNOB_TYPE_TIME: increment = SCROLL_EVENT_PERCENT*5.0*(m_Value + 1.0); break; } if (event->direction == GDK_SCROLL_UP) { // up code set_value(m_Value + increment); } else if (event->direction == GDK_SCROLL_DOWN) { // down code set_value(m_Value - increment); } m_KnobChangedSignal.emit(); return true; } //Drawing Knob bool KnobWidget2::on_expose_event(GdkEventExpose* event) { Glib::RefPtr window = get_window(); if(window) { Gtk::Allocation allocation = get_allocation(); width = allocation.get_width(); height = allocation.get_height(); Cairo::RefPtr cr = window->create_cairo_context(); //Clip inside acording the expose event cr->rectangle(event->area.x, event->area.y, event->area.width, event->area.height); cr->clip(); cr->set_source_rgb(BACKGROUND_R, BACKGROUND_G, BACKGROUND_B); cr->paint(); //Fill all with background color //Set text Glib::RefPtr pangoLayout = Pango::Layout::create(cr); Pango::FontDescription font_desc("sans 9px"); pangoLayout->set_font_description(font_desc); cr->move_to(0, height - TEXT_SIZE); cr->set_source_rgba(0.9, 0.9, 0.9, 1.0); pangoLayout->update_from_cairo_context(cr); //gets cairo cursor position pangoLayout->set_text(m_Label); pangoLayout->set_width(Pango::SCALE * width); pangoLayout->set_alignment(Pango::ALIGN_CENTER); pangoLayout->show_in_cairo_context(cr); cr->stroke(); cr->move_to(0, height - TEXT_SIZE/2); cr->set_source_rgba(0.9, 0.9, 0.9, 1.0); pangoLayout->update_from_cairo_context(cr); //gets cairo cursor position std::stringstream ss; ss.precision(1); if(m_TypeKnob == KNOB_TYPE_FREQ && m_Value >= 1000.0) { ss<= 1000.0) { ss<set_text(ss.str()); pangoLayout->set_width(Pango::SCALE * width); pangoLayout->set_alignment(Pango::ALIGN_CENTER); pangoLayout->show_in_cairo_context(cr); cr->stroke(); cr->save(); //Calc konb angle (pos) double pos = 0.0, m, n; switch(m_TypeKnob) { case KNOB_TYPE_FREQ: case KNOB_TYPE_TIME: m = (1.48*M_PI)/log10(m_fMax/m_fMin); n = 0.76*M_PI; pos = m*log10(m_Value/m_fMin) + n; break; case KNOB_TYPE_LIN: m = (1.48*M_PI)/(m_fMax-m_fMin); n = 0.76*M_PI - m*m_fMin; pos = m*m_Value + n; break; } //Scale to 1 cr->rectangle(0, 0, width,height - TEXT_SIZE); cr->clip(); cr->scale(width,height - TEXT_SIZE); //Draw glow, mouse is over if(m_focus) { Cairo::RefPtr glow_gradient_ptr = Cairo::RadialGradient::create( KNOB_CENTER_X, KNOB_CENTER_Y, KNOB_RADIUS - 0.1, KNOB_CENTER_X, KNOB_CENTER_Y, KNOB_RADIUS + 0.1); glow_gradient_ptr->add_color_stop_rgba (0, 0.4, 0.6, 0.8, 0.6); glow_gradient_ptr->add_color_stop_rgba (1, BACKGROUND_R, BACKGROUND_G, BACKGROUND_B, 0.1); cr->set_source( glow_gradient_ptr); cr->set_line_width(0.8); cr->arc(KNOB_CENTER_X, KNOB_CENTER_Y, 0.2, 0.0, 2.0 * M_PI); cr->stroke(); } //Draw Background gradient full circle Cairo::RefPtr bkg_gradient_ptr = Cairo::RadialGradient::create( KNOB_CENTER_X, KNOB_CENTER_Y, KNOB_RADIUS - 0.08, KNOB_CENTER_X, KNOB_CENTER_Y, KNOB_RADIUS + 0.1); bkg_gradient_ptr->add_color_stop_rgba (0, 0.0, 0.8, 0.3, 0.2); bkg_gradient_ptr->add_color_stop_rgba (1, BACKGROUND_R, BACKGROUND_G, BACKGROUND_B, 0.1); cr->set_source( bkg_gradient_ptr); cr->set_line_width(0.8); cr->arc(KNOB_CENTER_X, KNOB_CENTER_Y, 0.2, 0.0, 2.0 * M_PI); cr->stroke(); //Draw colored circle Cairo::RefPtr rad_gradient_ptr = Cairo::RadialGradient::create( KNOB_CENTER_X, KNOB_CENTER_Y, KNOB_RADIUS - 0.08, KNOB_CENTER_X, KNOB_CENTER_Y, KNOB_RADIUS + 0.1); rad_gradient_ptr->add_color_stop_rgba (0, 0.0, 1.0, 0.0, 0.8); rad_gradient_ptr->add_color_stop_rgba (1, BACKGROUND_R, BACKGROUND_G, BACKGROUND_B, 0.1); cr->set_source( rad_gradient_ptr); cr->set_line_width(0.2); cr->arc(KNOB_CENTER_X, KNOB_CENTER_Y, KNOB_RADIUS + 0.04, 0.76 * M_PI, pos); cr->stroke(); //Draw color circle frame cr->set_source_rgba(BACKGROUND_R + 0.4, BACKGROUND_G + 0.4, BACKGROUND_B + 0.4, 1.0); cr->set_line_width(1.0/width); //cr->set_line_width(0.01); cr->arc(KNOB_CENTER_X, KNOB_CENTER_Y, KNOB_RADIUS + 0.04, 0.76 * M_PI, 0.24 * M_PI); cr->arc(KNOB_CENTER_X, KNOB_CENTER_Y, KNOB_RADIUS - 0.06, 0.24 * M_PI, 2.76*M_PI); cr->close_path(); cr->stroke(); cr->set_source_rgba(0.0, 0.6, 0.6, 0.1); cr->set_line_width(0.1); std::valarray< double > dashes(2); dashes[0] = 0.01;//1.0/width; dashes[1] = 0.02;//4.0/width; cr->set_dash (dashes, 0.5); cr->arc(KNOB_CENTER_X, KNOB_CENTER_Y, KNOB_RADIUS - 0.01, 0.76 * M_PI, 0.24 * M_PI); cr->stroke(); cr->restore(); //Draw knob and rotate cr->save(); cr->translate(width/2, (height-TEXT_SIZE)/2); cr->rotate(pos + KNOB_R_CALIBRATION); //Draw the knob icon cr->set_source (m_image_surface_ptr, -m_image_surface_ptr->get_width()/2, -m_image_surface_ptr->get_height()/2); cr->rectangle (-m_image_surface_ptr->get_width()/2, -m_image_surface_ptr->get_height()/2, m_image_surface_ptr->get_width(), m_image_surface_ptr->get_height()); cr->clip(); cr->paint(); cr->restore(); } return true; }eq10q-2.2/gui/widgets/bandctl.h0000644000175000001440000001345013023240626015702 0ustar sapistausers/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef BAND_CTL_H #define BAND_CTL_H #include "filter.h" #include #include #include #include #include #include class BandCtl : public Gtk::DrawingArea { public: BandCtl(const int iBandNum,bool *bSemafor, const char* bundlepath, bool isStereo = false); virtual ~BandCtl(); float getGain(); float getFreq(); float getQ(); float getFilterType(); bool getEnabled(); void setGain(float fGain); void setFreq(float fFreq); void setQ(float fQ); void setFilterType(float fType); void setEnabled(bool bIsEnabled); enum MSState { ML, DUAL, SR}; void setStereoMode(bool bIsMidSide); void setStereoState(MSState state); MSState getStereoState(); void glowBand(bool glow); //signal accessor: //Parameters: //int -> BandNumber //int -> field(gain, freq, Q, type, ON/OFF) //Float -> value typedef sigc::signal signal_ctlBandChanged; signal_ctlBandChanged signal_changed(); typedef sigc::signal signal_MidSideChanged; signal_MidSideChanged signal_mid_side_changed(); typedef sigc::signal signal_BandSelected; signal_BandSelected signal_band_selected(); typedef sigc::signal signal_BandUnSelected; signal_BandUnSelected signal_band_unselected(); protected: //Signal Handlers virtual void on_menu_lpf(); virtual void on_menu_hpf(); virtual void on_menu_loshelf(); virtual void on_menu_hishelf(); virtual void on_menu_peak(); virtual void on_menu_notch(); virtual void on_menu_hide(); //Mouse grab signal handlers virtual bool on_button_press_event(GdkEventButton* event); virtual bool on_button_release_event(GdkEventButton* event); virtual bool on_scrollwheel_event(GdkEventScroll* event); virtual bool on_mouse_motion_event(GdkEventMotion* event); virtual bool on_mouse_leave_widget(GdkEventCrossing* event); virtual bool on_key_press_event(GdkEventKey* event); virtual bool on_focus_out_event(GdkEventFocus* event); virtual void redraw(); virtual void redraw_MidSide_widget(); //Override default signal handler: virtual bool on_expose_event(GdkEventExpose* event); //TODO remove?? //Keyboard signal handler //sigc::connection keyPressEvent; private: //Internal structur representing a button in Gtk::DrawingArea struct Button { double x0, y0, x1, y1; bool focus; bool pressed; bool text; //Entring text with keyboard to this widget std::stringstream ss; float value; std::string units; float max, min; }; bool m_bBtnInitialized; struct MidSide_Button { double x0, y0, x1, y1; double Mx, Dx, Sx; bool ML_focus, Dual_focus, SR_focus; bool ML_pressed, Dual_pressed, SR_pressed; bool MidSideMode; MSState State; }; Button m_EnableBtn, m_TypeBtn, m_GainBtn, m_FreqBtn, m_QBtn; MidSide_Button m_MidSideBtn; Gtk::Menu* m_TypePopUp; Gtk::Image *icon_lpf, *icon_hpf, *icon_loShel, *icon_hiShel, *icon_peak, *icon_notch; Gtk::ImageMenuItem *itm_lpf, *itm_hpf, *itm_loShel, *itm_hiShel, *itm_peak, *itm_notch; FilterType m_FilterType; int m_iBandNum; bool m_bBandIsEnabled; std::string m_budlepath; Glib::ustring m_BandTitle; int width, height; int m_iAntValueX, m_iAntValueY; Gdk::Color m_Color; int m_HpfLpf_slope; bool m_bGlowBand; bool m_bIsStereoPlugin; Glib::RefPtr m_img_ptr_lpf, m_img_ptr_hpf, m_img_ptr_loshelf, m_img_ptr_hishelf, m_img_ptr_peak, m_img_ptr_notch; Cairo::RefPtr m_image_surface_ptr; Cairo::RefPtr< Cairo::Context> m_image_context_ptr; void loadTypeImg(); bool parseBtnString(Button *btn); void drawBandButton(Button *btn, Cairo::RefPtr cr); void setFilterTypeLPFHPFAcordSlope(); //Cairo surface for Mid Side button Cairo::RefPtr m_midSide_surface_ptr; //Band change signal signal_ctlBandChanged m_bandChangedSignal; signal_BandSelected m_bandSelectedSignal; signal_BandUnSelected m_bandUnSelectedSignal; signal_MidSideChanged m_midsideChangedSignal; }; #endif eq10q-2.2/gui/widgets/bodeplot.h0000644000175000001440000001772113023240626016110 0ustar sapistausers/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef PLOT_BODE_CURVE_H #define PLOT_BODE_CURVE_H #include #include #include "filter.h" #include "../eq_defines.h" #define MIN_FREQ 18.0 #define MAX_FREQ 22000.0 #define MIN_SPAN_DEC 0.5 #define CURVE_NUM_OF_POINTS 1000 #define GRID_VERTICAL_LINES 28 #define CURVE_MARGIN 8 #define CURVE_BORDER 1.5 #define CURVE_TEXT_OFFSET_X 18 #define CURVE_TEXT_OFFSET_Y 38 #define ZOOM_WIDGET_BORDER_Y 22 #define PLOT_HIGHT 300 #define PLOT_WIDTH 500 #define SCROLL_EVENT_INCREMENT 0.3 #define AUTO_REFRESH_TIMEOUT_MS 20 #define SPECTROGRAM_LINE_THICKNESS 3.0 typedef struct { float Gain; float Freq; float Q; bool bIsOn; FilterType fType; }FilterBandParams; class PlotEQCurve : public Gtk::DrawingArea { public: PlotEQCurve(int iNumOfBands, int channels); virtual ~PlotEQCurve(); void resetCurve(); virtual void setBandGain(int bd_ix, float newGain); virtual void setBandFreq(int bd_ix, float newFreq); virtual void setBandQ(int bd_ix, float newQ); virtual void setBandType(int bd_ix, int newType); virtual void setBandEnable(int bd_ix, bool bIsEnabled); virtual void setBypass(bool bypass); virtual void setSampleRate(double samplerate); virtual void setFftData(double *fft_data); virtual void setFftActive(bool active, bool isSpectrogram); virtual void setFftGain(double g); virtual void setFftRange(double r); virtual void setFftHold(bool hold); virtual void setPlotdBRange(double range); virtual void glowBand(int band); virtual void unglowBands(); enum MSState { ML, DUAL, SR, MONO}; void setStereoState(int band, MSState state); //signal accessor: //Slot prototype: void on_band_changed(int band_ix, float Gain, float Freq, float Q); typedef sigc::signal signal_BandChanged; signal_BandChanged signal_changed(); //Slot prototype: void on_band_enabled(int band_ix, bool enabled); typedef sigc::signal signal_BandEnabled; signal_BandEnabled signal_enabled(); //Slot prototype: void on_band_selected(int band_ix, bool enabled); typedef sigc::signal signal_BandSelected; signal_BandSelected signal_selected(); //Slot prototype: void on_band_selected(int band_ix, bool enabled); typedef sigc::signal signal_BandUnselected; signal_BandUnselected signal_unselected(); protected: //Mouse grab signal handlers virtual bool on_button_press_event(GdkEventButton* event); virtual bool on_button_release_event(GdkEventButton* event); virtual bool on_scrollwheel_event(GdkEventScroll* event); virtual bool on_mouse_motion_event(GdkEventMotion* event); virtual bool on_timeout_redraw(); virtual bool on_mouse_leave_widget(GdkEventCrossing* event); virtual void cueBandRedraws(int band); virtual void redraw_background_widget(); virtual void redraw_zoom_widget(); virtual void redraw_curve_widgets(int band); virtual void redraw_main_curve(); virtual void redraw_grid_widget(); virtual void redraw_xAxis_widget(); virtual void redraw_yAxis_widget(); virtual void redraw_fft_widget(); virtual void redraw_cursor(double x, double y); //Override default signal handler: virtual bool on_expose_event(GdkEventExpose* event); private: int width, height; int m_TotalBandsCount; int m_NumChannels; bool m_Bypass; int m_iBandSel; bool bMotionIsConnected; bool bBandFocus; bool *m_Bands2Redraw; bool m_BandRedraw, m_fullRedraw, m_justRedraw; double SampleRate; bool m_FftActive; double m_minFreq, m_maxFreq; double m_dB_plot_range; //To hadle mouse mouve events sigc::connection m_motion_connection; //Store filters data FilterBandParams **m_filters; //This pointer is initialized by construcor to an array of total num of bands //X axes LUT tables int xPixels_Grid[GRID_VERTICAL_LINES]; //Pixels used to draw the grind in logspace double *f; //This pointer is initialized by construcor to an array of total num of points acording min/max freq define int *xPixels; //This pointer is initialized by construcor to an array of total num of points, each item is the pixel space transaltion of corresponding freq //Curve vector for Y axes in dB units double **main_y; //This pointer is initialized by construcor to an array of total num of points acording the format main_y[channel][num_points] double **band_y; //This pointer is initialized by construcor to an array acording the format band_y[bd_ix][num_points] MSState *band_state; //A vector containing the Stereo states for each band //FFT vectors double *xPixels_fft, *xPixels_fft_bins; double *fft_pink_noise; double *fft_plot; double *fft_ant_data; double fft_gain; double fft_range; float *fft_log_lut; bool m_bIsSpectrogram, m_bFftHold; double *fft_raw_data; //Zoom widget data struct zoom_widget { bool center_focus; bool f1_focus; bool f2_focus; double x1; double x2; double x_ant; bool center_press; bool f1_press; bool f2_press; } m_zoom_widget; //Cairo surfaces Cairo::RefPtr m_background_surface_ptr, m_fft_surface_ptr, m_zoom_surface_ptr, *m_curve_surface_ptr, m_maincurve_surface_ptr, m_grid_surface_ptr, m_xAxis_surface_ptr, m_yAxis_surface_ptr, m_cursor_surface_ptr; //Bode change signal signal_BandChanged m_BandChangedSignal; signal_BandEnabled m_BandEnabledSignal; signal_BandSelected m_BandSelectedSignal; signal_BandUnselected m_BandUnselectedSignal; //Function for dB to pixels convertion double dB2Pixels(double db); //Function for Hz to pixels convertion double freq2Pixels(double f); //Function for pixels to dB convertion double Pixels2dB(double pixels); //Function for pixels to Hz convertion double Pixels2freq(double pixels); //Compute a filter points void ComputeFilter(int bd_ix); //Curve math functions void CalcBand_DigitalFilter(int bd_ix); //Compute zoom bar virtual void setCenterSpan(double center, double span); virtual void resetCenterSpan(); virtual void setCenter(double center); virtual void setSpan(double span); void recomputeMinFreq_fromX1Pixel(double x1); void recomputeMaxFreq_fromX2Pixel(double x2); void recomputeCenterFreq(double xDiff); }; #endifeq10q-2.2/gui/widgets/abbutton.cpp0000644000175000001440000001157013023240626016445 0ustar sapistausers/*************************************************************************** * Copyright (C) 2015 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "abbutton.h" #include "colors.h" #define TXT_MARGIN 10 AbButton::AbButton(): ToggleButton() { set_size_request( 60 ,20); } AbButton::~AbButton() { } bool AbButton::on_expose_event(GdkEventExpose* event) { Glib::RefPtr window = get_window(); if(window) { Gtk::Allocation allocation = get_allocation(); width = allocation.get_width(); height = allocation.get_height(); Cairo::RefPtr cr = window->create_cairo_context(); //Paint backgroud cr->save(); cr->set_source_rgb(BACKGROUND_R, BACKGROUND_G, BACKGROUND_B); cr->paint(); //Fill all with background color cr->restore(); //Draw a box cr->save(); cr->begin_new_sub_path(); cr->arc( 3 + 0.5, 3 + 0.5, 3, M_PI, -0.5*M_PI); cr->arc( width - 1 - 3 - 0.5, 3 + 0.5, 3, -0.5*M_PI, 0); cr->arc( width - 1 - 3 - 0.5, height - 1 - 3 - 0.5, 3, 0.0, 0.5*M_PI); cr->arc( 3 + 0.5, height - 1 - 3 - 0.5, 3, 0.5*M_PI, M_PI); cr->close_path(); cr->set_source_rgba(0.1,0.1,0.1,0.8); cr->fill_preserve(); if(m_bFocus) { cr->set_line_width(1.5); cr->set_source_rgba(0,1,1, 0.6); cr->stroke_preserve(); } cr->set_line_width(1); cr->set_source_rgba(1,1,1, 0.4); cr->stroke(); cr->restore(); //Draw the text cr->save(); Glib::RefPtr pangoLayout = Pango::Layout::create(cr); Pango::FontDescription font_desc("sans 12px"); pangoLayout->set_font_description(font_desc); pangoLayout->set_text("B"); cr->move_to(TXT_MARGIN, height/2 - 7); cr->set_source_rgba(0.9, 0.9, 0.9, 0.8); pangoLayout->show_in_cairo_context(cr); cr->stroke(); pangoLayout->set_text("A"); cr->move_to(width/2 + TXT_MARGIN, height/2 - 7); cr->set_source_rgba(0.9, 0.9, 0.9, 0.8); pangoLayout->show_in_cairo_context(cr); cr->stroke(); cr->restore(); //Draw the button cr->save(); cr->begin_new_sub_path(); double x = 0; if(!m_bActive) { x = width/2; } cr->arc( 5 + 0.5 + x, 5 + 0.5, 3, M_PI, -0.5*M_PI); cr->arc( width/2 - 1 - 5 - 0.5 + x, 5 + 0.5, 3, -0.5*M_PI, 0); cr->arc( width/2 - 1 - 5 - 0.5 + x, height - 1 - 5 - 0.5, 3, 0.0, 0.5*M_PI); cr->arc( 5 + 0.5 + x, height - 1 - 5 - 0.5, 3, 0.5*M_PI, M_PI); cr->close_path(); Cairo::RefPtr bkg_gradient_ptr = Cairo::LinearGradient::create(width/2, 0, width/2, height - 1); bkg_gradient_ptr->add_color_stop_rgba (0.0, 0.2, 0.2, 0.2, 1 ); bkg_gradient_ptr->add_color_stop_rgba (0.4, 0.5, 0.5, 0.5, 1 ); bkg_gradient_ptr->add_color_stop_rgba (0.6, 0.5, 0.5, 0.5, 1 ); bkg_gradient_ptr->add_color_stop_rgba (1.0, 0.3, 0.3, 0.3, 1 ); cr->set_source(bkg_gradient_ptr); cr->fill_preserve(); cr->set_line_width(1); cr->set_source_rgba(1,1,1, 0.5); cr->stroke(); cr->restore(); //Draw some vertical lines on button cr->save(); cr->move_to(8 + 0.5 + x, 5 + 0.5); cr->line_to(8 + 0.5 + x, height - 1 - 5 - 0.5); cr->move_to(12 + 0.5 + x, 5 + 0.5); cr->line_to(12 + 0.5 + x, height - 1 - 5 - 0.5); cr->move_to(16 + 0.5 + x, 5 + 0.5); cr->line_to(16 + 0.5 + x, height - 1 - 5 - 0.5); cr->move_to(20 + 0.5 + x, 5 + 0.5); cr->line_to(20 + 0.5 + x, height - 1 - 5 - 0.5); cr->set_line_width(1); cr->set_source_rgba(1,1,1,0.4); cr->stroke(); cr->restore(); } return true; } eq10q-2.2/gui/widgets/button.h0000644000175000001440000000466513023240626015616 0ustar sapistausers/*************************************************************************** * Copyright (C) 2015 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef EQ10Q_BUTTON_H #define EQ10Q_BUTTON_H #include class Button : public Gtk::DrawingArea { public: Button(const Glib::ustring& label); virtual ~Button(); void set_label(const Glib::ustring& label); //Slot prototype: void signal_clicked(); typedef sigc::signal signal_Click; signal_Click signal_clicked(); signal_Click signal_press(); signal_Click signal_release(); protected: //Override default signal handler: virtual bool on_expose_event(GdkEventExpose* event); virtual bool on_mouse_motion_event(GdkEventMotion* event); virtual bool on_button_press_event(GdkEventButton* event); virtual bool on_button_release_event(GdkEventButton* event); virtual bool on_mouse_leave_widget(GdkEventCrossing* event); void redraw(); Glib::ustring m_label; bool m_bFocus, m_bPress; int width, height; signal_Click m_sigClick; signal_Click m_sigPress; signal_Click m_sigRelease; }; #endifeq10q-2.2/gui/widgets/setwidgetcolors.cpp0000644000175000001440000001512313023240626020046 0ustar sapistausers/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "setwidgetcolors.h" #include "colors.h" SetWidgetColors::SetWidgetColors() { m_Button_BgColorNormal.set_rgb(GDK_COLOR_MACRO(BUTTON_BACKGROUND_R), GDK_COLOR_MACRO(BUTTON_BACKGROUND_G), GDK_COLOR_MACRO(BUTTON_BACKGROUND_B)); m_Button_BgColorActive.set_rgb(GDK_COLOR_MACRO(BUTTON_ACTIVE_BG_R), GDK_COLOR_MACRO(BUTTON_ACTIVE_BG_G), GDK_COLOR_MACRO(BUTTON_ACTIVE_BG_B)); m_Button_BgColorInactive.set_rgb(GDK_COLOR_MACRO(BUTTON_INACTIVE_BG_R), GDK_COLOR_MACRO(BUTTON_INACTIVE_BG_G), GDK_COLOR_MACRO(BUTTON_INACTIVE_BG_B)); m_Button_BgColorOver.set_rgb(GDK_COLOR_MACRO(BUTTON_OVER_BG_R), GDK_COLOR_MACRO(BUTTON_OVER_BG_G), GDK_COLOR_MACRO(BUTTON_OVER_BG_B)); m_Button_FgColor.set_rgb(GDK_COLOR_MACRO( FOREGROUND_R ), GDK_COLOR_MACRO( FOREGROUND_G ), GDK_COLOR_MACRO( FOREGROUND_B )); m_Button_TextColor.set_rgb(GDK_COLOR_MACRO( TEXT_R ), GDK_COLOR_MACRO( TEXT_G ), GDK_COLOR_MACRO( TEXT_B )); for(int i = 0; i<10; i++) { m_BandsColors[i].set(bandColorLUT[i]); } //Initialize the ButtonStyle Object PlainButtonStyle = Gtk::Style::create(); //Backround colors PlainButtonStyle->set_bg(Gtk::STATE_NORMAL, m_Button_BgColorNormal); PlainButtonStyle->set_bg(Gtk::STATE_ACTIVE, m_Button_BgColorActive); PlainButtonStyle->set_bg(Gtk::STATE_INSENSITIVE, m_Button_BgColorInactive); PlainButtonStyle->set_bg(Gtk::STATE_PRELIGHT, m_Button_BgColorOver); PlainButtonStyle->set_bg(Gtk::STATE_SELECTED, m_Button_BgColorNormal); //Base colors PlainButtonStyle->set_base(Gtk::STATE_NORMAL, m_Button_BgColorNormal); PlainButtonStyle->set_base(Gtk::STATE_ACTIVE, m_Button_BgColorActive); PlainButtonStyle->set_base(Gtk::STATE_INSENSITIVE, m_Button_BgColorInactive); PlainButtonStyle->set_base(Gtk::STATE_PRELIGHT, m_Button_BgColorOver); PlainButtonStyle->set_base(Gtk::STATE_SELECTED, m_Button_BgColorNormal); //Foreground PlainButtonStyle->set_fg(Gtk::STATE_NORMAL, m_Button_FgColor); PlainButtonStyle->set_fg(Gtk::STATE_ACTIVE, m_Button_FgColor); PlainButtonStyle->set_fg(Gtk::STATE_INSENSITIVE, m_Button_FgColor); PlainButtonStyle->set_fg(Gtk::STATE_PRELIGHT, m_Button_FgColor); PlainButtonStyle->set_fg(Gtk::STATE_SELECTED, m_Button_FgColor); //Text colors PlainButtonStyle->set_text(Gtk::STATE_NORMAL, Gdk::Color("#FFFFFF")); PlainButtonStyle->set_text(Gtk::STATE_ACTIVE, Gdk::Color("#FFFFFF")); PlainButtonStyle->set_text(Gtk::STATE_INSENSITIVE, Gdk::Color("#FFFFFF")); PlainButtonStyle->set_text(Gtk::STATE_PRELIGHT, Gdk::Color("#FFFFFF")); PlainButtonStyle->set_text(Gtk::STATE_SELECTED, Gdk::Color("#FFFFFF")); } Glib::RefPtr< Gtk::Style > SetWidgetColors::getPlainButtonStyle() { return PlainButtonStyle; } void SetWidgetColors::setButtonColors(Gtk::Button* widget) { widget->modify_bg(Gtk::STATE_NORMAL, m_Button_BgColorNormal); widget->modify_bg(Gtk::STATE_ACTIVE, m_Button_BgColorActive); widget->modify_bg(Gtk::STATE_INSENSITIVE, m_Button_BgColorInactive); widget->modify_bg(Gtk::STATE_PRELIGHT, m_Button_BgColorOver); widget->modify_bg(Gtk::STATE_SELECTED, m_Button_BgColorNormal); widget->modify_fg(Gtk::STATE_NORMAL, m_Button_FgColor); widget->modify_fg(Gtk::STATE_ACTIVE, m_Button_FgColor); widget->modify_fg(Gtk::STATE_INSENSITIVE, m_Button_FgColor); widget->modify_fg(Gtk::STATE_PRELIGHT, m_Button_FgColor); widget->modify_fg(Gtk::STATE_SELECTED, m_Button_FgColor); widget->get_child()->modify_fg(Gtk::STATE_NORMAL, m_Button_TextColor); widget->get_child()->modify_fg(Gtk::STATE_ACTIVE, m_Button_TextColor); widget->get_child()->modify_fg(Gtk::STATE_INSENSITIVE, m_Button_TextColor); widget->get_child()->modify_fg(Gtk::STATE_PRELIGHT, m_Button_TextColor); widget->get_child()->modify_fg(Gtk::STATE_SELECTED, m_Button_TextColor); } void SetWidgetColors::setGenericWidgetColors(Gtk::Widget* widget) { widget->modify_bg(Gtk::STATE_NORMAL, m_Button_BgColorNormal); widget->modify_bg(Gtk::STATE_ACTIVE, m_Button_BgColorActive); widget->modify_bg(Gtk::STATE_INSENSITIVE, m_Button_BgColorInactive); widget->modify_bg(Gtk::STATE_PRELIGHT, m_Button_BgColorOver); widget->modify_fg(Gtk::STATE_NORMAL, m_Button_FgColor); widget->modify_fg(Gtk::STATE_ACTIVE, m_Button_FgColor); widget->modify_fg(Gtk::STATE_INSENSITIVE, m_Button_FgColor); widget->modify_fg(Gtk::STATE_PRELIGHT, m_Button_FgColor); } void SetWidgetColors::setBandFrameColor(Gtk::Frame* widget, int band) { widget->modify_bg(Gtk::STATE_NORMAL, m_BandsColors[band]); widget->modify_bg(Gtk::STATE_ACTIVE, m_BandsColors[band]); widget->modify_bg(Gtk::STATE_INSENSITIVE, m_BandsColors[band]); widget->modify_bg(Gtk::STATE_PRELIGHT, m_BandsColors[band]); widget->modify_fg(Gtk::STATE_NORMAL, m_BandsColors[band]); widget->modify_fg(Gtk::STATE_ACTIVE, m_BandsColors[band]); widget->modify_fg(Gtk::STATE_INSENSITIVE, m_BandsColors[band]); widget->modify_fg(Gtk::STATE_PRELIGHT, m_BandsColors[band]); widget->get_label_widget()->modify_fg(Gtk::STATE_NORMAL, m_BandsColors[band]); widget->get_label_widget()->modify_fg(Gtk::STATE_ACTIVE, m_BandsColors[band]); widget->get_label_widget()->modify_fg(Gtk::STATE_INSENSITIVE, m_BandsColors[band]); widget->get_label_widget()->modify_fg(Gtk::STATE_PRELIGHT, m_BandsColors[band]); } eq10q-2.2/gui/widgets/toggle_button.h0000644000175000001440000000415113023240626017145 0ustar sapistausers/*************************************************************************** * Copyright (C) 2015 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef EQ10Q_TOGGLE_BUTTON_H #define EQ10Q_TOGGLE_BUTTON_H #include "button.h" class ToggleButton : public Button { public: ToggleButton ( const Glib::ustring& label = "" ); virtual ~ToggleButton(); virtual bool get_active(); virtual void set_active(bool active); static void drawLedBtn(Cairo::RefPtr cr, bool focus, bool enabled, std::string text, int margin, int radius, double red = 0.8, double green = 0.8, double blue = 0.5); protected: virtual bool on_button_release_event(GdkEventButton* event); //Override default signal handler: virtual bool on_expose_event(GdkEventExpose* event); bool m_bActive; }; #endifeq10q-2.2/gui/widgets/pixmapcombo.h0000644000175000001440000000516213023240626016612 0ustar sapistausers/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef PIXMAP_COMBOBOX_H #define PIXMAP_COMBOBOX_H #include #include #include #include #include #define RUTA_OFF "combopix/off.png" #define RUTA_LPF1 "combopix/lpf1.png" #define RUTA_LPF2 "combopix/lpf2.png" #define RUTA_LPF3 "combopix/lpf3.png" #define RUTA_LPF4 "combopix/lpf4.png" #define RUTA_HPF1 "combopix/hpf1.png" #define RUTA_HPF2 "combopix/hpf2.png" #define RUTA_HPF3 "combopix/hpf3.png" #define RUTA_HPF4 "combopix/hpf4.png" #define RUTA_LOSHELF "combopix/loshelf.png" #define RUTA_HISHELF "combopix/hishelf.png" #define RUTA_PEAK "combopix/peak.png" #define RUTA_NOTCH "combopix/notch.png" class PixMapCombo : public Gtk::ComboBox { public: PixMapCombo(const char *bundlePath); virtual ~PixMapCombo(); protected: class ModelColumns : public Gtk::TreeModel::ColumnRecord { public: ModelColumns() { add(m_col_pix); } Gtk::TreeModelColumn > m_col_pix; }; ModelColumns m_Columns; Glib::RefPtr m_refTreeModel; private: std::string m_bundlePath; }; #endif eq10q-2.2/gui/widgets/templatewidget.h0000755000175000001440000000640413023240626017316 0ustar sapistausers/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include "types.h" #define FILE_NAME "/.RafolsEQ/eq_presets.prs" #define FILE_NAME_AUX "/.RafolsEQ/eq_presets.aux" #define NAME_LONG 100 #ifndef MAIN_WINDOW_WIDGET #define MAIN_WINDOW_WIDGET class main_window; #endif //using namespace std; class TemplateWidget : public Gtk::Alignment{ public: TemplateWidget(main_window *m_ptr, void (*f_set_ptr) (main_window *myptr, int b_ix, int type, float g, float f, float Q), void (*f_get_ptr) (main_window *myptr,int band_id, BandParams &m_params)); virtual ~TemplateWidget(); virtual void load_combo_list(); protected: Gtk::HBox m_box; Gtk::Button b_load, b_save, b_remove; Gtk::ComboBoxEntryText preset_combo; Gtk::Label l_presets; virtual void on_load_clicked(); virtual void on_save_clicked(); virtual void on_delete_clicked(); virtual void on_combo_move(); int current_preset; struct filter_params{ int type; float gain, freq, Q; }; struct f_register{ char name[NAME_LONG]; int name_length; filter_params fparams[10]; }; f_register f_filter; //Function ptr to main void (*external_set_ptr) (main_window *ptr, int b_ix, int type, float g, float f, float Q); void (*external_get_ptr) (main_window *ptr, int band_id, BandParams &m_param); //Structura tipus de filtre BandParams band_param; //Directori del home std::string strhomedir; //punter a main_window main_window *main_win_ptr; };eq10q-2.2/gui/widgets/bassupwindow.cpp0000644000175000001440000000527413023240626017360 0ustar sapistausers/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include "bassupwindow.h" #define KNOB_ICON_FILE "/knobs/knob_bassup_84px.png" #define KNOB_SIZE_X 84 #define KNOB_SIZE_Y 86 #define WIDGET_BORDER 3 #define LOGO_PATH "icons/logobassup.png" BassUpMainWindow::BassUpMainWindow(const char *uri, std::string bundlePath) :m_pluginUri(uri), m_bundlePath(bundlePath) { m_Amount = Gtk::manage(new KnobWidget2(0.0, 6.0, "Amount", "", (m_bundlePath + KNOB_ICON_FILE).c_str() )); //load image logo image_logo = new Gtk::Image(m_bundlePath + "/" + LOGO_PATH); m_KnobAlign.add(*m_Amount); m_KnobAlign.set(0.5, 0.5, 0.0, 0.0); m_Box.pack_start(*image_logo, Gtk::PACK_SHRINK ); m_Box.pack_start(m_KnobAlign, Gtk::PACK_SHRINK ); m_Box.show_all_children(); m_Box.show(); m_MainWidgetAlign.set_padding(3,3,3,3); m_MainWidgetAlign.add(m_Box); add(m_MainWidgetAlign); m_MainWidgetAlign.show(); //Connect signals m_Amount->signal_changed().connect(sigc::mem_fun(*this, &BassUpMainWindow::onAmountChange)); } BassUpMainWindow::~BassUpMainWindow() { delete m_Amount; } void BassUpMainWindow::onAmountChange() { //Write to LV2 port float aux; aux = m_Amount->get_value(); write_function(controller, PORT_AMOUNT, sizeof(float), 0, &aux); }eq10q-2.2/gui/widgets/filter.cpp0000644000175000001440000000350613023240626016114 0ustar sapistausers/*************************************************************************** * Copyright (C) 2011 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ /*************************************************************************** This file contains the filter definitions ///TODO: codi duplicat entre aqui i el motor d'audio ****************************************************************************/ #include "filter.h" //Convert int to FilterType FilterType int2FilterType(int iType) { FilterType f; f = (FilterType)iType; return f; }eq10q-2.2/gui/widgets/guiconstants.h0000644000175000001440000000367313023240626017022 0ustar sapistausers/*************************************************************************** * Copyright (C) 2009 by Pere R�fols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef GUI_CONSTANTS_H #define GUI_CONSTANTS_H #define GAIN_TYPE 0 #define FREQ_TYPE 1 #define Q_TYPE 2 #define FILTER_TYPE 3 #define ONOFF_TYPE 4 //Filter default values #define GAIN_MIN -20.0 #define GAIN_MAX 20.0 #define FREQ_MIN 20.0 #define FREQ_MAX 20000.0 #define PEAK_Q_MIN 0.1 #define PEAK_Q_MAX 16.0 #define HPF_LPF_Q_DEFAULT 0.7 #define NOTCH_Q_DEFAULT 2 #define HIGH_LOW_SHELF_Q_DEFAULT 0.7 #define PEAK_Q_DEFAULT 2 #define GAIN_DEFAULT 0.0 #endifeq10q-2.2/gui/widgets/mainwidget.cpp0000644000175000001440000000717413023240626016764 0ustar sapistausers/*************************************************************************** * Copyright (C) 2015 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "mainwidget.h" #include "colors.h" #include #define BORDER 3 #define RADIUS 8 MainWidget::MainWidget() { set_border_width(BORDER); } MainWidget::~MainWidget() { } void MainWidget::on_realize() { Gtk::EventBox::on_realize(); Glib::RefPtr m_style = get_style(); m_bg_orgi = m_style->get_bg(Gtk::STATE_NORMAL); //Set Main widget Background Gdk::Color m_WinBgColor; m_WinBgColor.set_rgb(GDK_COLOR_MACRO( BACKGROUND_R ), GDK_COLOR_MACRO( BACKGROUND_G ), GDK_COLOR_MACRO( BACKGROUND_B )); modify_bg(Gtk::STATE_NORMAL, m_WinBgColor); Gtk::Window* toplevel = dynamic_cast(this->get_toplevel()); toplevel->set_resizable(false); } bool MainWidget::on_expose_event(GdkEventExpose* event) { bool ret = Gtk::EventBox::on_expose_event(event); //Call parent redraw() Glib::RefPtr window = get_window(); if(window) { Gtk::Allocation allocation = get_allocation(); const int width = allocation.get_width() - 2*BORDER; const int height = allocation.get_height() - 2*BORDER; Cairo::RefPtr cr = window->create_cairo_context(); //Paint edges cr->save(); cr->begin_new_sub_path(); cr->arc( RADIUS, RADIUS, RADIUS, M_PI, -0.5*M_PI); cr->arc( width - RADIUS - 1, RADIUS, RADIUS, -0.5*M_PI, 0); cr->arc( width - RADIUS - 1, height - RADIUS - 1, RADIUS, 0.0, 0.5*M_PI); cr->arc( RADIUS, height - RADIUS - 1, RADIUS, 0.5*M_PI, M_PI); cr->line_to(0,height); cr->line_to(width,height); cr->line_to(width,0); cr->line_to(0,0); cr->close_path(); cr->set_source_rgb(m_bg_orgi.get_red_p(), m_bg_orgi.get_green_p(), m_bg_orgi.get_blue_p() ); cr->fill(); cr->restore(); //Draw a line cr->save(); cr->begin_new_sub_path(); cr->arc( RADIUS, RADIUS, RADIUS, M_PI, -0.5*M_PI); cr->arc( width - RADIUS - 1, RADIUS, RADIUS, -0.5*M_PI, 0); cr->arc( width - RADIUS - 1, height - RADIUS - 1, RADIUS, 0.0, 0.5*M_PI); cr->arc( RADIUS, height - RADIUS - 1, RADIUS, 0.5*M_PI, M_PI); cr->close_path(); cr->set_line_width(1); cr->set_source_rgba(0,0.3,0.3, 0.9); cr->stroke(); cr->restore(); } return ret; } eq10q-2.2/gui/widgets/faderwidget.h0000644000175000001440000000615713023240626016566 0ustar sapistausers/*************************************************************************** * Copyright (C) 2012 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FADER_WIDGET_H #define FADER_WIDGET_H #include #include #include #include #define FADER_ICON_FILE "knobs/fader_dark.png" #define FADER_INITAL_HIGHT 350 #define FADER_MARGIN 7 #define SCROLL_EVENT_PERCENT 0.02 #define TITLE_OFFSET 12 class FaderWidget : public Gtk::DrawingArea { public: FaderWidget(double dMax, double dMin, const char *bundlePath, Glib::ustring title); virtual ~FaderWidget(); //Data accessors void set_value(double value); double get_value(); void set_range(double max, double min); double get_max(); double get_min(); //signal accessor: typedef sigc::signal signal_FaderChanged; signal_FaderChanged signal_changed(); protected: //Override default signal handler: virtual bool on_expose_event(GdkEventExpose* event); //Mouse grab signal handlers virtual bool on_button_press_event(GdkEventButton* event); virtual bool on_button_release_event(GdkEventButton* event); virtual bool on_scrollwheel_event(GdkEventScroll* event); virtual bool on_mouse_motion_event(GdkEventMotion* event); void redraw(); private: bool bMotionIsConnected; int yFaderPosition; double m_value, m_max, m_min; sigc::connection m_motion_connection; Cairo::RefPtr m_image_surface_ptr; Glib::RefPtr m_image_ptr; Cairo::RefPtr< Cairo::Context> m_image_context_ptr; std::string m_bundlePath; Glib::ustring m_title; //Fader change signal signal_FaderChanged m_FaderChangedSignal; }; #endifeq10q-2.2/gui/widgets/CMakeLists.txt0000644000175000001440000000164413023240626016664 0ustar sapistausers##Widgets CMake link_directories(${GTKMM_LIBRARY_DIRS}) include_directories(${GTKMM_INCLUDE_DIRS}) add_library(eqwin STATIC mainwidget.cpp bandctl.cpp eqparams.cpp knob2.cpp vuwidget.cpp eqwindow.cpp filter.cpp setwidgetcolors.cpp bodeplot.cpp button.cpp toggle_button.cpp abbutton.cpp sidechainbox.cpp) target_link_libraries( eqwin ${GTKMM_LIBRARIES} m) add_library(dynamicwin STATIC mainwidget.cpp vuwidget.cpp knob2.cpp dynamicswindow.cpp setwidgetcolors.cpp button.cpp toggle_button.cpp dynplot.cpp sidechainbox.cpp) target_link_libraries( dynamicwin ${GTKMM_LIBRARIES} m) add_library(bassupwin STATIC mainwidget.cpp knob2.cpp bassupwindow.cpp) target_link_libraries( bassupwin ${GTKMM_LIBRARIES} m) add_library(midsidewin STATIC mainwidget.cpp vuwidget.cpp knob2.cpp midsidewindow.cpp setwidgetcolors.cpp button.cpp toggle_button.cpp sidechainbox.cpp) target_link_libraries( midsidewin ${GTKMM_LIBRARIES} m)eq10q-2.2/gui/widgets/vuwidget.cpp0000644000175000001440000004626013023240626016471 0ustar sapistausers/*************************************************************************** * Copyright (C) 2011 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include "colors.h" #include "vuwidget.h" #define TEXT_OFFSET 12 #define MARGIN 6.5 #define CHANNEL_WIDTH 9 #define MICROFADER_WIDTH 30 #define SCROLL_EVENT_PERCENT 0.02 #define WIDGET_HEIGHT 150 #define TOP_OFFSET 24 #define AUTO_REFRESH_TIMEOUT_MS 20 VUWidget::VUWidget(int iChannels, float fMin, float fMax, std::string title, bool IsGainReduction, bool DrawThreshold) :m_iChannels(iChannels), m_fMin(fMin), m_fMax(fMax), m_bIsGainReduction(IsGainReduction), bMotionIsConnected(false), m_fValues(new float[m_iChannels]), m_fPeaks(new float[m_iChannels]), m_iBuffCnt(new int[m_iChannels]), m_ThFaderValue(0.0), m_iThFaderPositon(0), m_bDrawThreshold(DrawThreshold), m_start(new timeval[m_iChannels]), m_end(new timeval[m_iChannels]), m_Title(title), m_redraw_fader(true), m_redraw_Vu(true), m_FaderFocus(false) { m_textdBseparation = (int)round((m_fMax - m_fMin)/18.0); for (int i = 0; i < m_iChannels; i++) { m_fValues[i] = -100.0; m_fPeaks[i] = -100.0; m_iBuffCnt[i] = 0; } int widget_witdh; if(m_bDrawThreshold) { widget_witdh = MARGIN + TEXT_OFFSET + (MARGIN + CHANNEL_WIDTH)* m_iChannels + MICROFADER_WIDTH/2 + MARGIN + 2; } else { widget_witdh = MARGIN + TEXT_OFFSET + (MARGIN + CHANNEL_WIDTH)* m_iChannels; } set_size_request(widget_witdh, WIDGET_HEIGHT); //Initialize peak time counters for (int i = 0; i < m_iChannels; i++) { gettimeofday(&m_start[i], NULL); gettimeofday(&m_end[i], NULL); } //The micro fader for threshold if(m_bDrawThreshold) { add_events(Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::POINTER_MOTION_MASK | Gdk::SCROLL_MASK | Gdk::LEAVE_NOTIFY_MASK); signal_button_press_event().connect(sigc::mem_fun(*this, &VUWidget::on_button_press_event),true); signal_button_release_event().connect(sigc::mem_fun(*this, &VUWidget::on_button_release_event),true); signal_scroll_event().connect(sigc::mem_fun(*this, &VUWidget::on_scrollwheel_event),true); signal_motion_notify_event().connect(sigc::mem_fun(*this, &VUWidget::on_mouse_motion_event),true); signal_leave_notify_event().connect(sigc::mem_fun(*this, &VUWidget::on_mouse_leave_widget),true); } Glib::signal_timeout().connect( sigc::mem_fun(*this, &VUWidget::on_timeout_redraw), AUTO_REFRESH_TIMEOUT_MS ); } VUWidget::~VUWidget() { delete [] m_fValues; delete [] m_fPeaks; delete [] m_start; delete [] m_end; delete [] m_iBuffCnt; } bool VUWidget::on_mouse_leave_widget(GdkEventCrossing* event) { if(!bMotionIsConnected) { m_FaderFocus = false; m_redraw_fader = true; } return true; } void VUWidget::setValue(int iChannel, float fValue) { if (fValue > 0) { if(m_iBuffCnt[iChannel] > 0) { m_fValues[iChannel] = ((((double)m_iBuffCnt[iChannel])*m_fValues[iChannel]) + 20.0*log10(fValue))/((double)(m_iBuffCnt[iChannel] + 1)); } else { m_fValues[iChannel] = 20.0*log10(fValue); } m_iBuffCnt[iChannel]++; } else { m_fValues[iChannel] = -100.0; } m_redraw_Vu = true; } void VUWidget::clearPeak(int iChannel) { m_fPeaks[iChannel] = 0.0; } double VUWidget::dB2Pixels(double dB_in) { double m, n; if(m_bIsGainReduction) { m = ((double)(height - 3.0*MARGIN - TOP_OFFSET))/(m_fMax - m_fMin); n = (double)(MARGIN + TOP_OFFSET) - m_fMin*m; } else { m = ((double)(3.0*MARGIN + TOP_OFFSET - height ))/(m_fMax - m_fMin); n = (double)(height - 2.0*MARGIN) - m_fMin*m; } return m*dB_in + n; } bool VUWidget::on_expose_event(GdkEventExpose* event) { Glib::RefPtr window = get_window(); if(window) { Gtk::Allocation allocation = get_allocation(); width = allocation.get_width(); height = allocation.get_height(); if(!(m_background_surface_ptr || m_foreground_surface_ptr || m_fader_surface_ptr )) { m_background_surface_ptr = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, width, height); redraw_background(); m_foreground_surface_ptr = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, width, height); redraw_foreground(); m_vu_surface_ptr = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, width, height); redraw_vuwidget(); if(m_bDrawThreshold) { m_fader_surface_ptr = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, width, height); redraw_faderwidget(); } } Cairo::RefPtr cr = window->create_cairo_context(); //Draw the background if(m_background_surface_ptr) { cr->save(); cr->set_source(m_background_surface_ptr, 0, 0); cr->paint(); cr->restore(); } //Draw the VU if(m_vu_surface_ptr) { cr->save(); cr->set_source(m_vu_surface_ptr, 0, 0); cr->paint(); cr->restore(); } //Draw the foreground if(m_foreground_surface_ptr) { cr->save(); cr->set_source(m_foreground_surface_ptr, 0, 0); cr->paint(); cr->restore(); } //Draw the fader widget if(m_fader_surface_ptr) { cr->save(); cr->set_source(m_fader_surface_ptr, 0, 0); cr->paint(); cr->restore(); } } return true; } void VUWidget::set_value_th(double value) { m_ThFaderValue = value; m_ThFaderValue = m_ThFaderValue < m_fMin + 2.0 ? m_fMin + 2.0 : m_ThFaderValue; m_ThFaderValue = m_ThFaderValue > m_fMax - 2.0 ? m_fMax - 2.0 : m_ThFaderValue; //Limit threshols 2dB less than VU m_redraw_fader = true; } double VUWidget::get_value_th() { return m_ThFaderValue; } //Mouse grab signal handlers bool VUWidget::on_button_press_event(GdkEventButton* event) { int x,y; get_pointer(x,y); if( y > m_iThFaderPositon - MICROFADER_WIDTH/2 && y < m_iThFaderPositon + MICROFADER_WIDTH/2) { bMotionIsConnected = true; } return true; } bool VUWidget::on_button_release_event(GdkEventButton* event) { bMotionIsConnected = false; return true; } bool VUWidget::on_scrollwheel_event(GdkEventScroll* event) { double increment; increment = SCROLL_EVENT_PERCENT*(m_fMax - m_fMin); if (event->direction == GDK_SCROLL_UP) { // up code set_value_th(m_ThFaderValue + increment); } else if (event->direction == GDK_SCROLL_DOWN) { // down code set_value_th(m_ThFaderValue - increment); } m_FaderChangedSignal.emit(); return true; } bool VUWidget::on_mouse_motion_event(GdkEventMotion* event) { if (bMotionIsConnected) { double m = ((double)(3.0*MARGIN + TOP_OFFSET - height ))/(m_fMax - m_fMin); double n = (double)(height - 2.0*MARGIN) - m_fMin*m; double faderPos = (event->y - n)/m; set_value_th(faderPos); m_FaderChangedSignal.emit(); } else { //Check focus on fader widget m_FaderFocus = event->y > m_iThFaderPositon - MICROFADER_WIDTH/2 && event->y < m_iThFaderPositon + MICROFADER_WIDTH/2 && event->x > width - MICROFADER_WIDTH && event->x < width ; m_redraw_fader = true; } return true; } VUWidget::signal_FaderChanged VUWidget::signal_changed() { return m_FaderChangedSignal; } void VUWidget::redraw_background() { if(m_background_surface_ptr) { //Create cairo context using the buffer surface Cairo::RefPtr cr = Cairo::Context::create(m_background_surface_ptr); //Paint background cr->save(); cr->set_source_rgb(BACKGROUND_R, BACKGROUND_G, BACKGROUND_B); cr->paint(); //Fill all with background color cr->restore(); //Draw text with pango cr->save(); Glib::RefPtr pangoLayout = Pango::Layout::create(cr); Pango::FontDescription font_desc("mono 9px"); pangoLayout->set_font_description(font_desc); cr->set_source_rgba(0.9, 0.9, 0.9, 0.5); cr->move_to(MARGIN + TEXT_OFFSET - 3, TOP_OFFSET/2);//4 is to get the text centered in VU pangoLayout->set_text(m_Title.c_str()); pangoLayout->set_width(Pango::SCALE * (CHANNEL_WIDTH * m_iChannels + (m_iChannels - 1)*MARGIN)); pangoLayout->set_alignment(Pango::ALIGN_CENTER); pangoLayout->show_in_cairo_context(cr); cr->stroke(); for(float fdb = m_fMin; fdb <= m_fMax; fdb = fdb + m_textdBseparation) { std::stringstream ss; ss<move_to(MARGIN, dB2Pixels(fdb) - 4);//4 is to get the text centered in VU pangoLayout->set_text(ss.str()); pangoLayout->set_width(Pango::SCALE * (TEXT_OFFSET - MARGIN)); pangoLayout->set_alignment(Pango::ALIGN_RIGHT); pangoLayout->show_in_cairo_context(cr); cr->stroke(); } cr->restore(); //Draw VU rectangle double radius = height / 100.0; double degrees = M_PI / 180.0; for(int i = 0; i < m_iChannels; i++) { cr->save(); cr->begin_new_sub_path(); cr->arc (MARGIN + TEXT_OFFSET + CHANNEL_WIDTH + i*(MARGIN + CHANNEL_WIDTH + 0.5) - radius, MARGIN + TOP_OFFSET - 4 + radius, radius, -90 * degrees, 0 * degrees); cr->arc (MARGIN + TEXT_OFFSET + CHANNEL_WIDTH + i*(MARGIN + CHANNEL_WIDTH + 0.5) - radius, height - 1 - MARGIN - radius, radius, 0 * degrees, 90 * degrees); cr->arc (MARGIN + TEXT_OFFSET + i*(MARGIN + CHANNEL_WIDTH + 0.5) + radius, height - 1 - MARGIN - radius, radius, 90 * degrees, 180 * degrees); cr->arc (MARGIN + TEXT_OFFSET + i*(MARGIN + CHANNEL_WIDTH + 0.5) + radius, MARGIN + TOP_OFFSET - 4 + radius, radius, 180 * degrees, 270 * degrees); cr->close_path(); cr->set_source_rgb(0.15, 0.15, 0.15); cr->fill_preserve(); cr->set_line_width(1.0); cr->set_source_rgb(0.5, 0.5, 0.5); cr->stroke(); cr->restore(); } } } void VUWidget::redraw_foreground() { if(m_foreground_surface_ptr) { //Create cairo context using the buffer surface Cairo::RefPtr cr = Cairo::Context::create(m_foreground_surface_ptr); //Draw some horitzontal lines to show dB scale over Vu cr->save(); cr->set_line_width(1.0); cr->set_source_rgba(0.8, 0.8, 0.8, 0.4); for(float fdb = m_fMin; fdb <= m_fMax; fdb = fdb + m_textdBseparation) { cr->move_to(MARGIN + TEXT_OFFSET - 2, round(dB2Pixels(fdb)) + 0.5); cr->line_to(MARGIN + TEXT_OFFSET + CHANNEL_WIDTH + (m_iChannels - 1 ) * (CHANNEL_WIDTH + MARGIN ) + 2, round(dB2Pixels(fdb)) + 0.5); cr->stroke(); } cr->restore(); } } void VUWidget::redraw_faderwidget() { if(m_fader_surface_ptr) { //Create cairo context using the buffer surface Cairo::RefPtr cr = Cairo::Context::create(m_fader_surface_ptr); //Clear current context cr->save(); cr->set_operator(Cairo::OPERATOR_CLEAR); cr->paint(); cr->restore(); //Draw vertical line cr->save(); cr->move_to(width - MICROFADER_WIDTH/2 + 0.5, dB2Pixels(m_fMin + 2.0)); cr->line_to(width - MICROFADER_WIDTH/2 + 0.5, dB2Pixels(m_fMax - 2.0)); cr->set_line_cap(Cairo::LINE_CAP_ROUND); cr->set_line_width(3.0); cr->set_source_rgba(0.7, 0.7, 0.7, 0.5); cr->stroke_preserve(); cr->set_source_rgba(0.15, 0.15, 0.15, 1.0); cr->set_line_width(1); cr->stroke(); //Draw threshold text with pango Glib::RefPtr pangoLayout_th = Pango::Layout::create(cr); Pango::FontDescription font_desc_th("sans bold 8px"); font_desc_th.set_gravity(Pango::GRAVITY_EAST); pangoLayout_th->set_font_description(font_desc_th); pangoLayout_th->set_alignment(Pango::ALIGN_LEFT); cr->move_to(width - MICROFADER_WIDTH/2 - 10, height - MICROFADER_WIDTH/2 - 85); cr->set_source_rgba(0.9, 0.9, 0.9, 0.7); pangoLayout_th->update_from_cairo_context(cr); //gets cairo cursor position pangoLayout_th->set_text("d\r\nl\r\no\r\nh\r\ns\r\ne\r\nr\r\nh\r\nT"); pangoLayout_th->show_in_cairo_context(cr); cr->stroke(); //Calc coords for mini fader m_iThFaderPositon = (int) dB2Pixels(m_ThFaderValue); //Draw the fader drop down shadow cr->save(); cr->translate(width - MICROFADER_WIDTH/2 + 2, m_iThFaderPositon + 4); cr->scale(MICROFADER_WIDTH/2, MICROFADER_WIDTH/4); Cairo::RefPtr bkg_gradient_rad_ptr = Cairo::RadialGradient::create(0, 0, 0, 0, 0, 1); bkg_gradient_rad_ptr->add_color_stop_rgba (0.3, 0.2, 0.2, 0.2, 1.0); bkg_gradient_rad_ptr->add_color_stop_rgba (1.0, 0.1, 0.1, 0.2, 0.0); cr->set_source(bkg_gradient_rad_ptr); cr->arc(0.0, 0.0, 1.0, 0.0, 2.0*M_PI); cr->fill(); cr->restore(); //Draw Threshold fader double degrees = M_PI / 180.0; cr->begin_new_sub_path(); cr->arc(width - 2 - MICROFADER_WIDTH/4, m_iThFaderPositon + 0.5, MICROFADER_WIDTH/4, -90 * degrees, 90 * degrees); cr->line_to( width - 2 - MICROFADER_WIDTH/2, m_iThFaderPositon + MICROFADER_WIDTH/4 + 0.5); cr->line_to( width - 2 - MICROFADER_WIDTH, m_iThFaderPositon + 0.5); cr->line_to( width - 2 - MICROFADER_WIDTH/2, m_iThFaderPositon - MICROFADER_WIDTH/4 + 0.5); cr->close_path(); Cairo::RefPtr bkg_gradient_ptr = Cairo::LinearGradient::create(width - 2 - MICROFADER_WIDTH/2, m_iThFaderPositon - MICROFADER_WIDTH/4, width - 2 - MICROFADER_WIDTH/2, m_iThFaderPositon + MICROFADER_WIDTH/4); bkg_gradient_ptr->add_color_stop_rgba (0.3, 0.8, 0.8, 0.85, 1.0); bkg_gradient_ptr->add_color_stop_rgba (1.0, 0.2, 0.2, 0.25, 1.0); cr->set_source(bkg_gradient_ptr); cr->fill_preserve(); //Draw focus glow if(m_FaderFocus) { Cairo::RefPtr glow_gradient_rad_ptr = Cairo::RadialGradient::create(width - MICROFADER_WIDTH/2, m_iThFaderPositon, MICROFADER_WIDTH/2, width - MICROFADER_WIDTH/2, m_iThFaderPositon, MICROFADER_WIDTH); glow_gradient_rad_ptr->add_color_stop_rgba (0.0, 0.0, 1.0, 1.0, 0.1); glow_gradient_rad_ptr->add_color_stop_rgba (0.05, 1.0, 1.0, 1.0, 0.3); cr->set_source(glow_gradient_rad_ptr); cr->fill_preserve(); } cr->set_source_rgba(0.1, 0.1, 0.1, 0.7); cr->set_line_width(1.0); cr->stroke(); cr->move_to(width - 2 - 5*MICROFADER_WIDTH/8, m_iThFaderPositon + 0.5); cr->line_to(width - 4 - MICROFADER_WIDTH/8, m_iThFaderPositon + 0.5); cr->move_to(width - 2 - 5*MICROFADER_WIDTH/8, m_iThFaderPositon + 0.5 - 2); cr->line_to(width - 4 - MICROFADER_WIDTH/8, m_iThFaderPositon + 0.5 - 2); cr->move_to(width - 2 - 5*MICROFADER_WIDTH/8, m_iThFaderPositon + 0.5 + 2); cr->line_to(width - 4 - MICROFADER_WIDTH/8, m_iThFaderPositon + 0.5 + 2); cr->set_source_rgba(0.0, 0.0, 0.0, 0.2); cr->set_line_width(1.0); cr->stroke(); } } void VUWidget::redraw_vuwidget() { if(m_vu_surface_ptr) { //Create cairo context using the buffer surface Cairo::RefPtr cr = Cairo::Context::create(m_vu_surface_ptr); //Clear current context cr->save(); cr->set_operator(Cairo::OPERATOR_CLEAR); cr->paint(); cr->restore(); //Draw the VU Cairo::RefPtr bkg_gradient_ptr; for(int i = 0; i < m_iChannels; i++) { //Reset mean buffer m_iBuffCnt[i] = 0; long mtime, seconds, useconds; gettimeofday(&m_end[i], NULL); seconds = m_end[i].tv_sec - m_start[i].tv_sec; useconds = m_end[i].tv_usec - m_start[i].tv_usec; mtime = ((seconds) * 1000 + useconds/1000.0) + 0.5; //Clip max m_fValues[i] = m_fValues[i] > m_fMax ? m_fMax : m_fValues[i]; if (m_fValues[i] >= m_fPeaks[i]) { m_fPeaks[i] = m_fValues[i]; gettimeofday(&m_start[i] , NULL); } else if (mtime > PEAK_CLEAR_TIMEOUT) { m_fPeaks[i] = -100.0; } cr->save(); cr->set_line_width(CHANNEL_WIDTH - 4); cr->set_line_cap(Cairo::LINE_CAP_ROUND); bkg_gradient_ptr = Cairo::LinearGradient::create(MARGIN + TEXT_OFFSET + CHANNEL_WIDTH/2.0 + i*(MARGIN + CHANNEL_WIDTH + 0.5), dB2Pixels(m_fMin), MARGIN + TEXT_OFFSET + CHANNEL_WIDTH/2.0 + i*(MARGIN + CHANNEL_WIDTH + 0.5), dB2Pixels(m_fMax)); if(m_bIsGainReduction) { bkg_gradient_ptr->add_color_stop_rgba (0.0, 1.0, 0.5, 0.0, 0.0); bkg_gradient_ptr->add_color_stop_rgba (0.01, 1.0, 0.5, 0.0, 1.0); bkg_gradient_ptr->add_color_stop_rgba (1.0, 1.0, 0.0, 0.0, 1.0); } else { bkg_gradient_ptr->add_color_stop_rgba (0.0, 0.0, 1.0, 0.0, 0.0); bkg_gradient_ptr->add_color_stop_rgba (0.01, 0.0, 1.0, 0.0, 1.0); bkg_gradient_ptr->add_color_stop_rgba (0.5, 1.0, 1.0, 0.0, 1.0); bkg_gradient_ptr->add_color_stop_rgba (1.0, 1.0, 0.0, 0.0, 1.0); } cr->set_source(bkg_gradient_ptr); //The VU if(m_fValues[i] >= m_fMin) { cr->move_to(MARGIN + TEXT_OFFSET + CHANNEL_WIDTH/2.0 + i*(MARGIN + CHANNEL_WIDTH + 0.5), dB2Pixels(m_fMin)); cr->line_to(MARGIN + TEXT_OFFSET + CHANNEL_WIDTH/2.0 + i*(MARGIN + CHANNEL_WIDTH + 0.5), dB2Pixels(m_fValues[i])); cr->stroke(); } //The peak if(m_fPeaks[i] >= m_fMin) { cr->move_to(MARGIN + TEXT_OFFSET + CHANNEL_WIDTH/2.0 + i*(MARGIN + CHANNEL_WIDTH + 0.5), dB2Pixels(m_fPeaks[i])); cr->line_to(MARGIN + TEXT_OFFSET + CHANNEL_WIDTH/2.0 + i*(MARGIN + CHANNEL_WIDTH + 0.5), dB2Pixels(m_fPeaks[i])); cr->stroke(); cr->restore(); } } } } bool VUWidget::on_timeout_redraw() { bool redraw = false; if(m_redraw_fader) { m_redraw_fader = false; redraw = true; redraw_faderwidget(); } if(m_redraw_Vu) { m_redraw_Vu = false; redraw = true; redraw_vuwidget(); } if(redraw) { Glib::RefPtr win = get_window(); if(win) { Gdk::Rectangle r(0, 0, get_allocation().get_width(), get_allocation().get_height()); win->invalidate_rect(r, false); } } return true; } eq10q-2.2/gui/widgets/dynplot.h0000644000175000001440000000442113023240626015762 0ustar sapistausers/*************************************************************************** * Copyright (C) 2015 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef PLOT_DYN_CURVE_H #define PLOT_DYN_CURVE_H #include class PlotDynCurve : public Gtk::DrawingArea { public: PlotDynCurve(bool isCompressor); virtual ~PlotDynCurve(); void set_ratio(double ratio); void set_range(double range); void set_knee(double knee); void set_threshold(double threshold); void set_makeup(double makeup); void set_gainreduction(double gainreduction); void set_inputvu(double inputvu); protected: //Override default signal handler: virtual bool on_expose_event(GdkEventExpose* event); virtual void redraw(); private: int width, height; double m_Ratio, m_Range, m_Knee, m_Threshold, m_Makeup, m_GainReduction, m_InputVu; bool m_bIsCompressor; double dB2PixelsX(double db); double dB2PixelsY(double db); }; #endifeq10q-2.2/gui/widgets/dynamicswindow.cpp0000644000175000001440000003020413023240626017661 0ustar sapistausers/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include "dynamicswindow.h" #include "guiconstants.h" #include "setwidgetcolors.h" #define KNOB_ICON_FILE "/knobs/knob2_32px.png" #define KNOB_SIZE_X 75 #define KNOB_SIZE_Y 72 #define WIDGET_BORDER 3 #define LOGO_PATH "icons/logodynamics.png" DynMainWindow::DynMainWindow(const char *uri, std::string bundlePath, std::string title, bool isCompressor, bool hasSideChain) :m_pluginUri(uri), m_bundlePath(bundlePath), m_bIsCompressor(isCompressor) { m_InGainFader = Gtk::manage(new KnobWidget2(-20.0, 20.0, "In Gain", "dB", (m_bundlePath + KNOB_ICON_FILE).c_str(), KNOB_TYPE_LIN, true )); m_InputVu = Gtk::manage(new VUWidget(1, -48.0, 6.0, "In", false, true)); m_GainReductionVu = Gtk::manage(new VUWidget(1, 0.0, 20.0, "GR", true)); m_Attack = Gtk::manage(new KnobWidget2(0.01, 500.0, "Attack", "ms", (m_bundlePath + KNOB_ICON_FILE).c_str() , KNOB_TYPE_TIME )); m_Release = Gtk::manage(new KnobWidget2(5.0, 4000.0, "Release", "ms", (m_bundlePath + KNOB_ICON_FILE).c_str() , KNOB_TYPE_TIME )); m_Punch = Gtk::manage(new KnobWidget2(0.0, 100.0, "Punch", "%", (m_bundlePath + KNOB_ICON_FILE).c_str(), KNOB_TYPE_LIN )); m_HPF = Gtk::manage(new KnobWidget2(20.0, 20000.0, "Key HPF", "Hz", (m_bundlePath + KNOB_ICON_FILE).c_str() , KNOB_TYPE_FREQ)); m_LPF = Gtk::manage(new KnobWidget2(20.0, 20000.0, "Key LPF", "Hz", (m_bundlePath + KNOB_ICON_FILE).c_str() , KNOB_TYPE_FREQ)); m_DryWet = Gtk::manage(new KnobWidget2(0.0, 100.0, "Dry/Wet", "%", (m_bundlePath + KNOB_ICON_FILE).c_str(), KNOB_TYPE_LIN )); m_Ratio = Gtk::manage(new KnobWidget2(1.0, 100.0, "Ratio", "dB", (m_bundlePath + KNOB_ICON_FILE).c_str(), KNOB_TYPE_TIME )); m_Knee = Gtk::manage(new KnobWidget2(0.0, 20.0, "Knee", "dB", (m_bundlePath + KNOB_ICON_FILE).c_str() )); if(m_bIsCompressor) { //Is Compressor m_Hold_Makeup = Gtk::manage(new KnobWidget2(0.0, 20.0, "Makeup", "dB", (m_bundlePath + KNOB_ICON_FILE).c_str() )); } else { //Is Gate m_Hold_Makeup = Gtk::manage(new KnobWidget2(0.01, 3000.0, "Hold", "ms", (m_bundlePath + KNOB_ICON_FILE).c_str() , KNOB_TYPE_TIME )); m_Range = Gtk::manage(new KnobWidget2(-90.0, -1.0, "Range", "dB", (m_bundlePath + KNOB_ICON_FILE).c_str() )); } m_Plot = Gtk::manage(new PlotDynCurve(m_bIsCompressor)); m_KeyButton.set_label("Key Listen"); m_KeyButton.set_size_request(-1,20); m_KeyButtonAlign.add(m_KeyButton); m_KeyButtonAlign.set_padding(0,0, 10, 10); if(hasSideChain) { m_FeedBackMode_SideChainActive.set_label("SC Active"); } else { m_FeedBackMode_SideChainActive.set_label("Feedback"); } m_FeedBackMode_SideChainActive.set_size_request(-1,20); m_FeedBackModeAlign.add(m_FeedBackMode_SideChainActive); m_FeedBackModeAlign.set_padding(0,0, 10, 10); m_OptoMode.set_label("S-Release"); m_OptoMode.set_size_request(-1,20); m_OptoModeAlign.add(m_OptoMode); m_OptoModeAlign.set_padding(0,0, 10, 10); m_LTitle.set_use_markup(true); m_LTitle.set_markup( "" + title + ""); m_LTitle.set_size_request(-1, 25); m_TitleAlign.add(m_LTitle); m_TitleAlign.set_padding(0,0, 60, 0); //load image logo image_logo = new Gtk::Image(m_bundlePath + "/" + LOGO_PATH); m_VuBox.pack_start(*m_InputVu, Gtk::PACK_SHRINK); m_VuBox.pack_start(*m_GainReductionVu, Gtk::PACK_SHRINK); m_VuBox.set_border_width(4); m_VuBox.show_all_children(); m_SideChain2Box.set_border_width(WIDGET_BORDER); m_SideChain2Box.set_spacing(WIDGET_BORDER); m_SideChain2Box.pack_start(*m_LPF, Gtk::PACK_EXPAND_WIDGET); m_SideChain2Box.pack_start(*m_HPF, Gtk::PACK_EXPAND_WIDGET); m_SideChainBox.set_border_width(WIDGET_BORDER); m_SideChainBox.set_spacing(WIDGET_BORDER); m_SideChainBox.pack_start(m_KeyButtonAlign,Gtk::PACK_SHRINK); if(m_bIsCompressor) { m_SideChainBox.pack_start(m_FeedBackModeAlign,Gtk::PACK_SHRINK); m_SideChainBox.pack_start(m_OptoModeAlign,Gtk::PACK_SHRINK); } m_SideChainBox.pack_start(m_SideChain2Box,Gtk::PACK_SHRINK); m_SideChainBox.show_all_children(); m_keyPadding.add(m_SideChainBox); m_keyPadding.set_padding(30,0, 0, 0); m_SCBox.add(m_keyPadding); m_sidchianAlign.set_padding(0, 3, 0, 0); m_sidchianAlign.add(m_SCBox); m_DynBox.set_border_width(WIDGET_BORDER); m_DynBox.set_spacing(WIDGET_BORDER); m_DynBox.pack_start(*m_InGainFader, Gtk::PACK_SHRINK); m_DynBox.pack_start(*m_Ratio, Gtk::PACK_SHRINK); m_DynBox.pack_start(*m_Knee, Gtk::PACK_SHRINK); m_DynBox.pack_start(*m_DryWet, Gtk::PACK_SHRINK); m_DynBox.show_all_children(); m_BalBox.set_border_width(WIDGET_BORDER); m_BalBox.set_spacing(WIDGET_BORDER); m_BalBox.pack_start(*m_Attack, Gtk::PACK_SHRINK); m_BalBox.pack_start(*m_Release, Gtk::PACK_SHRINK); if(m_bIsCompressor) { m_BalBox.pack_start(*m_Punch, Gtk::PACK_SHRINK); } m_BalBox.pack_start(*m_Hold_Makeup, Gtk::PACK_SHRINK); if(!m_bIsCompressor) { m_BalBox.pack_start(*m_Range, Gtk::PACK_SHRINK); } m_BalBox.show_all_children(); m_PlotBox.pack_start(m_DynBox, Gtk::PACK_SHRINK); m_PlotBox.pack_start(*m_Plot, Gtk::PACK_SHRINK); m_PlotBox.show_all_children(); m_PlotLabelBox.pack_start(m_TitleAlign, Gtk::PACK_SHRINK); m_PlotLabelBox.pack_start(m_PlotBox, Gtk::PACK_SHRINK); m_PlotLabelBox.show_all_children(); m_TitleBox.pack_start(m_BalBox, Gtk::PACK_SHRINK); m_TitleBox.pack_start(*image_logo, Gtk::PACK_SHRINK); m_TitleBox.show_all_children(); m_BotBox.pack_start(m_TitleBox, Gtk::PACK_SHRINK); m_BotBox.pack_start(m_sidchianAlign, Gtk::PACK_EXPAND_PADDING); m_Main2Box.pack_start(m_PlotLabelBox, Gtk::PACK_SHRINK); m_Main2Box.pack_start(m_BotBox, Gtk::PACK_SHRINK); m_MainBox.pack_start(m_Main2Box, Gtk::PACK_SHRINK); m_MainBox.pack_start(m_VuBox, Gtk::PACK_SHRINK); show_all(); add(m_MainBox); //Set cutom theme color: Gdk::Color m_WinBgColor; SetWidgetColors m_WidgetColors; m_WidgetColors.setGenericWidgetColors(&m_LTitle); //Connect signals m_InGainFader->signal_changed().connect(sigc::mem_fun(*this, &DynMainWindow::onGainChange)); m_InputVu->signal_changed().connect(sigc::mem_fun(*this, &DynMainWindow::onThresholdChange)); m_Ratio->signal_changed().connect(sigc::mem_fun(*this, &DynMainWindow::onRatioChange)); m_Attack->signal_changed().connect(sigc::mem_fun(*this, &DynMainWindow::onAttackChange)); m_Hold_Makeup->signal_changed().connect(sigc::mem_fun(*this, &DynMainWindow::onHoldChange)); m_Release->signal_changed().connect(sigc::mem_fun(*this, &DynMainWindow::onReleaseChange)); m_LPF->signal_changed().connect(sigc::mem_fun(*this, &DynMainWindow::onLPFChange)); m_HPF->signal_changed().connect(sigc::mem_fun(*this, &DynMainWindow::onHPFChange)); m_DryWet->signal_changed().connect(sigc::mem_fun(*this, &DynMainWindow::onDryWetChange)); m_KeyButton.signal_clicked().connect(sigc::mem_fun(*this, &DynMainWindow::onKeyListenChange)); m_Knee->signal_changed().connect(sigc::mem_fun(*this, &DynMainWindow::onKneeChange)); if(m_bIsCompressor) { m_FeedBackMode_SideChainActive.signal_clicked().connect(sigc::mem_fun(*this, &DynMainWindow::onFeedbackModeChange)); m_OptoMode.signal_clicked().connect(sigc::mem_fun(*this, &DynMainWindow::onModeCompressorChange)); m_Punch->signal_changed().connect(sigc::mem_fun(*this, &DynMainWindow::onPunchChange)); } else { m_Range->signal_changed().connect(sigc::mem_fun(*this, &DynMainWindow::onRangeChange)); } } DynMainWindow::~DynMainWindow() { delete m_InputVu; delete m_GainReductionVu; delete m_InGainFader; delete m_Attack; delete m_Hold_Makeup; delete m_Release; delete m_Ratio; delete m_Knee; delete m_Punch; if(!m_bIsCompressor) { delete m_Range; } delete m_HPF; delete m_LPF; delete m_DryWet; delete image_logo; } void DynMainWindow::onGainChange() { //Write to LV2 port float aux; aux = m_InGainFader->get_value(); write_function(controller, PORT_GAIN, sizeof(float), 0, &aux); } void DynMainWindow::onThresholdChange() { //Write to LV2 port float aux; aux = m_InputVu->get_value_th(); m_Plot->set_threshold(aux); write_function(controller, PORT_THRESHOLD, sizeof(float), 0, &aux); } void DynMainWindow::onRangeChange() { //Write to LV2 port float aux; aux = m_Range->get_value(); m_Plot->set_range(aux); write_function(controller, PORT_FEEDBACK_RANGE_SCACTIVE, sizeof(float), 0, &aux); } void DynMainWindow::onRatioChange() { //Write to LV2 port float aux; aux = m_Ratio->get_value(); m_Plot->set_ratio(aux); write_function(controller, PORT_RATIO, sizeof(float), 0, &aux); } void DynMainWindow::onAttackChange() { //Write to LV2 port float aux; aux = m_Attack->get_value(); write_function(controller, PORT_ATACK, sizeof(float), 0, &aux); } void DynMainWindow::onHoldChange() { //Write to LV2 port float aux; aux = m_Hold_Makeup->get_value(); if(m_bIsCompressor) { m_Plot->set_makeup(aux); } write_function(controller, PORT_HOLD_MAKEUP, sizeof(float), 0, &aux); } void DynMainWindow::onReleaseChange() { //Write to LV2 port float aux; aux = m_Release->get_value(); write_function(controller, PORT_DECAY, sizeof(float), 0, &aux); } void DynMainWindow::onPunchChange() { //Write to LV2 port float aux; aux = 0.01*m_Punch->get_value(); //Div by 100 to get 0% to 100% in range 0 to 1 write_function(controller, PORT_PUNCH, sizeof(float), 0, &aux); } void DynMainWindow::onKneeChange() { //Write to LV2 port float aux; aux = m_Knee->get_value(); m_Plot->set_knee(aux); write_function(controller, PORT_KNEE, sizeof(float), 0, &aux); } void DynMainWindow::onHPFChange() { //Write to LV2 port float aux; aux = m_HPF->get_value(); write_function(controller, PORT_HPFFREQ, sizeof(float), 0, &aux); } void DynMainWindow::onLPFChange() { //Write to LV2 port float aux; aux = m_LPF->get_value(); write_function(controller, PORT_LPFFREQ, sizeof(float), 0, &aux); } void DynMainWindow::onDryWetChange() { //Write to LV2 port float aux; aux = 0.01*m_DryWet->get_value(); //Div by 100 to get 0% to 100% in range 0 to 1 write_function(controller, PORT_DRY_WET, sizeof(float), 0, &aux); } void DynMainWindow::onKeyListenChange() { //Write to LV2 port float aux; aux = m_KeyButton.get_active() ? 1.0 : 0.0; write_function(controller, PORT_KEY_LISTEN, sizeof(float), 0, &aux); } void DynMainWindow::onFeedbackModeChange() { //Write to LV2 port float aux; aux = m_FeedBackMode_SideChainActive.get_active() ? 1.0 : 0.0; write_function(controller, PORT_FEEDBACK_RANGE_SCACTIVE, sizeof(float), 0, &aux); } void DynMainWindow::onModeCompressorChange() { //Write to LV2 port float aux; aux = m_OptoMode.get_active() ? 1.0 : 0.0; write_function(controller, PORT_COMP_MODE, sizeof(float), 0, &aux); } eq10q-2.2/gui/widgets/sidechainbox.cpp0000644000175000001440000001000013023240626017252 0ustar sapistausers/*************************************************************************** * Copyright (C) 2015 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "sidechainbox.h" #include "colors.h" #define MARGIN 6 #define RADIUS 4 SideChainBox::SideChainBox( std::string sTitle, int top_padding): m_title(sTitle), m_top_padding(top_padding) { } SideChainBox::~SideChainBox() { } void SideChainBox::set_label(const Glib::ustring& label) { m_title = label; Glib::RefPtr win = get_window(); if(win) { Gdk::Rectangle r(0, 0, get_allocation().get_width(), get_allocation().get_height()); win->invalidate_rect(r, false); } } bool SideChainBox::on_expose_event(GdkEventExpose* event) { bool ret = Gtk::EventBox::on_expose_event(event); //Call parent redraw() Glib::RefPtr window = get_window(); if(window) { Gtk::Allocation allocation = get_allocation(); const int width = allocation.get_width(); const int height = allocation.get_height(); Cairo::RefPtr cr = window->create_cairo_context(); //Paint backgroud cr->save(); cr->set_source_rgb(BACKGROUND_R, BACKGROUND_G, BACKGROUND_B); cr->paint(); //Fill all with background color cr->restore(); //Draw a box cr->save(); cr->arc( MARGIN + 0.5, MARGIN + m_top_padding + 0.5, RADIUS, M_PI, -0.5*M_PI); cr->line_to(width/6 , MARGIN + m_top_padding + 0.5 - RADIUS); cr->move_to(5*width/6 , MARGIN + m_top_padding + 0.5 - RADIUS); cr->line_to(width - 1 - MARGIN - 0.5, MARGIN + m_top_padding + 0.5 - RADIUS); cr->arc( width - 1 - MARGIN - 0.5, MARGIN + m_top_padding + 0.5, RADIUS, -0.5*M_PI, 0); cr->line_to(width - 1 - MARGIN - 0.5 + RADIUS, height - 1 - MARGIN - 0.5); cr->arc( width - 1 - MARGIN - 0.5, height - 1 - MARGIN - 0.5, RADIUS, 0.0, 0.5*M_PI); cr->line_to( MARGIN + 0.5, height - 1 - MARGIN - 0.5 + RADIUS); cr->arc( MARGIN + 0.5, height - 1 - MARGIN - 0.5, RADIUS, 0.5*M_PI, M_PI); cr->line_to( MARGIN + 0.5 - RADIUS, MARGIN + m_top_padding + 0.5 ); cr->set_line_width(1); cr->set_source_rgba(1,1,1, 0.3); cr->stroke(); cr->restore(); //Draw Text cr->save(); Glib::RefPtr pangoLayout = Pango::Layout::create(cr); Pango::FontDescription font_desc("sans 12px"); pangoLayout->set_font_description(font_desc); pangoLayout->set_text(m_title); int stringWidth, stringHeight; pangoLayout->get_pixel_size(stringWidth, stringHeight); //and text cr->move_to(0.5*(width - stringWidth), m_top_padding - 0.5*stringHeight ); cr->set_source_rgba(0.9, 0.9, 0.9, 0.7); pangoLayout->show_in_cairo_context(cr); cr->stroke(); cr->restore(); } return ret; } eq10q-2.2/gui/widgets/eqwindow.h0000644000175000001440000003664413023240626016142 0ustar sapistausers/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef EQ_MAIN_WIN_H #define EQ_MAIN_WIN_H #include #include #include #include #include #include #include //LV2 UI header #include #include #include #include #include "../../uris.h" #include "mainwidget.h" #include "bandctl.h" #include "vuwidget.h" #include "knob2.h" #include "eqparams.h" #include "bodeplot.h" #include "button.h" #include "toggle_button.h" #include "abbutton.h" #include "sidechainbox.h" //Include eq definition #include "../eq_defines.h" #define IMAGE_LOGO_PATH "icons/logoeq10q.png" #define TIMER_VALUE_MS 100 //Test print information, comment out for the final release //#define PRINT_DEBUG_INFO using namespace sigc; class EqMainWindow : public MainWidget { public: EqMainWindow(int iAudioChannels, int iNumBands, const char *uri, const char *bundlePath, const LV2_Feature *const *features); virtual ~EqMainWindow(); void request_sample_rate(); // Informing GUI about changes in the control ports void gui_port_event(LV2UI_Handle ui, uint32_t port, uint32_t buffer_size, uint32_t format, const void * buffer) { //Atom event from DSP if((int)port == (PORT_OFFSET + 2*m_iNumOfChannels + 5*m_iNumOfBands + 2*m_iNumOfChannels)) { const LV2_Atom* atom = (const LV2_Atom*)buffer; if (format == uris.atom_eventTransfer && atom->type == uris.atom_Object) { const LV2_Atom_Object* obj = (const LV2_Atom_Object*)atom; if(obj->body.otype == uris.atom_sample_rate_response) { const LV2_Atom* samplerate_val = NULL; const int n_props = lv2_atom_object_get(obj, uris.atom_sample_rate_key, &samplerate_val, NULL); if (n_props != 1 || samplerate_val->type != uris.atom_Double) { std::cout<<"Atom Object does not have the required properties (sample-rate) with correct types"<body; m_Bode->setSampleRate(SampleRate); } } else if(obj->body.otype == uris.atom_fft_data_event) { const LV2_Atom* fftdata_val = NULL; const int n_props = lv2_atom_object_get(obj, uris.atom_fft_data_key, &fftdata_val, NULL); if (n_props != 1 || fftdata_val->type != uris.atom_Vector) { std::cout<<"Atom Object does not have the required properties (fft-data) with correct types"<body.child_type != uris.atom_Double) { std::cout<<"Atom fft Vector has incorrect element type"<size - sizeof(LV2_Atom_Vector_Body))/ sizeof(double)); //std::cout<<"N Elem "<setFftData((double*)(&vec->body + 1)); } } } } } }//End of Atom ports reading //Standard LV2 ports handling float data = * static_cast(buffer); #ifdef PRINT_DEBUG_INFO std::cout<<"gui_port_event Entring....... "< 0.5 ? 1 : 0; m_port_event_Bypass = true; //Marck port even boolean ///m_BypassButton.set_active(data > 0.5); #ifdef PRINT_DEBUG_INFO std::cout<<"\t-- BYPASS"<setInputGain(data); m_port_event_InGain = true; //Marck port even boolean ///m_InGain->setGain(data); #ifdef PRINT_DEBUG_INFO std::cout<<"\t-- Input Gain"<setOutputGain(data); m_port_event_OutGain = true; //Marck port even boolean ///m_OutGain->setGain(data); #ifdef PRINT_DEBUG_INFO std::cout<<"\t-- Out Gain"<= (PORT_OFFSET + 2*m_iNumOfChannels) && (int)port < (PORT_OFFSET + 2*m_iNumOfChannels + m_iNumOfBands)) { ///m_BandCtlArray[(int)port - PORT_OFFSET - 2*m_iNumOfChannels]->setGain(data); ///m_Bode->setBandGain((int)port - PORT_OFFSET - 2*m_iNumOfChannels, data); m_CurParams->setBandGain((int)port - PORT_OFFSET - 2*m_iNumOfChannels, data); m_port_event_Curve = true; //Marck port even boolean m_port_event_Curve_Gain[(int)port - PORT_OFFSET - 2*m_iNumOfChannels] = true; #ifdef PRINT_DEBUG_INFO std::cout<<"\t-- Band Gain"<= (PORT_OFFSET + 2*m_iNumOfChannels + m_iNumOfBands) && (int)port < (PORT_OFFSET + 2*m_iNumOfChannels + 2*m_iNumOfBands)) { ///m_BandCtlArray[(int)port - PORT_OFFSET - 2*m_iNumOfChannels - m_iNumOfBands]->setFreq(data); ///m_Bode->setBandFreq((int)port - PORT_OFFSET - 2*m_iNumOfChannels - m_iNumOfBands, data); m_CurParams->setBandFreq((int)port - PORT_OFFSET - 2*m_iNumOfChannels - m_iNumOfBands, data); m_port_event_Curve = true; //Marck port even boolean m_port_event_Curve_Freq[(int)port - PORT_OFFSET - 2*m_iNumOfChannels - m_iNumOfBands] = true; #ifdef PRINT_DEBUG_INFO std::cout<<"\t-- Band Freq"<= (PORT_OFFSET + 2*m_iNumOfChannels + 2*m_iNumOfBands) && (int)port < (PORT_OFFSET + 2*m_iNumOfChannels + 3*m_iNumOfBands)) { ///m_BandCtlArray[(int)port - PORT_OFFSET - 2*m_iNumOfChannels - 2*m_iNumOfBands]->setQ(data); ///m_Bode->setBandQ((int)port - PORT_OFFSET - 2*m_iNumOfChannels - 2*m_iNumOfBands, data); m_CurParams->setBandQ((int)port - PORT_OFFSET - 2*m_iNumOfChannels - 2*m_iNumOfBands, data); m_port_event_Curve = true; //Marck port even boolean m_port_event_Curve_Q[(int)port - PORT_OFFSET - 2*m_iNumOfChannels - 2*m_iNumOfBands] = true; #ifdef PRINT_DEBUG_INFO std::cout<<"\t-- Band Q"<= (PORT_OFFSET + 2*m_iNumOfChannels + 3*m_iNumOfBands) && (int)port < (PORT_OFFSET + 2*m_iNumOfChannels + 4*m_iNumOfBands)) { ///m_BandCtlArray[(int)port - PORT_OFFSET - 2*m_iNumOfChannels - 3*m_iNumOfBands]->setFilterType(data); ///m_Bode->setBandType((int)port - PORT_OFFSET - 2*m_iNumOfChannels - 3*m_iNumOfBands, data); m_CurParams->setBandType((int)port - PORT_OFFSET - 2*m_iNumOfChannels - 3*m_iNumOfBands, ((int)data) & 0xFF); m_port_event_Curve = true; //Marck port even boolean m_port_event_Curve_Type[(int)port - PORT_OFFSET - 2*m_iNumOfChannels - 3*m_iNumOfBands] = true; #ifdef PRINT_DEBUG_INFO std::cout<<"\t-- Band Type"<= (PORT_OFFSET + 2*m_iNumOfChannels + 4*m_iNumOfBands) && (int)port < (PORT_OFFSET + 2*m_iNumOfChannels + 5*m_iNumOfBands)) { ///m_BandCtlArray[(int)port - PORT_OFFSET - 2*m_iNumOfChannels - 4*m_iNumOfBands]->setEnabled(data > 0.5); ///m_Bode->setBandEnable((int)port - PORT_OFFSET - 2*m_iNumOfChannels - 4*m_iNumOfBands, data > 0.5); int iMidSide = (int)data >> 1; const int sel_band = (int)port - PORT_OFFSET - 2*m_iNumOfChannels - 4*m_iNumOfBands; switch(iMidSide) { case 0: m_BandCtlArray[sel_band]->setStereoState(BandCtl::DUAL); if(m_iNumOfChannels == 1) { m_Bode->setStereoState(sel_band, PlotEQCurve::MONO); } else { m_Bode->setStereoState(sel_band, PlotEQCurve::DUAL); } break; case 1: m_BandCtlArray[sel_band]->setStereoState(BandCtl::ML); m_Bode->setStereoState(sel_band, PlotEQCurve::ML); break; case 2: m_BandCtlArray[sel_band]->setStereoState(BandCtl::SR); m_Bode->setStereoState(sel_band, PlotEQCurve::SR); break; } int iEnable = (int)data & 0x01; m_CurParams->setBandEnabled(sel_band, iEnable > 0); m_port_event_Curve = true; //Marck port even boolean m_port_event_Curve_Enable[sel_band] = true; #ifdef PRINT_DEBUG_INFO std::cout<<"\t-- Band Enabled"<= (PORT_OFFSET + 2*m_iNumOfChannels + 5*m_iNumOfBands) && (int)port < (PORT_OFFSET + 2*m_iNumOfChannels + 5*m_iNumOfBands + m_iNumOfChannels)) { m_VuMeterIn->setValue((int)port - PORT_OFFSET - 2*m_iNumOfChannels - 5*m_iNumOfBands,data); #ifdef PRINT_DEBUG_INFO std::cout<<"\t-- Vu input"<= (PORT_OFFSET + 2*m_iNumOfChannels + 5*m_iNumOfBands + m_iNumOfChannels) && (int)port < (PORT_OFFSET + 2*m_iNumOfChannels + 5*m_iNumOfBands + 2*m_iNumOfChannels)) { m_VuMeterOut->setValue((int)port - PORT_OFFSET - 2*m_iNumOfChannels - 5*m_iNumOfBands - m_iNumOfChannels, data); #ifdef PRINT_DEBUG_INFO std::cout<<"\t-- Vu output"< 0.5); #ifdef PRINT_DEBUG_INFO std::cout<<"\t-- Mid Side"< #include #include #include "midsidewindow.h" #include "guiconstants.h" #include "setwidgetcolors.h" #define KNOB_ICON_FILE "/knobs/knob2_32px.png" #define KNOB_SIZE_X 75 #define KNOB_SIZE_Y 72 #define WIDGET_BORDER 3 MidSideMainWindow::MidSideMainWindow(const char* uri, std::string bundlePath, bool isLR2MS) :m_pluginUri(uri), m_bundlePath(bundlePath), m_bisLR2MS(isLR2MS) { std::string sIn1, sIn2, sOut1, sOut2; m_LabTitle.set_use_markup(true); //Set cutom theme color: Gdk::Color m_WinBgColor; SetWidgetColors m_WidgetColors; m_WidgetColors.setGenericWidgetColors(&m_LabTitle); if(m_bisLR2MS) { sIn1 = "In Left"; sIn2 = "In Right"; sOut1 = "Out Mid"; sOut2 = "Out Side"; m_LabTitle.set_markup( " Matrix: Stereo to Mid/Side "); } else { sIn1 = "In Mid"; sIn2 = "In Side"; sOut1 = "Out Left"; sOut2 = "Out Right"; m_LabTitle.set_markup( " Matrix: Mid/Side to Stereo "); } m_InGain1 = Gtk::manage(new KnobWidget2(-20.0, 20.0, "Level", "dB", (m_bundlePath + KNOB_ICON_FILE).c_str(), KNOB_TYPE_LIN, true )); m_InGain2 = Gtk::manage(new KnobWidget2(-20.0, 20.0, "Level", "dB", (m_bundlePath + KNOB_ICON_FILE).c_str(), KNOB_TYPE_LIN, true )); m_OutGain1 = Gtk::manage(new KnobWidget2(-20.0, 20.0, "Level", "dB", (m_bundlePath + KNOB_ICON_FILE).c_str(), KNOB_TYPE_LIN, true )); m_OutGain2 = Gtk::manage(new KnobWidget2(-20.0, 20.0, "Level", "dB", (m_bundlePath + KNOB_ICON_FILE).c_str(), KNOB_TYPE_LIN, true )); m_InSolo1.set_label("Solo"); m_InSolo2.set_label("Solo"); m_OutSolo1.set_label("Solo"); m_OutSolo2.set_label("Solo"); m_In1Frame.set_label( sIn1 ); m_In2Frame.set_label( sIn2 ); m_Out1Frame.set_label( sOut1 ); m_Out2Frame.set_label( sOut2 ); m_InAlng1.set_border_width(16); m_InAlng2.set_border_width(16); m_OutAlng1.set_border_width(16); m_OutAlng2.set_border_width(16); m_InSoloAlng1.set_padding(20, 0, 0, 0); m_InSoloAlng2.set_padding(20, 0, 0, 0); m_OutSoloAlng1.set_padding(20, 0, 0, 0); m_OutSoloAlng2.set_padding(20, 0, 0, 0); m_HInBox.set_border_width(10); m_HOutBox.set_border_width(10); m_In1Box.set_border_width(2); m_In2Box.set_border_width(2); m_Out1Box.set_border_width(2); m_Out2Box.set_border_width(2); m_InputVu1 = Gtk::manage(new VUWidget(1, -48.0, 6.0, "")); m_InputVu2 = Gtk::manage(new VUWidget(1, -48.0, 6.0, "")); m_OutputVu1 = Gtk::manage(new VUWidget(1, -48.0, 6.0, "")); m_OutputVu2 = Gtk::manage(new VUWidget(1, -48.0, 6.0, "")); set_size_request(-1, 450); m_InSoloAlng1.add(m_InSolo1); m_In1Box.pack_start( m_InSoloAlng1 ,Gtk::PACK_SHRINK); m_InVuAlng1.add(*m_InputVu1); m_In1Box.pack_start( m_InVuAlng1); m_In1Box.pack_start( *m_InGain1 ,Gtk::PACK_SHRINK); m_InAlng1.add(m_In1Box); m_In1Frame.add(m_InAlng1); m_InSoloAlng2.add(m_InSolo2); m_In2Box.pack_start( m_InSoloAlng2 ,Gtk::PACK_SHRINK); m_InVuAlng2.add(*m_InputVu2); m_In2Box.pack_start( m_InVuAlng2); m_In2Box.pack_start( *m_InGain2 ,Gtk::PACK_SHRINK); m_InAlng2.add(m_In2Box); m_In2Frame.add(m_InAlng2); m_OutSoloAlng1.add(m_OutSolo1); m_Out1Box.pack_start( m_OutSoloAlng1 ,Gtk::PACK_SHRINK); m_OutVuAlng1.add(*m_OutputVu1); m_Out1Box.pack_start( m_OutVuAlng1); m_Out1Box.pack_start( *m_OutGain1 ,Gtk::PACK_SHRINK); m_OutAlng1.add(m_Out1Box); m_Out1Frame.add(m_OutAlng1); m_OutSoloAlng2.add(m_OutSolo2); m_Out2Box.pack_start( m_OutSoloAlng2 ,Gtk::PACK_SHRINK); m_OutVuAlng2.add(*m_OutputVu2); m_Out2Box.pack_start( m_OutVuAlng2); m_Out2Box.pack_start( *m_OutGain2 ,Gtk::PACK_SHRINK); m_OutAlng2.add(m_Out2Box); m_Out2Frame.add(m_OutAlng2); m_HInBox.pack_start( m_In1Frame, Gtk::PACK_EXPAND_PADDING); m_HInBox.pack_start( m_In2Frame, Gtk::PACK_EXPAND_PADDING); m_HOutBox.pack_start( m_Out1Frame, Gtk::PACK_EXPAND_PADDING); m_HOutBox.pack_start( m_Out2Frame, Gtk::PACK_EXPAND_PADDING); m_HTopBox.pack_start ( m_HInBox); m_HTopBox.pack_start ( m_HOutBox); m_labAlng.set_padding(10,0,0,0); m_labAlng.add(m_LabTitle); m_VTopBox.pack_start(m_labAlng,Gtk::PACK_SHRINK); m_VTopBox.pack_start(m_HTopBox); show_all(); add(m_VTopBox); //Signal handlers m_InGain1->signal_changed().connect(sigc::mem_fun(*this, &MidSideMainWindow::onInGain1Change)); m_InGain2->signal_changed().connect(sigc::mem_fun(*this, &MidSideMainWindow::onInGain2Change)); m_OutGain1->signal_changed().connect(sigc::mem_fun(*this, &MidSideMainWindow::onOutGain1Change)); m_OutGain2->signal_changed().connect(sigc::mem_fun(*this, &MidSideMainWindow::onOutGain2Change)); m_InSolo1.signal_clicked().connect(sigc::mem_fun(*this, &MidSideMainWindow::onInSolo1Change)); m_InSolo2.signal_clicked().connect(sigc::mem_fun(*this, &MidSideMainWindow::onInSolo2Change)); m_OutSolo1.signal_clicked().connect(sigc::mem_fun(*this, &MidSideMainWindow::onOutSolo1Change)); m_OutSolo2.signal_clicked().connect(sigc::mem_fun(*this, &MidSideMainWindow::onOutSolo2Change)); } MidSideMainWindow::~MidSideMainWindow() { delete m_InGain1; delete m_InGain2; delete m_OutGain1; delete m_OutGain2; delete m_InputVu1; delete m_InputVu2; delete m_OutputVu1; delete m_OutputVu2; } void MidSideMainWindow::onInGain1Change() { //Write to LV2 port float aux; aux = m_InGain1->get_value(); write_function(controller, PORT_GAIN_IN_1, sizeof(float), 0, &aux); } void MidSideMainWindow::onInGain2Change() { //Write to LV2 port float aux; aux = m_InGain2->get_value(); write_function(controller, PORT_GAIN_IN_2, sizeof(float), 0, &aux); } void MidSideMainWindow::onOutGain1Change() { //Write to LV2 port float aux; aux = m_OutGain1->get_value(); write_function(controller, PORT_GAIN_OUT_1, sizeof(float), 0, &aux); } void MidSideMainWindow::onOutGain2Change() { //Write to LV2 port float aux; aux = m_OutGain2->get_value(); write_function(controller, PORT_GAIN_OUT_2, sizeof(float), 0, &aux); } void MidSideMainWindow::onInSolo1Change() { if(m_InSolo1.get_active()) { resetSoloState(); m_InSolo1.set_active(true); } //Write to LV2 port the new value of this solo button float aux; aux = m_InSolo1.get_active() ? 1.0 : 0.0; write_function(controller, PORT_SOLO_IN_1, sizeof(float), 0, &aux); } void MidSideMainWindow::onInSolo2Change() { if(m_InSolo2.get_active()) { resetSoloState(); m_InSolo2.set_active(true); } //Write to LV2 port the new value of this solo button float aux; aux = m_InSolo2.get_active() ? 1.0 : 0.0; write_function(controller, PORT_SOLO_IN_2, sizeof(float), 0, &aux); } void MidSideMainWindow::onOutSolo1Change() { if(m_OutSolo1.get_active()) { resetSoloState(); m_OutSolo1.set_active(true); } //Write to LV2 port the new value of this solo button float aux; aux = m_OutSolo1.get_active() ? 1.0 : 0.0; write_function(controller, PORT_SOLO_OUT_1, sizeof(float), 0, &aux); } void MidSideMainWindow::onOutSolo2Change() { if(m_OutSolo2.get_active()) { resetSoloState(); m_OutSolo2.set_active(true); } //Write to LV2 port the new value of this solo button float aux; aux = m_OutSolo2.get_active() ? 1.0 : 0.0; write_function(controller, PORT_SOLO_OUT_2, sizeof(float), 0, &aux); } void MidSideMainWindow::resetSoloState() { m_InSolo1.set_active(false); m_InSolo2.set_active(false); m_OutSolo1.set_active(false); m_OutSolo2.set_active(false); //Write to LV2 ports the null solo state float aux; aux = 0.0; write_function(controller, PORT_SOLO_IN_1, sizeof(float), 0, &aux); write_function(controller, PORT_SOLO_IN_2, sizeof(float), 0, &aux); write_function(controller, PORT_SOLO_OUT_1, sizeof(float), 0, &aux); write_function(controller, PORT_SOLO_OUT_2, sizeof(float), 0, &aux); } eq10q-2.2/gui/widgets/bandctl.cpp0000644000175000001440000013651313023240626016243 0ustar sapistausers/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "filter.h" #include "colors.h" #include "guiconstants.h" #include "bandctl.h" #include "toggle_button.h" //To draw the LED using a static function #include #include #include #include #define OUTER_BORDER 1.5 #define FONT_SIZE 11 #define ACCELERATION 15.0 #define SCROLL_EVENT_PERCENT 0.005 #define LPF_ICON_FILE "combopix/lpf.png" #define HPF_ICON_FILE "combopix/hpf.png" #define LOSHEL_ICON_FILE "combopix/loshelf.png" #define HISHEL_ICON_FILE "combopix/hishelf.png" #define PEAK_ICON_FILE "combopix/peak.png" #define NOTCH_ICON_FILE "combopix/notch.png" BandCtl::BandCtl( const int iBandNum, bool *bSemafor, const char* bundlepath, bool isStereo): m_bBtnInitialized(false), m_TypePopUp(0), m_iBandNum(iBandNum), m_bBandIsEnabled(false), m_budlepath(bundlepath), m_iAntValueX(0), m_iAntValueY(0), m_HpfLpf_slope(0), m_bGlowBand(false), m_bIsStereoPlugin(isStereo) { //Init button values to something m_GainBtn.value = 0.0f; m_FreqBtn.value = 1e3f; m_QBtn.value = 2.0f; m_GainBtn.units = "dB"; m_FreqBtn.units = "Hz"; m_QBtn.units = "Q"; m_FilterType = int2FilterType(0.0f); m_BandTitle = Glib::ustring::compose("Band %1", m_iBandNum + 1); m_Color = Gdk::Color(bandColorLUT[m_iBandNum]); //Load ComboBox images m_img_ptr_lpf = Gdk::Pixbuf::create_from_file(m_budlepath + "/" + std::string(LPF_ICON_FILE)); m_img_ptr_hpf = Gdk::Pixbuf::create_from_file(m_budlepath + "/" + std::string(HPF_ICON_FILE)); m_img_ptr_loshelf = Gdk::Pixbuf::create_from_file(m_budlepath + "/" + std::string(LOSHEL_ICON_FILE)); m_img_ptr_hishelf = Gdk::Pixbuf::create_from_file(m_budlepath + "/" + std::string(HISHEL_ICON_FILE)); m_img_ptr_peak = Gdk::Pixbuf::create_from_file(m_budlepath + "/" + std::string(PEAK_ICON_FILE)); m_img_ptr_notch = Gdk::Pixbuf::create_from_file(m_budlepath + "/" + std::string(NOTCH_ICON_FILE)); m_FilterType = PEAK; loadTypeImg(); set_size_request(46 + m_image_surface_ptr->get_width(), ( m_bIsStereoPlugin ? 80 : 65) + m_image_surface_ptr->get_height()); //Fill Filter Type popup menu m_TypePopUp = new Gtk::Menu(); icon_lpf = new Gtk::Image(m_img_ptr_lpf); icon_hpf = new Gtk::Image(m_img_ptr_hpf); icon_loShel = new Gtk::Image(m_img_ptr_loshelf); icon_hiShel = new Gtk::Image(m_img_ptr_hishelf); icon_peak = new Gtk::Image(m_img_ptr_peak); icon_notch = new Gtk::Image(m_img_ptr_notch); itm_lpf = new Gtk::ImageMenuItem(*icon_lpf,"Low pass"); itm_hpf = new Gtk::ImageMenuItem(*icon_hpf,"High pass"); itm_loShel = new Gtk::ImageMenuItem(*icon_loShel,"Low Shelf"); itm_hiShel = new Gtk::ImageMenuItem(*icon_hiShel,"High Shelf"); itm_peak = new Gtk::ImageMenuItem(*icon_peak,"Peak"); itm_notch = new Gtk::ImageMenuItem(*icon_notch,"Notch"); //Allow this widget to get keyboard focus set_flags(Gtk::CAN_FOCUS); set_can_focus(true); itm_lpf->set_always_show_image(true); itm_hpf->set_always_show_image(true); itm_loShel->set_always_show_image(true); itm_hiShel->set_always_show_image(true); itm_peak->set_always_show_image(true); itm_notch->set_always_show_image(true); itm_lpf->signal_activate().connect(sigc::mem_fun(*this, &BandCtl::on_menu_lpf)); itm_hpf->signal_activate().connect(sigc::mem_fun(*this, &BandCtl::on_menu_hpf)); itm_loShel->signal_activate().connect(sigc::mem_fun(*this, &BandCtl::on_menu_loshelf)); itm_hiShel->signal_activate().connect(sigc::mem_fun(*this, &BandCtl::on_menu_hishelf)); itm_peak->signal_activate().connect(sigc::mem_fun(*this, &BandCtl::on_menu_peak)); itm_notch->signal_activate().connect(sigc::mem_fun(*this, &BandCtl::on_menu_notch)); m_TypePopUp->signal_hide().connect(sigc::mem_fun(*this, &BandCtl::on_menu_hide)); signal_focus_out_event().connect(sigc::mem_fun(*this, &BandCtl::on_focus_out_event)); m_TypePopUp->append(*itm_lpf); m_TypePopUp->append(*itm_hpf); m_TypePopUp->append(*itm_loShel); m_TypePopUp->append(*itm_hiShel); m_TypePopUp->append(*itm_peak); m_TypePopUp->append(*itm_notch); m_TypePopUp->set_size_request(110 ,-1); //Setup MidSide button m_MidSideBtn.MidSideMode = false; m_MidSideBtn.State = DUAL; show(); //Connect mouse signals add_events(Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::POINTER_MOTION_MASK | Gdk::SCROLL_MASK | Gdk::LEAVE_NOTIFY_MASK | Gdk::KEY_PRESS_MASK); signal_button_press_event().connect(sigc::mem_fun(*this, &BandCtl::on_button_press_event),true); signal_button_release_event().connect(sigc::mem_fun(*this, &BandCtl::on_button_release_event),true); signal_scroll_event().connect(sigc::mem_fun(*this, &BandCtl::on_scrollwheel_event),true); signal_motion_notify_event().connect(sigc::mem_fun(*this, &BandCtl::on_mouse_motion_event),true); signal_leave_notify_event().connect(sigc::mem_fun(*this, &BandCtl::on_mouse_leave_widget),true); signal_key_press_event().connect(sigc::mem_fun(*this, &BandCtl::on_key_press_event)); //TODO Glib::RefPtr sty = Gtk::Style::create(); sty->set_font(Pango::FontDescription("sans 11px")); sty->set_bg(Gtk::STATE_NORMAL, Gdk::Color("#3C3940")); sty->set_bg(Gtk::STATE_PRELIGHT, Gdk::Color("#408FC0")); sty->set_fg(Gtk::STATE_NORMAL, Gdk::Color("#CDCECE")); sty->set_fg(Gtk::STATE_PRELIGHT, Gdk::Color("#161B17")); m_TypePopUp->set_style(sty); itm_lpf->set_style(sty); itm_hpf->set_style(sty); itm_loShel->set_style(sty); itm_hiShel->set_style(sty); itm_peak->set_style(sty); itm_notch->set_style(sty); itm_lpf->get_child()->set_style(sty); itm_hpf->get_child()->set_style(sty); itm_loShel->get_child()->set_style(sty); itm_hiShel->get_child()->set_style(sty); itm_peak->get_child()->set_style(sty); itm_notch->get_child()->set_style(sty); } BandCtl::~BandCtl() { delete m_TypePopUp; delete icon_lpf; delete icon_hpf; delete icon_loShel; delete icon_hiShel; delete icon_peak; delete icon_notch; delete itm_lpf; delete itm_hpf; delete itm_loShel; delete itm_hiShel; delete itm_peak; delete itm_notch; } void BandCtl::glowBand(bool glow) { m_bGlowBand = glow; redraw(); } void BandCtl::loadTypeImg() { Glib::RefPtr img_ptr; switch(m_FilterType) { case HPF_ORDER_1: img_ptr = m_img_ptr_hpf; m_HpfLpf_slope = 20; m_GainBtn.units = "dB/dec"; break; case HPF_ORDER_2: img_ptr = m_img_ptr_hpf; m_HpfLpf_slope = 40; m_GainBtn.units = "dB/dec"; break; case HPF_ORDER_3: img_ptr = m_img_ptr_hpf; m_HpfLpf_slope = 60; m_GainBtn.units = "dB/dec"; break; case HPF_ORDER_4: img_ptr = m_img_ptr_hpf; m_HpfLpf_slope = 80; m_GainBtn.units = "dB/dec"; break; case LPF_ORDER_1: img_ptr = m_img_ptr_lpf; m_HpfLpf_slope = 20; m_GainBtn.units = "dB/dec"; break; case LPF_ORDER_2: img_ptr = m_img_ptr_lpf; m_HpfLpf_slope = 40; m_GainBtn.units = "dB/dec"; break; case LPF_ORDER_3: img_ptr = m_img_ptr_lpf; m_HpfLpf_slope = 60; m_GainBtn.units = "dB/dec"; break; case LPF_ORDER_4: img_ptr = m_img_ptr_lpf; m_HpfLpf_slope = 80; m_GainBtn.units = "dB/dec"; break; case HIGH_SHELF: img_ptr = m_img_ptr_hishelf; m_HpfLpf_slope = 0; m_GainBtn.units = "dB"; break; case LOW_SHELF: img_ptr = m_img_ptr_loshelf; m_HpfLpf_slope = 0; m_GainBtn.units = "dB"; break; case PEAK: img_ptr = m_img_ptr_peak; m_HpfLpf_slope = 0; m_GainBtn.units = "dB"; break; case NOTCH: img_ptr = m_img_ptr_notch; m_HpfLpf_slope = 0; m_GainBtn.units = "dB"; break; case NOT_SET: return; break; } //Detect Format Cairo::Format format = Cairo::FORMAT_RGB24; if (img_ptr->get_has_alpha()) { format = Cairo::FORMAT_ARGB32; } // Create a new ImageSurface m_image_surface_ptr = Cairo::ImageSurface::create (format, img_ptr->get_width(), img_ptr->get_height()); // Create the new Context for the ImageSurface m_image_context_ptr = Cairo::Context::create (m_image_surface_ptr); // Draw the image on the new Context Gdk::Cairo::set_source_pixbuf (m_image_context_ptr, img_ptr, 0.0, 0.0); m_image_context_ptr->paint(); } //Data accesors float BandCtl::getGain(){ return m_GainBtn.value; } float BandCtl::getFreq(){ return m_FreqBtn.value; } float BandCtl::getQ(){ return m_QBtn.value; } float BandCtl::getFilterType(){ return (float)m_FilterType; } bool BandCtl::getEnabled() { return m_bBandIsEnabled; } void BandCtl::setGain(float fGain){ m_GainBtn.value = fGain; redraw(); } void BandCtl::setFreq(float fFreq){ m_FreqBtn.value = fFreq; redraw(); } void BandCtl::setQ(float fQ){ m_QBtn.value = fQ; redraw(); } void BandCtl::setFilterType(float fType) { m_FilterType = int2FilterType(fType); loadTypeImg(); redraw(); } void BandCtl::setEnabled(bool bIsEnabled) { m_bBandIsEnabled = bIsEnabled; redraw(); } BandCtl::signal_ctlBandChanged BandCtl::signal_changed() { return m_bandChangedSignal; } BandCtl::signal_BandSelected BandCtl::signal_band_selected() { return m_bandSelectedSignal; } BandCtl::signal_BandUnSelected BandCtl::signal_band_unselected() { return m_bandUnSelectedSignal; } BandCtl::signal_MidSideChanged BandCtl::signal_mid_side_changed() { return m_midsideChangedSignal; } void BandCtl::on_menu_lpf() { m_FilterType = LPF_ORDER_2; loadTypeImg(); m_bandChangedSignal.emit(m_iBandNum, FILTER_TYPE, getFilterType()); m_bandChangedSignal.emit(m_iBandNum, GAIN_TYPE, m_GainBtn.value); m_bandChangedSignal.emit(m_iBandNum, FREQ_TYPE, m_FreqBtn.value); m_QBtn.value = HPF_LPF_Q_DEFAULT; m_bandChangedSignal.emit(m_iBandNum, Q_TYPE, m_QBtn.value); redraw(); } void BandCtl::on_menu_hpf() { m_FilterType = HPF_ORDER_2; loadTypeImg(); m_bandChangedSignal.emit(m_iBandNum, FILTER_TYPE, getFilterType()); m_bandChangedSignal.emit(m_iBandNum, GAIN_TYPE, m_GainBtn.value); m_bandChangedSignal.emit(m_iBandNum, FREQ_TYPE, m_FreqBtn.value); m_QBtn.value = HPF_LPF_Q_DEFAULT; m_bandChangedSignal.emit(m_iBandNum, Q_TYPE, m_QBtn.value); redraw(); } void BandCtl::on_menu_loshelf() { m_FilterType = LOW_SHELF; loadTypeImg(); m_bandChangedSignal.emit(m_iBandNum, FILTER_TYPE, getFilterType()); m_bandChangedSignal.emit(m_iBandNum, GAIN_TYPE, m_GainBtn.value); m_bandChangedSignal.emit(m_iBandNum, FREQ_TYPE, m_FreqBtn.value); m_QBtn.value = HIGH_LOW_SHELF_Q_DEFAULT; m_bandChangedSignal.emit(m_iBandNum, Q_TYPE, m_QBtn.value); redraw(); } void BandCtl::on_menu_hishelf() { m_FilterType = HIGH_SHELF; loadTypeImg(); m_bandChangedSignal.emit(m_iBandNum, FILTER_TYPE, getFilterType()); m_bandChangedSignal.emit(m_iBandNum, GAIN_TYPE, m_GainBtn.value); m_bandChangedSignal.emit(m_iBandNum, FREQ_TYPE, m_FreqBtn.value); m_QBtn.value = HIGH_LOW_SHELF_Q_DEFAULT; m_bandChangedSignal.emit(m_iBandNum, Q_TYPE, m_QBtn.value); redraw(); } void BandCtl::on_menu_peak() { m_FilterType = PEAK; loadTypeImg(); m_bandChangedSignal.emit(m_iBandNum, FILTER_TYPE, getFilterType()); m_bandChangedSignal.emit(m_iBandNum, GAIN_TYPE, m_GainBtn.value); m_bandChangedSignal.emit(m_iBandNum, FREQ_TYPE, m_FreqBtn.value); m_QBtn.value = PEAK_Q_DEFAULT; m_bandChangedSignal.emit(m_iBandNum, Q_TYPE, m_QBtn.value); redraw(); } void BandCtl::on_menu_notch() { m_FilterType = NOTCH; loadTypeImg(); m_bandChangedSignal.emit(m_iBandNum, FILTER_TYPE, getFilterType()); m_bandChangedSignal.emit(m_iBandNum, GAIN_TYPE, m_GainBtn.value); m_bandChangedSignal.emit(m_iBandNum, FREQ_TYPE, m_FreqBtn.value); m_QBtn.value = NOTCH_Q_DEFAULT; m_bandChangedSignal.emit(m_iBandNum, Q_TYPE, m_QBtn.value); redraw(); } void BandCtl::on_menu_hide() { m_TypeBtn.focus = false; m_TypeBtn.pressed = false; redraw(); } //TODO: En ardour4 event de tecla mai arriba bool BandCtl::on_button_press_event(GdkEventButton* event) { //Notify band over m_bandSelectedSignal.emit(m_iBandNum); //Check if is a double click or simple if(event->button == 1) { if(event->type == GDK_2BUTTON_PRESS) { //Double click on the 1st button m_GainBtn.text = (m_HpfLpf_slope == 0) & m_bBandIsEnabled & (event->x > m_GainBtn.x0 && event->x < m_GainBtn.x1 && event->y > m_GainBtn.y0 && event->y < m_GainBtn.y1); m_FreqBtn.text = m_bBandIsEnabled & (event->x > m_FreqBtn.x0 && event->x < m_FreqBtn.x1 && event->y > m_FreqBtn.y0 && event->y < m_FreqBtn.y1); m_QBtn.text = m_bBandIsEnabled & (event->x > m_QBtn.x0 && event->x < m_QBtn.x1 && event->y > m_QBtn.y0 && event->y < m_QBtn.y1); if(m_GainBtn.text) { m_GainBtn.ss.str(""); //Clear stringstream m_GainBtn.ss<x > m_EnableBtn.x0 && event->x < m_EnableBtn.x1 && event->y > m_EnableBtn.y0 && event->y < m_EnableBtn.y1); //Simple click on the 1st button m_TypeBtn.pressed = m_bBandIsEnabled & (event->x > m_TypeBtn.x0 && event->x < m_TypeBtn.x1 && event->y > m_TypeBtn.y0 && event->y < m_TypeBtn.y1); if(m_TypeBtn.pressed) { m_TypePopUp->popup(event->button, event->time); m_TypePopUp->show_all(); } m_iAntValueX = event->x; m_iAntValueY = event->y; m_GainBtn.pressed = m_bBandIsEnabled & (event->x > m_GainBtn.x0 && event->x < m_GainBtn.x1 && event->y > m_GainBtn.y0 && event->y < m_GainBtn.y1); m_FreqBtn.pressed = m_bBandIsEnabled & (event->x > m_FreqBtn.x0 && event->x < m_FreqBtn.x1 && event->y > m_FreqBtn.y0 && event->y < m_FreqBtn.y1); m_QBtn.pressed = m_bBandIsEnabled & (event->x > m_QBtn.x0 && event->x < m_QBtn.x1 && event->y > m_QBtn.y0 && event->y < m_QBtn.y1); if(m_bIsStereoPlugin) { m_MidSideBtn.ML_pressed = m_bBandIsEnabled & (event->x > m_MidSideBtn.Mx && event->x < m_MidSideBtn.Dx && event->y > m_MidSideBtn.y0 && event->y < m_MidSideBtn.y1); m_MidSideBtn.Dual_pressed = m_bBandIsEnabled & (event->x > m_MidSideBtn.Dx && event->x < m_MidSideBtn.Sx && event->y > m_MidSideBtn.y0 && event->y < m_MidSideBtn.y1); m_MidSideBtn.SR_pressed = m_bBandIsEnabled & (event->x > m_MidSideBtn.Sx && event->x < m_MidSideBtn.x1 && event->y > m_MidSideBtn.y0 && event->y < m_MidSideBtn.y1); redraw_MidSide_widget(); } //Disable Q for LPF1 and LPF2 m_QBtn.pressed &= !(m_FilterType == LPF_ORDER_1); m_QBtn.pressed &= !(m_FilterType == HPF_ORDER_1); //Disable Gain for NOTCH m_GainBtn.pressed &= !(m_FilterType == NOTCH); } } redraw(); return true; } bool BandCtl::on_button_release_event(GdkEventButton* event) { //Check for enable button if(m_EnableBtn.pressed && (event->x > m_EnableBtn.x0 && event->x < m_EnableBtn.x1 && event->y > m_EnableBtn.y0 && event->y < m_EnableBtn.y1)) { m_bBandIsEnabled = !m_bBandIsEnabled; m_bandChangedSignal.emit(m_iBandNum, ONOFF_TYPE, m_bBandIsEnabled); } //Check MidSide buttons if(m_bIsStereoPlugin && m_MidSideBtn.ML_pressed && (event->x > m_MidSideBtn.Mx && event->x < m_MidSideBtn.Dx && event->y > m_MidSideBtn.y0 && event->y < m_MidSideBtn.y1)) { m_MidSideBtn.State = ML; m_midsideChangedSignal.emit(m_iBandNum); } if(m_bIsStereoPlugin && m_MidSideBtn.Dual_pressed && (event->x > m_MidSideBtn.Dx && event->x < m_MidSideBtn.Sx && event->y > m_MidSideBtn.y0 && event->y < m_MidSideBtn.y1)) { m_MidSideBtn.State = DUAL; m_midsideChangedSignal.emit(m_iBandNum); } if(m_bIsStereoPlugin && m_MidSideBtn.SR_pressed && (event->x > m_MidSideBtn.Sx && event->x < m_MidSideBtn.x1 && event->y > m_MidSideBtn.y0 && event->y < m_MidSideBtn.y1)) { m_MidSideBtn.State = SR; m_midsideChangedSignal.emit(m_iBandNum); } m_EnableBtn.pressed = false; m_TypeBtn.pressed = false; m_GainBtn.pressed = false; m_FreqBtn.pressed = false; m_QBtn.pressed = false; if(m_bIsStereoPlugin) { m_MidSideBtn.Dual_pressed = false; m_MidSideBtn.ML_pressed = false; m_MidSideBtn.SR_pressed = false; redraw_MidSide_widget(); } //m_iAntValueX = m_iAntValueY = 0; //Inform bode plot m_bandUnSelectedSignal.emit(); redraw(); return true; } bool BandCtl::on_mouse_motion_event(GdkEventMotion* event) { //If some gain, freq, q button is pressed compute new values if(m_GainBtn.pressed) { if(m_HpfLpf_slope) { //HPF and LPF case m_HpfLpf_slope += -1*(event->y - m_iAntValueY); m_HpfLpf_slope = m_HpfLpf_slope < 20 ? 20 : m_HpfLpf_slope; m_HpfLpf_slope = m_HpfLpf_slope > 80 ? 80: m_HpfLpf_slope; setFilterTypeLPFHPFAcordSlope(); } else { //Gain type m_GainBtn.value += (float)(event->y - m_iAntValueY)/-ACCELERATION; m_GainBtn.value = m_GainBtn.value > GAIN_MAX ? GAIN_MAX : m_GainBtn.value; m_GainBtn.value = m_GainBtn.value < GAIN_MIN ? GAIN_MIN : m_GainBtn.value; m_bandChangedSignal.emit(m_iBandNum, GAIN_TYPE, m_GainBtn.value); } } else if(m_FreqBtn.pressed) { m_FreqBtn.value += (m_FreqBtn.value/7.0f)*((float)(event->x-m_iAntValueX)/ACCELERATION); m_FreqBtn.value = m_FreqBtn.value > FREQ_MAX ? FREQ_MAX : m_FreqBtn.value; m_FreqBtn.value = m_FreqBtn.value < FREQ_MIN ? FREQ_MIN : m_FreqBtn.value; m_bandChangedSignal.emit(m_iBandNum, FREQ_TYPE, m_FreqBtn.value); } else if(m_QBtn.pressed) { m_QBtn.value += (float)(event->x - m_iAntValueX)/(-ACCELERATION * 5.0); m_QBtn.value = m_QBtn.value > PEAK_Q_MAX ? PEAK_Q_MAX : m_QBtn.value; m_QBtn.value = m_QBtn.value < PEAK_Q_MIN ? PEAK_Q_MIN : m_QBtn.value; m_bandChangedSignal.emit(m_iBandNum, Q_TYPE, m_QBtn.value); } else { //Check if mouse over some button m_EnableBtn.focus = (event->x > m_EnableBtn.x0 && event->x < m_EnableBtn.x1 && event->y > m_EnableBtn.y0 && event->y < m_EnableBtn.y1); m_TypeBtn.focus = (event->x > m_TypeBtn.x0 && event->x < m_TypeBtn.x1 && event->y > m_TypeBtn.y0 && event->y < m_TypeBtn.y1); m_GainBtn.focus = m_bBandIsEnabled & (event->x > m_GainBtn.x0 && event->x < m_GainBtn.x1 && event->y > m_GainBtn.y0 && event->y < m_GainBtn.y1); m_FreqBtn.focus = m_bBandIsEnabled & (event->x > m_FreqBtn.x0 && event->x < m_FreqBtn.x1 && event->y > m_FreqBtn.y0 && event->y < m_FreqBtn.y1); m_QBtn.focus = m_bBandIsEnabled & (event->x > m_QBtn.x0 && event->x < m_QBtn.x1 && event->y > m_QBtn.y0 && event->y < m_QBtn.y1); if(m_bIsStereoPlugin) { m_MidSideBtn.Dual_focus = m_bBandIsEnabled & (event->x > m_MidSideBtn.Dx && event->x < m_MidSideBtn.Sx && event->y > m_MidSideBtn.y0 && event->y < m_MidSideBtn.y1); m_MidSideBtn.ML_focus = m_bBandIsEnabled & (event->x > m_MidSideBtn.Mx && event->x < m_MidSideBtn.Dx && event->y > m_MidSideBtn.y0 && event->y < m_MidSideBtn.y1); m_MidSideBtn.SR_focus = m_bBandIsEnabled & (event->x > m_MidSideBtn.Sx && event->x < m_MidSideBtn.x1 && event->y > m_MidSideBtn.y0 && event->y < m_MidSideBtn.y1); redraw_MidSide_widget(); } //Disable Q for LPF1 and LPF2 m_QBtn.focus &= !(m_FilterType == LPF_ORDER_1); m_QBtn.focus &= !(m_FilterType == HPF_ORDER_1); //Disable Gain for NOTCH m_GainBtn.focus &= !(m_FilterType == NOTCH); } //Update ant values m_iAntValueX = event->x; m_iAntValueY = event->y; //Notify band over if(m_GainBtn.focus || m_FreqBtn.focus || m_QBtn.focus || m_TypeBtn.focus || m_EnableBtn.focus || m_MidSideBtn.Dual_focus || m_MidSideBtn.ML_focus || m_MidSideBtn.SR_focus) { m_bandSelectedSignal.emit(m_iBandNum); } redraw(); return true; } bool BandCtl::on_scrollwheel_event(GdkEventScroll* event) { double increment = 0.0; if (event->direction == GDK_SCROLL_UP) { // up code increment = 1.0; } else if (event->direction == GDK_SCROLL_DOWN) { // down code increment = -1.0; } if ( m_bBandIsEnabled & (event->x > m_GainBtn.x0 && event->x < m_GainBtn.x1 && event->y > m_GainBtn.y0 && event->y < m_GainBtn.y1)) { if(m_HpfLpf_slope) { //HPF and LPF case increment *= 20.0; m_HpfLpf_slope += increment; m_HpfLpf_slope = m_HpfLpf_slope < 20 ? 20 : m_HpfLpf_slope; m_HpfLpf_slope = m_HpfLpf_slope > 80 ? 80: m_HpfLpf_slope; setFilterTypeLPFHPFAcordSlope(); } else { //Gain type increment *= SCROLL_EVENT_PERCENT*(GAIN_MAX - GAIN_MIN); m_GainBtn.value += increment; m_GainBtn.value = m_GainBtn.value > GAIN_MAX ? GAIN_MAX : m_GainBtn.value; m_GainBtn.value = m_GainBtn.value < GAIN_MIN ? GAIN_MIN : m_GainBtn.value; m_bandChangedSignal.emit(m_iBandNum, GAIN_TYPE, m_GainBtn.value); } } else if( m_bBandIsEnabled & (event->x > m_FreqBtn.x0 && event->x < m_FreqBtn.x1 && event->y > m_FreqBtn.y0 && event->y < m_FreqBtn.y1)) { increment *= SCROLL_EVENT_PERCENT*(FREQ_MAX - FREQ_MIN)*0.0001*m_FreqBtn.value; m_FreqBtn.value += increment; m_FreqBtn.value = m_FreqBtn.value > FREQ_MAX ? FREQ_MAX : m_FreqBtn.value; m_FreqBtn.value = m_FreqBtn.value < FREQ_MIN ? FREQ_MIN : m_FreqBtn.value; m_bandChangedSignal.emit(m_iBandNum, FREQ_TYPE, m_FreqBtn.value); } else if( m_bBandIsEnabled & (event->x > m_QBtn.x0 && event->x < m_QBtn.x1 && event->y > m_QBtn.y0 && event->y < m_QBtn.y1)) { increment *= SCROLL_EVENT_PERCENT*(PEAK_Q_MAX - PEAK_Q_MIN); m_QBtn.value += increment; m_QBtn.value = m_QBtn.value > PEAK_Q_MAX ? PEAK_Q_MAX : m_QBtn.value; m_QBtn.value = m_QBtn.value < PEAK_Q_MIN ? PEAK_Q_MIN : m_QBtn.value; m_bandChangedSignal.emit(m_iBandNum, Q_TYPE, m_QBtn.value); } redraw(); return true; } bool BandCtl::on_key_press_event(GdkEventKey* event) { std::cout<<"BandCtl::on_key_press_event()"<<" event = "<keyval<keyval) { case GDK_KEY_Return: case GDK_KEY_KP_Enter: //Parse the string to get new value if(m_GainBtn.text) { if(parseBtnString(&m_GainBtn)) { m_bandChangedSignal.emit(m_iBandNum, GAIN_TYPE, m_GainBtn.value); } } else if(m_FreqBtn.text) { if(parseBtnString(&m_FreqBtn)) { m_bandChangedSignal.emit(m_iBandNum, FREQ_TYPE, m_FreqBtn.value); } } else if(m_QBtn.text) { if(parseBtnString(&m_QBtn)) { m_bandChangedSignal.emit(m_iBandNum, Q_TYPE, m_QBtn.value); } } break; case GDK_KEY_Escape: m_GainBtn.text = false; m_FreqBtn.text = false; m_QBtn.text = false; //keyPressEvent.disconnect(); //TODO break; case GDK_KEY_BackSpace: if(m_GainBtn.text) { if(m_GainBtn.ss.str().length() > 0) { std::string aux = m_GainBtn.ss.str().erase(m_GainBtn.ss.str().length() - 1); m_GainBtn.ss.str(""); m_GainBtn.ss< 0) { std::string aux = m_FreqBtn.ss.str().erase(m_FreqBtn.ss.str().length() - 1); m_FreqBtn.ss.str(""); m_FreqBtn.ss< 0) { std::string aux = m_QBtn.ss.str().erase(m_QBtn.ss.str().length() - 1); m_QBtn.ss.str(""); m_QBtn.ss<string; } else if(m_FreqBtn.text) { m_FreqBtn.ss << event->string; } else if(m_QBtn.text) { m_QBtn.ss << event->string; } break; case GDK_KEY_K: case GDK_KEY_k: if(m_GainBtn.text) { m_GainBtn.ss << "k"; } else if(m_FreqBtn.text) { m_FreqBtn.ss << "k"; } else if(m_QBtn.text) { m_QBtn.ss << "k"; } break; case GDK_KEY_comma: case GDK_KEY_decimalpoint: case GDK_KEY_KP_Decimal: case GDK_KEY_period: if(m_GainBtn.text) { m_GainBtn.ss << "."; } else if(m_FreqBtn.text) { m_FreqBtn.ss << "."; } else if(m_QBtn.text) { m_QBtn.ss << "."; } break; } redraw(); return true; } //TODO no estic segur de necessitar aquest senyal per a res. bool BandCtl::on_focus_out_event(GdkEventFocus* event) { std::cout <<"on_focus_out_event"<ss.str(); std::string str_k = ""; std::string str_d = ""; unsigned int pos_d = str.find('.'); unsigned int pos_k = str.find('k'); if(pos_k > pos_d && pos_k < str.length() && pos_d < str.length() ) { //Found both, k and decimal but in inverse order, rise an error btn->text = false; //keyPressEvent.disconnect(); //TODO return false; } if(pos_d >= str.length()) { if(pos_k >= str.length()) { //Nor k neither d found so, use the whole string str = str; //Do nothing! } else { //No d is found but k is found str_k = str.substr(0, pos_k); str = str.substr(pos_k + 1, str.length() - pos_k); } } else { if(pos_k >= str.length()) { //No k but d is found str_d = str.substr(pos_d + 1, str.length() - pos_d - 1); str = str.substr(0, pos_d); } else { //Both k and d are found str_k = str.substr(0, pos_k); str_d = str.substr(pos_d + 1, str.length() - pos_d - 1); str = str.substr(pos_k + 1, pos_d - pos_k - 1); } } double val_k = 0.0; double val_d = 0.0; double val = atof(str.c_str()); if(str_k.length() > 0) { val_k = atof(str_k.c_str()) * 1e3; val *= pow10(3.0 - str.length()); if(str.length() > 3) { //throw an error, imposible to match str > 3 with k btn->text = false; //keyPressEvent.disconnect(); //TODO return false; } } if(str_d.length() > 0) { val_d = atof(str_d.c_str())/ pow10((double)str_d.length()); } btn->value = val + val_k + val_d; //clip value to the widget limits! btn->value = btn->value > btn->max ? btn->max : btn->value; btn->value = btn->value < btn->min ? btn->min : btn->value; btn->text = false; //keyPressEvent.disconnect(); //TODO return true; } bool BandCtl::on_mouse_leave_widget(GdkEventCrossing* event) { m_EnableBtn.focus = false; m_TypeBtn.focus = false; m_GainBtn.focus = m_GainBtn.pressed; //Lost focus only if is no pressed m_FreqBtn.focus = m_FreqBtn.pressed; //Lost focus only if is no pressed m_QBtn.focus = m_QBtn.pressed; //Lost focus only if is no pressed //keyPressEvent.disconnect(); //TODO if(m_bIsStereoPlugin) { m_MidSideBtn.Dual_focus = false; m_MidSideBtn.ML_focus = false; m_MidSideBtn.SR_focus = false; redraw_MidSide_widget(); } redraw(); m_bandUnSelectedSignal.emit(); return true; } void BandCtl::redraw() { Glib::RefPtr win = get_window(); if(win) { Gdk::Rectangle r(0, 0, get_allocation().get_width(), get_allocation().get_height()); win->invalidate_rect(r, false); } } bool BandCtl::on_expose_event(GdkEventExpose* event) { Glib::RefPtr window = get_window(); if(window) { Gtk::Allocation allocation = get_allocation(); width = allocation.get_width(); height = allocation.get_height(); if(!m_midSide_surface_ptr && m_bIsStereoPlugin) { //The Mid Side button surface m_midSide_surface_ptr = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, width, (height - 4.0*OUTER_BORDER)/4.0); } if(!m_bBtnInitialized) { m_EnableBtn.focus = false; m_EnableBtn.pressed = false; m_EnableBtn.x0 = OUTER_BORDER + 5; m_EnableBtn.x1 = width - OUTER_BORDER - m_image_surface_ptr->get_width() - 2; m_EnableBtn.y0 = OUTER_BORDER + 2; m_EnableBtn.y1 = OUTER_BORDER + m_image_surface_ptr->get_height() - 1; m_EnableBtn.text = false; m_TypeBtn.focus = false; m_TypeBtn.pressed = false; m_TypeBtn.x0 = width - OUTER_BORDER - m_image_surface_ptr->get_width(); m_TypeBtn.x1 = width - OUTER_BORDER; m_TypeBtn.y0 = OUTER_BORDER + 1; m_TypeBtn.y1 = OUTER_BORDER + m_image_surface_ptr->get_height(); m_TypeBtn.text = false; m_GainBtn.focus = false; m_GainBtn.pressed = false; m_GainBtn.x0 = OUTER_BORDER + 1; m_GainBtn.x1 = width - OUTER_BORDER; m_GainBtn.y0 = m_EnableBtn.y1 + 1; m_GainBtn.y1 = m_EnableBtn.y1 + (height - 4.0*OUTER_BORDER - m_EnableBtn.y1)/ ( m_bIsStereoPlugin ? 4.0 : 3.0); m_GainBtn.text = false; m_GainBtn.min = GAIN_MIN; m_GainBtn.max = GAIN_MAX; m_FreqBtn.focus = false; m_FreqBtn.pressed = false; m_FreqBtn.x0 = OUTER_BORDER + 1; m_FreqBtn.x1 = width - OUTER_BORDER; m_FreqBtn.y0 = m_GainBtn.y1 + 1; m_FreqBtn.y1 = m_EnableBtn.y1 + 2.0*(height - 4.0*OUTER_BORDER - m_EnableBtn.y1)/ (m_bIsStereoPlugin ? 4.0 : 3.0); m_FreqBtn.text = false; m_FreqBtn.min = FREQ_MIN; m_FreqBtn.max = FREQ_MAX; m_QBtn.focus = false; m_QBtn.pressed = false; m_QBtn.x0 = OUTER_BORDER + 1; m_QBtn.x1 = width - OUTER_BORDER; m_QBtn.y0 = m_FreqBtn.y1 + 1; m_QBtn.y1 = m_EnableBtn.y1 + 3.0*(height - 4.0*OUTER_BORDER - m_EnableBtn.y1)/ (m_bIsStereoPlugin ? 4.0 : 3.0); m_QBtn.text = false; m_QBtn.min = PEAK_Q_MIN; m_QBtn.max = PEAK_Q_MAX; if(m_bIsStereoPlugin) { m_MidSideBtn.Dual_focus = false; m_MidSideBtn.ML_focus = false; m_MidSideBtn.SR_focus = false; m_MidSideBtn.Dual_pressed = false; m_MidSideBtn.ML_pressed = false; m_MidSideBtn.SR_pressed = false; m_MidSideBtn.x0 = 4.0*OUTER_BORDER; m_MidSideBtn.x1 = width - 4.0*OUTER_BORDER; m_MidSideBtn.y0 = round(m_QBtn.y1 + 2.0); m_MidSideBtn.y1 = height - 2.0*OUTER_BORDER; m_MidSideBtn.Mx = m_MidSideBtn.x0; m_MidSideBtn.Dx = (m_MidSideBtn.x1 - m_MidSideBtn.x0)/3.0 + m_MidSideBtn.Mx; m_MidSideBtn.Sx = (m_MidSideBtn.x1 - m_MidSideBtn.x0)/3.0 + m_MidSideBtn.Dx; redraw_MidSide_widget(); } m_bBtnInitialized = true; } Cairo::RefPtr cr = window->create_cairo_context(); int radius = (int)round(((double)height) / 20.0); double degrees = M_PI / 180.0; //Paint backgroud cr->save(); cr->set_source_rgb(BACKGROUND_R, BACKGROUND_G, BACKGROUND_B); cr->paint(); //Fill all with background color cr->restore(); //Draw background box cr->save(); cr->begin_new_sub_path(); cr->arc ( OUTER_BORDER + radius, OUTER_BORDER + radius, radius, 180 * degrees, 270 * degrees); cr->arc (width - OUTER_BORDER - radius, OUTER_BORDER + radius, radius, -90 * degrees, 0 * degrees); cr->line_to(width - OUTER_BORDER, height - OUTER_BORDER); cr->line_to(OUTER_BORDER, height - OUTER_BORDER); cr->close_path(); cr->set_line_width(1); if(m_bBandIsEnabled) { cr->set_source_rgba(m_Color.get_red_p(), m_Color.get_green_p(), m_Color.get_blue_p(), 0.5); } else { cr->set_source_rgba(0.3,0.3,0.3,0.6); } cr->stroke_preserve(); if(m_bGlowBand) { cr->set_line_width(2.5); cr->set_source_rgba(0.0,1.0,1.0,0.5); cr->stroke_preserve(); } Cairo::RefPtr bkg_gradient_ptr = Cairo::LinearGradient::create(width/2, OUTER_BORDER, width/2, height - OUTER_BORDER); if(m_bBandIsEnabled) { bkg_gradient_ptr->add_color_stop_rgba (0.0, m_Color.get_red_p(), m_Color.get_green_p(), m_Color.get_blue_p(), 0.6 ); bkg_gradient_ptr->add_color_stop_rgba (1.0, m_Color.get_red_p(), m_Color.get_green_p(), m_Color.get_blue_p(), 0.3 ); } else { bkg_gradient_ptr->add_color_stop_rgba (0.0, 0.8, 0.8, 0.8, 0.4 ); bkg_gradient_ptr->add_color_stop_rgba (1.0, 0.8, 0.8, 0.8, 0.2 ); } bkg_gradient_ptr->add_color_stop_rgba (0.3, m_Color.get_red_p(), m_Color.get_green_p(), m_Color.get_blue_p(), 0.1 ); bkg_gradient_ptr->add_color_stop_rgba (0.5, m_Color.get_red_p(), m_Color.get_green_p(), m_Color.get_blue_p(), 0.0 ); bkg_gradient_ptr->add_color_stop_rgba (0.9, m_Color.get_red_p(), m_Color.get_green_p(), m_Color.get_blue_p(), 0.05 ); cr->set_source(bkg_gradient_ptr); cr->fill(); cr->restore(); //Draw Enable LED cr->save(); cr->translate(m_EnableBtn.x0 - 0.5, m_EnableBtn.y0 + 1.5); ToggleButton::drawLedBtn(cr, m_EnableBtn.focus, m_bBandIsEnabled, "On", 0, 3); cr->restore(); //Draw Gan, Freq, Q Buttons drawBandButton(&m_GainBtn, cr); drawBandButton(&m_FreqBtn, cr); drawBandButton(&m_QBtn, cr); //Draw mid Side surface if(m_midSide_surface_ptr && m_bIsStereoPlugin) { cr->save(); cr->set_source(m_midSide_surface_ptr, 0, m_MidSideBtn.y0); cr->paint(); cr->restore(); } //Draw ComboBox Filter Type icon cr->save(); cr->set_source (m_image_surface_ptr, m_TypeBtn.x0 - 0.5, m_TypeBtn.y0 - 0.5); cr->rectangle (m_TypeBtn.x0 - 0.5, m_TypeBtn.y0 - 0.5, m_image_surface_ptr->get_width(), m_image_surface_ptr->get_height()); cr->clip(); cr->paint(); cr->restore(); //Draw FilterType Focus ComboBox if(m_bBandIsEnabled) { cr->save(); cr->begin_new_sub_path(); cr->arc (m_TypeBtn.x1 - radius - 1 - 0.5, m_TypeBtn.y0 + radius + 0.5, radius, -90 * degrees, 0 * degrees); cr->arc (m_TypeBtn.x1- radius -1 - 0.5, m_TypeBtn.y1 - radius - 0.5, radius, 0 * degrees, 90 * degrees); cr->arc (m_TypeBtn.x0 + radius + 0.5, m_TypeBtn.y1 - radius - 0.5, radius, 90 * degrees, 180 * degrees); cr->arc (m_TypeBtn.x0 + radius + 0.5, m_TypeBtn.y0 + radius + 0.5, radius, 180 * degrees, 270 * degrees); cr->close_path(); cr->set_source_rgba(0.2, 0.2, 0.2, 0.9); cr->set_line_width(1); cr->stroke_preserve(); if(m_TypeBtn.focus) { cr->set_source_rgba(0.0, 1.0, 1.0, 0.7); cr->set_line_width(2); cr->stroke(); } cr->restore(); } } return true; } void BandCtl::drawBandButton(BandCtl::Button* btn, Cairo::RefPtr cr) { //Avoid the drawig of button if it is notch filter gain button or LPF1/HPF1 Q button if(btn->units == "dB" && m_FilterType == NOTCH) { return; } if(btn->units == "Q" && ( m_FilterType == LPF_ORDER_1 || m_FilterType == HPF_ORDER_1 )) { return; } std::stringstream ss; ss<<"sans "<< FONT_SIZE << "px"; Glib::RefPtr pangoLayout = Pango::Layout::create(cr); Pango::FontDescription font_desc(ss.str()); pangoLayout->set_font_description(font_desc); pangoLayout->set_alignment(Pango::ALIGN_CENTER); pangoLayout->set_width(Pango::SCALE * (btn->x1 - btn->x0)); int radius = (int)round(((double)height) / 20.0); double degrees = M_PI / 180.0; //Draw the button in text entry mode if(btn->text) { cr->save(); cr->begin_new_sub_path(); cr->arc (btn->x1 - radius - 3, btn->y0 + radius + 3, radius, -90 * degrees, 0 * degrees); cr->arc (btn->x1- radius -3 , btn->y1 - radius -3, radius, 0 * degrees, 90 * degrees); cr->arc (btn->x0 + radius + 3,btn->y1 - radius -3, radius, 90 * degrees, 180 * degrees); cr->arc (btn->x0 + radius + 3, btn->y0 + radius +3, radius, 180 * degrees, 270 * degrees); cr->close_path(); cr->set_line_width(1.0); cr->set_source_rgba(0.0, 1.0, 1.0, 0.5); cr->stroke(); cr->restore(); cr->save(); cr->move_to(btn->x0, btn->y0 + 0.5*(btn->y1 - btn->y0) - FONT_SIZE/2 - 2); cr->set_source_rgb(m_Color.get_red_p(), m_Color.get_green_p(), m_Color.get_blue_p()); pangoLayout->set_text(btn->ss.str() + "|"); pangoLayout->show_in_cairo_context(cr); cr->stroke(); cr->restore(); return; } //Draw Btn Focus if(btn->focus) { Cairo::RefPtr bkg_gradient_ptr = Cairo::LinearGradient::create(btn->x0 + 0.5*(btn->x1 - btn->x0), btn->y0, btn->x0 + 0.5*(btn->x1 - btn->x0), btn->y1); bkg_gradient_ptr->add_color_stop_rgba (0.1, m_Color.get_red_p() + 0.2, m_Color.get_green_p() + 0.2, m_Color.get_blue_p() + 0.2, 0.0 ); bkg_gradient_ptr->add_color_stop_rgba (0.45, m_Color.get_red_p() + 0.2, m_Color.get_green_p() + 0.2, m_Color.get_blue_p() + 0.2, 0.3 ); bkg_gradient_ptr->add_color_stop_rgba (0.55, m_Color.get_red_p() + 0.2, m_Color.get_green_p() + 0.2, m_Color.get_blue_p() + 0.2, 0.3 ); bkg_gradient_ptr->add_color_stop_rgba (0.9, m_Color.get_red_p() + 0.2, m_Color.get_green_p() + 0.2, m_Color.get_blue_p() + 0.2, 0.0 ); cr->save(); cr->set_source(bkg_gradient_ptr); cr->rectangle(btn->x0, btn->y0, btn->x1 - btn->x0, btn->y1 - btn->y0); cr->fill(); cr->restore(); } //Draw Text cr->save(); ss.str(""); //Clear stringstream if(btn->units != "dB/dec") { int precision = 1; if(btn->value < 100 || (btn->value >= 1e3 && btn->value < 1e4)) precision = 2; ss<< std::setprecision(precision)<< std::fixed <<(btn->value < 1e3 ? btn->value : (0.001*(btn->value))) << (btn->value < 1e3 ? " " : " k") << (btn->units); } else { int slope = m_HpfLpf_slope; if(m_HpfLpf_slope < 40) slope = 20; else if(m_HpfLpf_slope < 60) slope = 40; else if(m_HpfLpf_slope < 80) slope = 60; else slope = 80; ss<< std::setprecision(0)<< std::fixed << slope << " " << (btn->units); } pangoLayout->set_text(ss.str()); //Shadow cr->move_to(btn->x0 + 1, btn->y0 + 0.5*(btn->y1 - btn->y0) - FONT_SIZE/2 - 2 + 1); cr->set_source_rgba(0,0,0,0.5); pangoLayout->show_in_cairo_context(cr); cr->stroke(); //Text cr->move_to(btn->x0, btn->y0 + 0.5*(btn->y1 - btn->y0) - FONT_SIZE/2 - 2); if(!m_bBandIsEnabled) { cr->set_source_rgba(1.0, 1.0, 1.0, 0.4); } else if(btn->pressed) { cr->set_source_rgba(1.0, 1.0, 1.0, 1.0); } else { cr->set_source_rgba(1.0, 1.0, 1.0, 0.8); } pangoLayout->show_in_cairo_context(cr); cr->stroke(); cr->restore(); } void BandCtl::redraw_MidSide_widget() { if(m_midSide_surface_ptr && m_bIsStereoPlugin) { //Create cairo context using the buffer surface Cairo::RefPtr cr = Cairo::Context::create(m_midSide_surface_ptr); const double btnH = round(m_midSide_surface_ptr->get_height() - 6.0*OUTER_BORDER); //Clear current context cr->save(); cr->set_operator(Cairo::OPERATOR_CLEAR); cr->paint(); cr->restore(); //Draw Color background on selected button cr->save(); Cairo::RefPtr bkg_gradient_ptr = Cairo::LinearGradient::create(0, 0, 0, m_midSide_surface_ptr->get_height()); switch(m_MidSideBtn.State) { case DUAL: cr->rectangle(m_MidSideBtn.Dx, 0, m_MidSideBtn.Sx - m_MidSideBtn.Dx, btnH); break; case ML: cr->begin_new_sub_path(); cr->arc( m_MidSideBtn.x0 + btnH/2.0, btnH/2.0 + 0.5, btnH/2.0, M_PI/2.0, -M_PI/2.0); cr->line_to( m_MidSideBtn.Dx, 0); cr->line_to( m_MidSideBtn.Dx, btnH); cr->close_path(); break; case SR: cr->begin_new_sub_path(); cr->arc( m_MidSideBtn.x1 - btnH/2.0, btnH/2.0 + 0.5, btnH/2.0 , -M_PI/2.0, M_PI/2.0); cr->line_to( m_MidSideBtn.Sx, btnH); cr->line_to( m_MidSideBtn.Sx, 0); cr->close_path(); break; } bkg_gradient_ptr->add_color_stop_rgba (0.1, 0.4, 0.4, 0.4, 0.5 ); bkg_gradient_ptr->add_color_stop_rgba (0.7, m_Color.get_red_p(), m_Color.get_green_p(), m_Color.get_blue_p(), 0.6 ); bkg_gradient_ptr->add_color_stop_rgba (0.9, 0.2, 0.2, 0.2, 0.3 ); cr->set_source(bkg_gradient_ptr); cr->fill(); cr->restore(); //Draw a box cr->save(); cr->begin_new_sub_path(); cr->arc( m_MidSideBtn.x0 + btnH/2.0, btnH/2.0 + 0.5, btnH/2.0, M_PI/2.0, -M_PI/2.0); cr->arc( m_MidSideBtn.x1 - btnH/2.0, btnH/2.0 + 0.5, btnH/2.0 , -M_PI/2.0, M_PI/2.0); cr->close_path(); cr->set_source_rgba(0.05,0.05,0.05,0.2); cr->fill_preserve(); cr->set_line_width(1.0); if(m_bBandIsEnabled) { cr->set_source_rgba(m_Color.get_red_p(), m_Color.get_green_p(), m_Color.get_blue_p(), 0.7); cr->stroke_preserve(); } cr->set_source_rgba(0.5, 0.5, 0.5, 0.7); cr->stroke(); cr->move_to(m_MidSideBtn.Dx, 0); cr->line_to(m_MidSideBtn.Dx, btnH); cr->stroke(); cr->move_to(m_MidSideBtn.Sx, 0); cr->line_to(m_MidSideBtn.Sx, btnH); cr->stroke(); cr->restore(); //Draw Text Glib::RefPtr pangoLayout = Pango::Layout::create(cr); Pango::FontDescription font_desc("sans bold 10px"); pangoLayout->set_font_description(font_desc); pangoLayout->set_alignment(Pango::ALIGN_CENTER); cr->save(); if(m_MidSideBtn.ML_focus) { cr->set_source_rgba(0.0, 1.0, 1.0, 1.0); } else if(m_MidSideBtn.State == BandCtl::ML) { cr->set_source_rgba(0.0, 1.0, 1.0, 0.8); } else { cr->set_source_rgba(0.5, 0.5, 0.5, 0.6); } pangoLayout->set_width(Pango::SCALE * (m_MidSideBtn.Dx - m_MidSideBtn.Mx)); cr->move_to(m_MidSideBtn.Mx, btnH/2.0 - 5); if(m_MidSideBtn.MidSideMode) { pangoLayout->set_text("M"); } else { pangoLayout->set_text("L"); } pangoLayout->show_in_cairo_context(cr); cr->stroke(); if(m_MidSideBtn.SR_focus) { cr->set_source_rgba(0.0, 1.0, 1.0, 1.0); } else if(m_MidSideBtn.State == BandCtl::SR) { cr->set_source_rgba(1.0, 1.0, 1.0, 0.8); } else { cr->set_source_rgba(0.5, 0.5, 0.5, 0.6); } pangoLayout->set_width(Pango::SCALE * (m_MidSideBtn.x1 - m_MidSideBtn.Sx)); cr->move_to(m_MidSideBtn.Sx, btnH/2.0 - 5); if(m_MidSideBtn.MidSideMode) { pangoLayout->set_text("S"); } else { pangoLayout->set_text("R"); } pangoLayout->show_in_cairo_context(cr); cr->stroke(); cr->restore(); //Draw circle in the center cr->save(); cr->set_line_width(1.5); if(m_MidSideBtn.Dual_focus) { cr->set_source_rgba(0.0, 1.0, 1.0, 1.0); } else if( m_MidSideBtn.State == DUAL ) { cr->set_source_rgba(0.0, 1.0, 1.0, 0.6); } else { cr->set_source_rgba(0.5, 0.5, 0.5, 0.6); } const double Xcenter = (m_midSide_surface_ptr->get_width()/2.0); cr->arc(Xcenter - btnH/4.0 + (btnH/10.0), (btnH/2.0) + 0.5, btnH/3.5, 0.0, 2.0*M_PI); cr->stroke(); if(m_MidSideBtn.Dual_focus) { cr->set_source_rgba(0.0, 1.0, 1.0, 1.0); } else if( m_MidSideBtn.State == DUAL ) { cr->set_source_rgba(1.0, 1.0, 1.0, 0.6); } else { cr->set_source_rgba(0.5, 0.5, 0.5, 0.6); } cr->arc(Xcenter + btnH/4.0 - (btnH/10.0), (btnH/2.0) + 0.5, btnH/3.5, 0.0, 2.0*M_PI); cr->stroke(); cr->restore(); } } void BandCtl::setStereoMode(bool bIsMidSide) { if(m_bIsStereoPlugin) { m_MidSideBtn.MidSideMode = bIsMidSide; redraw_MidSide_widget(); redraw(); } } BandCtl::MSState BandCtl::getStereoState() { return m_MidSideBtn.State; } void BandCtl::setStereoState(BandCtl::MSState state) { if(m_bIsStereoPlugin) { m_MidSideBtn.State = state; redraw_MidSide_widget(); redraw(); } } eq10q-2.2/gui/widgets/bodeplot.cpp0000644000175000001440000015610413023240626016442 0ustar sapistausers/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "bodeplot.h" #include "colors.h" #include "guiconstants.h" #include "../../dsp/fastmath.h" #include #include #include #include #include #include #include //Use the DSP code to generate digital filter coefs #include "../../dsp/filter.h" #define SPLINE_TENSION 0.2 #define BALL_DETECTION_PIXELS 12 PlotEQCurve::PlotEQCurve(int iNumOfBands, int channels) :width(PLOT_WIDTH), height(PLOT_HIGHT), m_TotalBandsCount(iNumOfBands), m_NumChannels(channels), m_Bypass(false), bMotionIsConnected(false), bBandFocus(false), m_BandRedraw(false), m_fullRedraw(false), m_justRedraw(false), SampleRate(0), //Initially zero to force the freq vectors initialization m_FftActive(false), m_minFreq(MIN_FREQ), m_maxFreq(MAX_FREQ), m_dB_plot_range(50.0), fft_gain(0.0), fft_range(80.0), m_bIsSpectrogram(false), m_bFftHold(false) { //Allocate memory for filter data strcuts m_filters = new FilterBandParams*[m_TotalBandsCount]; for (int i = 0; i [m_TotalBandsCount]; //Allocate memory for FFT data xPixels_fft = new double[(FFT_N/2) + 1]; xPixels_fft_bins = new double[(FFT_N/2) + 1]; fft_pink_noise = new double[(FFT_N/2) + 1]; fft_plot = new double[(FFT_N/2) + 1]; fft_ant_data = new double [(FFT_N/2) + 1]; fft_log_lut = GenerateLog10LUT(); resetCurve(); set_size_request(width, height); //Init zoom widget m_zoom_widget.center_focus = false; m_zoom_widget.center_press = false; m_zoom_widget.f1_focus = false; m_zoom_widget.f1_press = false; m_zoom_widget.f2_focus = false; m_zoom_widget.f2_press = false; m_zoom_widget.x1 = 0; m_zoom_widget.x2 = 0; m_zoom_widget.x_ant = 0; //Connect mouse signals add_events(Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::POINTER_MOTION_MASK | Gdk::SCROLL_MASK | Gdk::LEAVE_NOTIFY_MASK); signal_button_press_event().connect(sigc::mem_fun(*this, &PlotEQCurve::on_button_press_event),true); signal_button_release_event().connect(sigc::mem_fun(*this, &PlotEQCurve::on_button_release_event),true); signal_scroll_event().connect(sigc::mem_fun(*this, &PlotEQCurve::on_scrollwheel_event),true); //The timeout signal used to refresh the display is now connected at first run of on_expose_event to run it with freq vector correctly initialized signal_motion_notify_event().connect(sigc::mem_fun(*this, &PlotEQCurve::on_mouse_motion_event),true); signal_leave_notify_event().connect(sigc::mem_fun(*this, &PlotEQCurve::on_mouse_leave_widget),true); //Init FFT vectors setSampleRate(44.1e3); //Allow this widget to get keyboard focus set_can_focus(true); } PlotEQCurve::~PlotEQCurve() { //Delete filter structs for (int i = 0; i cr = Cairo::Context::create(m_fft_surface_ptr); cr->save(); cr->set_operator(Cairo::OPERATOR_CLEAR); cr->paint(); cr->restore(); } //Redraw all by timer m_fullRedraw = true; } void PlotEQCurve::setCenter(double center) { //Limit center to the possible range according the current span double sp = log10(m_maxFreq/m_minFreq); double cmin = MIN_FREQ * sqrt(pow10(sp)); double cmax = MAX_FREQ / sqrt(pow10(sp)); double cn = center; cn = cn > cmax ? cmax : cn; cn = cn < cmin ? cmin : cn; setCenterSpan(cn, sp); } void PlotEQCurve::setSpan(double span) { //Limit center to the possible range according the current span double sp_act = log10(m_maxFreq/m_minFreq); double cn = m_minFreq * sqrt(pow10(sp_act)); double smax1 = 2.0*log10(cn/MIN_FREQ); double smax2= 2.0*log10(MAX_FREQ/cn); double smax = smax1 < smax2 ? smax1 : smax2; double sp = span > smax ? smax : span; sp = sp < MIN_SPAN_DEC ? MIN_SPAN_DEC : sp; setCenterSpan(cn, sp); } void PlotEQCurve::recomputeMinFreq_fromX1Pixel(double x1) { if( m_zoom_widget.x2 - x1 < 30) return; //To avoid crossing control points double desp = x1 - m_zoom_widget.x1; double local_x1 = m_zoom_widget.x1 + desp; double local_x2 = m_zoom_widget.x2 - desp; double fmin = MIN_FREQ*pow((MAX_FREQ/MIN_FREQ),((local_x1 - 3.5)/((double)m_zoom_surface_ptr->get_width()))); double fmax = MIN_FREQ*pow((MAX_FREQ/MIN_FREQ),((local_x2 + 3.5)/((double)m_zoom_surface_ptr->get_width()))); setSpan(log10(fmax/fmin)); } void PlotEQCurve::recomputeMaxFreq_fromX2Pixel(double x2) { if( x2 - m_zoom_widget.x1 < 30) return; //To avoid crossing control points double desp = x2 - m_zoom_widget.x2; double local_x1 = m_zoom_widget.x1 - desp; double local_x2 = m_zoom_widget.x2 + desp; double fmin = MIN_FREQ*pow((MAX_FREQ/MIN_FREQ),((local_x1 - 3.5)/((double)m_zoom_surface_ptr->get_width()))); double fmax = MIN_FREQ*pow((MAX_FREQ/MIN_FREQ),((local_x2 + 3.5)/((double)m_zoom_surface_ptr->get_width()))); setSpan(log10(fmax/fmin)); } void PlotEQCurve::recomputeCenterFreq(double xDiff) { double local_x1 = m_zoom_widget.x1 - CURVE_MARGIN - CURVE_TEXT_OFFSET_X + xDiff; double local_x2 = m_zoom_widget.x2 - CURVE_MARGIN - CURVE_TEXT_OFFSET_X + xDiff; double fmin = MIN_FREQ*pow((MAX_FREQ/MIN_FREQ),((local_x1 - 3.5)/((double)m_zoom_surface_ptr->get_width()))); double fmax = MIN_FREQ*pow((MAX_FREQ/MIN_FREQ),((local_x2 + 3.5)/((double)m_zoom_surface_ptr->get_width()))); double sp_act = log10(fmax/fmin); double cn = fmin * sqrt(pow10(sp_act)); setCenter(cn); } void PlotEQCurve::resetCurve() { for(int i = 0; i < CURVE_NUM_OF_POINTS; i++) { for(int j = 0; j < m_NumChannels; j++) { main_y[j][i] = 0.0; } } for (int i = 0; ibIsOn = false; m_filters[i]->Freq = 20.0; m_filters[i]->fType = PEAK; m_filters[i]->Gain = 0.0; m_filters[i]->Q = 2.0; //Reset band_y to zero for(int j = 0; j < CURVE_NUM_OF_POINTS; j++) { band_y[i][j] = 0.0; } } } void PlotEQCurve::ComputeFilter(int bd_ix) { if(m_filters[bd_ix]->fType != NOT_SET) { CalcBand_DigitalFilter(bd_ix); } //Compute Shape for(int i = 0; i < CURVE_NUM_OF_POINTS; i++) { for(int j = 0; j < m_NumChannels; j++) { main_y[j][i] = 0.0; } for( int j = 0; j < m_TotalBandsCount; j++) { if(m_filters[j]->bIsOn) { switch(band_state[j]) { case MONO: main_y[0][i] += band_y[j][i]; break; case DUAL: main_y[0][i] += band_y[j][i]; main_y[1][i] += band_y[j][i]; break; case ML: main_y[0][i] += band_y[j][i]; break; case SR: main_y[1][i] += band_y[j][i]; break; } } } } } //===============================DATA ACCESORS=================================================================== void PlotEQCurve::setBandGain(int bd_ix, float newGain) { m_filters[bd_ix]->Gain = newGain; cueBandRedraws(bd_ix); } void PlotEQCurve::setBandFreq(int bd_ix, float newFreq) { m_filters[bd_ix]->Freq = newFreq; cueBandRedraws(bd_ix); } void PlotEQCurve::setBandQ(int bd_ix, float newQ) { m_filters[bd_ix]->Q = newQ; cueBandRedraws(bd_ix); } void PlotEQCurve::setBandType(int bd_ix, int newType) { m_filters[bd_ix]->fType = int2FilterType(newType); cueBandRedraws(bd_ix); } void PlotEQCurve::setBandEnable(int bd_ix, bool bIsEnabled) { m_filters[bd_ix]->bIsOn = bIsEnabled; cueBandRedraws(bd_ix); } void PlotEQCurve::setBypass(bool bypass) { m_Bypass = bypass; m_BandRedraw = true; //Force a redraw of curve in next timer without computing bands } //==========================SIGNAL SLOTS=========================================================== //Mouse grab signal handlers bool PlotEQCurve::on_button_press_event(GdkEventButton* event) { grab_focus(); //Check if is a double click or simple if(event->button == 1 && bBandFocus) { if(event->type == GDK_2BUTTON_PRESS) //Double click on the 1st button { //Emit signal button double click, this is enable or disable band setBandEnable(m_iBandSel, !m_filters[m_iBandSel]->bIsOn); m_BandEnabledSignal.emit(m_iBandSel, m_filters[m_iBandSel]->bIsOn); } else //if (!bMotionIsConnected ) // && m_filters[m_iBandSel]->bIsOn) { bMotionIsConnected = true; } } //Check if is a double click or simple if(event->button == 1 && (m_zoom_widget.center_focus || m_zoom_widget.f1_focus || m_zoom_widget.f2_focus)) { if(event->type == GDK_2BUTTON_PRESS) //Double click on the 1st button { //Reset freq zoom resetCenterSpan(); } else { m_zoom_widget.center_press = m_zoom_widget.center_focus; m_zoom_widget.f1_press = m_zoom_widget.f1_focus; m_zoom_widget.f2_press = m_zoom_widget.f2_focus; m_zoom_widget.x_ant = event->x; } } return true; } bool PlotEQCurve::on_button_release_event(GdkEventButton* event) { bMotionIsConnected = false; m_zoom_widget.center_press = false; m_zoom_widget.f1_press = false; m_zoom_widget.f2_press = false; return true; } bool PlotEQCurve::on_scrollwheel_event(GdkEventScroll* event) { //Check if is over some control pointer const double x = event->x - CURVE_MARGIN - CURVE_TEXT_OFFSET_X; const double y = event->y - CURVE_MARGIN; for(int i = 0; i < m_TotalBandsCount; i++) { if( x > freq2Pixels(m_filters[i]->Freq) - BALL_DETECTION_PIXELS && x < freq2Pixels(m_filters[i]->Freq) + BALL_DETECTION_PIXELS && y > dB2Pixels(m_filters[i]->Gain) - BALL_DETECTION_PIXELS && y < dB2Pixels(m_filters[i]->Gain) + BALL_DETECTION_PIXELS ) { if (event->direction == GDK_SCROLL_UP) { // up code m_filters[i]->Q += SCROLL_EVENT_INCREMENT*m_filters[i]->Q; m_filters[i]->Q = m_filters[i]->Q > PEAK_Q_MAX ? PEAK_Q_MAX : m_filters[i]->Q; } else if (event->direction == GDK_SCROLL_DOWN) { // down code m_filters[i]->Q -= SCROLL_EVENT_INCREMENT*m_filters[i]->Q; m_filters[i]->Q = m_filters[i]->Q < PEAK_Q_MIN ? PEAK_Q_MIN : m_filters[i]->Q; } //Redraw with timeout cueBandRedraws(m_iBandSel); // emit the signal m_BandChangedSignal.emit( i, m_filters[i]->Gain, m_filters[i]->Freq, m_filters[i]->Q); break; } } return true; } bool PlotEQCurve::on_mouse_motion_event(GdkEventMotion* event) { const double x = event->x - CURVE_MARGIN - CURVE_TEXT_OFFSET_X; const double y = event->y - CURVE_MARGIN; if(bMotionIsConnected) { //Recompute curve on current band and redraw double xclipped = x > width - 2*CURVE_MARGIN - CURVE_TEXT_OFFSET_X - BALL_DETECTION_PIXELS ? width - 2*CURVE_MARGIN - CURVE_TEXT_OFFSET_X - BALL_DETECTION_PIXELS : x; xclipped = xclipped < BALL_DETECTION_PIXELS ? BALL_DETECTION_PIXELS : xclipped; m_filters[m_iBandSel]->Freq = Pixels2freq(xclipped); m_filters[m_iBandSel]->Freq = m_filters[m_iBandSel]->Freq > FREQ_MAX ? FREQ_MAX : m_filters[m_iBandSel]->Freq; m_filters[m_iBandSel]->Freq = m_filters[m_iBandSel]->Freq < FREQ_MIN ? FREQ_MIN : m_filters[m_iBandSel]->Freq; if (m_filters[m_iBandSel]->fType == PEAK || m_filters[m_iBandSel]->fType == HIGH_SHELF || m_filters[m_iBandSel]->fType == LOW_SHELF ) { m_filters[m_iBandSel]->Gain = Pixels2dB(y); m_filters[m_iBandSel]->Gain = m_filters[m_iBandSel]->Gain > GAIN_MAX ? GAIN_MAX : m_filters[m_iBandSel]->Gain; m_filters[m_iBandSel]->Gain = m_filters[m_iBandSel]->Gain < GAIN_MIN ? GAIN_MIN : m_filters[m_iBandSel]->Gain; } else { m_filters[m_iBandSel]->Gain = 0.0; } redraw_cursor(xclipped, dB2Pixels(m_filters[m_iBandSel]->Gain)); //Redraw with timeout cueBandRedraws(m_iBandSel); // emit the signal setBandEnable(m_iBandSel, true); //If move control ball then enable band m_BandEnabledSignal.emit(m_iBandSel, m_filters[m_iBandSel]->bIsOn); m_BandChangedSignal.emit(m_iBandSel, m_filters[m_iBandSel]->Gain, m_filters[m_iBandSel]->Freq, m_filters[m_iBandSel]->Q); } else { redraw_cursor(event->x -CURVE_MARGIN - CURVE_TEXT_OFFSET_X, event->y - CURVE_MARGIN); //Check if is over Zoom widget if((event->x > m_zoom_widget.x1 - 10 && event->x < m_zoom_widget.x2 + 10 && event->y > height -CURVE_MARGIN - CURVE_TEXT_OFFSET_Y + ZOOM_WIDGET_BORDER_Y && event->y < height -CURVE_MARGIN ) || m_zoom_widget.center_press || m_zoom_widget.f1_press || m_zoom_widget.f2_press) { if(m_zoom_widget.center_press) { m_zoom_widget.center_focus = true; m_zoom_widget.f1_focus = false; m_zoom_widget.f2_focus = false; int x,y; get_pointer(x,y); //Using get_pinter() method is better than event->x here to avoid delays caused by unhalded mouse events due recomputeCenterFreq processing time recomputeCenterFreq(x - m_zoom_widget.x_ant); get_pointer(x,y); m_zoom_widget.x_ant = x; m_fullRedraw = true; } else if(m_zoom_widget.f1_press) { m_zoom_widget.f1_focus = true; m_zoom_widget.f2_focus = false; m_zoom_widget.center_focus = false; recomputeMinFreq_fromX1Pixel(event->x); m_fullRedraw = true; } else if(m_zoom_widget.f2_press) { m_zoom_widget.f2_focus = true; m_zoom_widget.f1_focus = false; m_zoom_widget.center_focus = false; recomputeMaxFreq_fromX2Pixel(event->x); m_fullRedraw = true; } else if(event->x > m_zoom_widget.x1 + 10 && event->x < m_zoom_widget.x2 - 10 ) { //Center of the widget m_zoom_widget.center_focus = true; m_zoom_widget.f1_focus = false; m_zoom_widget.f2_focus = false; redraw_zoom_widget(); m_justRedraw = true; } else { if(event->x < (0.5*(m_zoom_widget.x2 - m_zoom_widget.x1) + m_zoom_widget.x1)) { //Span of the widget f1 m_zoom_widget.f1_focus = true; m_zoom_widget.center_focus = false; m_zoom_widget.f2_focus = false; redraw_zoom_widget(); m_justRedraw = true; } else { //Span of the widget f2 m_zoom_widget.f2_focus = true; m_zoom_widget.center_focus = false; m_zoom_widget.f1_focus = false; redraw_zoom_widget(); m_justRedraw = true; } } } else if(m_zoom_widget.center_focus || m_zoom_widget.f1_focus || m_zoom_widget.f2_focus) //Mouse has leaved zoom widget { m_zoom_widget.center_focus = false; m_zoom_widget.f1_focus = false; m_zoom_widget.f2_focus = false; redraw_zoom_widget(); m_justRedraw = true; } //Check if is over some control pointer bBandFocus = false; bool vFocus[m_TotalBandsCount]; int focus_hits = 0; for(int i = 0; i < m_TotalBandsCount; i++) { if( x > freq2Pixels(m_filters[i]->Freq) - BALL_DETECTION_PIXELS && x < freq2Pixels(m_filters[i]->Freq) + BALL_DETECTION_PIXELS && y > dB2Pixels(m_filters[i]->Gain) - BALL_DETECTION_PIXELS && y < dB2Pixels(m_filters[i]->Gain) + BALL_DETECTION_PIXELS && x > 0 && x < width - 2*CURVE_MARGIN - CURVE_TEXT_OFFSET_X && y > 0 && y < height - 2*CURVE_MARGIN - CURVE_TEXT_OFFSET_Y ) { m_iBandSel = i; bBandFocus = true; vFocus[i]=true; focus_hits++; } else { vFocus[i]=false; } } if(focus_hits > 1) { for(int i = 0; i < m_TotalBandsCount; i++) { if(vFocus[i] && m_filters[i]->bIsOn) { m_iBandSel = i; } } } if(bBandFocus) { m_BandSelectedSignal.emit(m_iBandSel); } else { m_BandUnselectedSignal.emit(); } m_BandRedraw = true; //Force a redraw of curve in next timer without computing bands } if( event->x > CURVE_MARGIN + CURVE_TEXT_OFFSET_X && event->x < width - CURVE_MARGIN && event->y > CURVE_MARGIN && event->y < height -CURVE_MARGIN - CURVE_TEXT_OFFSET_Y ) { //Mouse on curve zone get_window()->set_cursor(Gdk::Cursor(Gdk::BLANK_CURSOR)); } else { //Mouse outside curve zone get_window()->set_cursor(Gdk::Cursor()); } return true; } bool PlotEQCurve::on_mouse_leave_widget(GdkEventCrossing* event) { m_zoom_widget.center_focus = false; m_zoom_widget.f1_focus = false; m_zoom_widget.f2_focus = false; redraw_zoom_widget(); m_justRedraw = true; if(!bMotionIsConnected) { redraw_cursor(event->x - CURVE_MARGIN - CURVE_TEXT_OFFSET_X, event->y - CURVE_MARGIN); bBandFocus = false; m_BandUnselectedSignal.emit(); m_BandRedraw = true; } return true; } //Timer callback for auto redraw and graph math bool PlotEQCurve::on_timeout_redraw() { bool bRedraw = false; //Full redraw request if(m_fullRedraw) { redraw_zoom_widget(); redraw_grid_widget(); redraw_xAxis_widget(); redraw_yAxis_widget(); for(int i = 0; i < m_TotalBandsCount; i++) { m_Bands2Redraw[i] = true; } m_BandRedraw = true; m_fullRedraw = false; bRedraw = true; } //Redraw if curve changed if(m_BandRedraw) { for(int i = 0; i < m_TotalBandsCount; i++) { if(m_Bands2Redraw[i]) { m_Bands2Redraw[i] = false; ComputeFilter(i); redraw_curve_widgets(i); } } redraw_main_curve(); m_BandRedraw = false; bRedraw = true; } if(bRedraw || m_justRedraw) { m_justRedraw = false; Glib::RefPtr win = get_window(); if(win) { Gdk::Rectangle r(0, 0, get_allocation().get_width(), get_allocation().get_height()); win->invalidate_rect(r, false); } } return true; } //Override default signal handler: bool PlotEQCurve::on_expose_event(GdkEventExpose* event) { Glib::RefPtr window = get_window(); if(window) { Gtk::Allocation allocation = get_allocation(); width = allocation.get_width(); height = allocation.get_height(); if( !(m_background_surface_ptr || m_fft_surface_ptr || m_zoom_surface_ptr || m_maincurve_surface_ptr || m_grid_surface_ptr || m_xAxis_surface_ptr || m_yAxis_surface_ptr || m_cursor_surface_ptr)) { m_background_surface_ptr = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, width, height); m_fft_surface_ptr = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, width - 2*CURVE_MARGIN - CURVE_TEXT_OFFSET_X, height - 2*CURVE_MARGIN - CURVE_TEXT_OFFSET_Y); m_zoom_surface_ptr = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, width - 2*CURVE_MARGIN - CURVE_TEXT_OFFSET_X, CURVE_TEXT_OFFSET_Y - ZOOM_WIDGET_BORDER_Y); //Set initial x1 and x2 redraw_zoom_widget(); m_maincurve_surface_ptr = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, width - 2*CURVE_MARGIN - CURVE_TEXT_OFFSET_X, height - 2*CURVE_MARGIN - CURVE_TEXT_OFFSET_Y); for(int i = 0; i < m_TotalBandsCount; i++) { m_curve_surface_ptr[i] = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, width - 2*CURVE_MARGIN - CURVE_TEXT_OFFSET_X, height - 2*CURVE_MARGIN - CURVE_TEXT_OFFSET_Y); } m_grid_surface_ptr = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, width - 2*CURVE_MARGIN - CURVE_TEXT_OFFSET_X, height - 2*CURVE_MARGIN - CURVE_TEXT_OFFSET_Y); m_xAxis_surface_ptr = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, width - 2*CURVE_MARGIN - CURVE_TEXT_OFFSET_X, CURVE_TEXT_OFFSET_Y); m_yAxis_surface_ptr = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, CURVE_TEXT_OFFSET_X, height - CURVE_TEXT_OFFSET_Y); m_cursor_surface_ptr = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, width - 2*CURVE_MARGIN - CURVE_TEXT_OFFSET_X, height - 2*CURVE_MARGIN - CURVE_TEXT_OFFSET_Y); redraw_background_widget(); resetCenterSpan(); Glib::signal_timeout().connect( sigc::mem_fun(*this, &PlotEQCurve::on_timeout_redraw), AUTO_REFRESH_TIMEOUT_MS ); //Connectin timer here to avoid using plot with unitialized freq vector } Cairo::RefPtr cr = window->create_cairo_context(); //Draw the background if(m_background_surface_ptr) { cr->save(); cr->set_source(m_background_surface_ptr, 0, 0); cr->paint(); cr->restore(); } //Draw zoom widget if(m_zoom_surface_ptr) { cr->save(); cr->set_source(m_zoom_surface_ptr, CURVE_MARGIN + CURVE_TEXT_OFFSET_X, height - CURVE_MARGIN - CURVE_TEXT_OFFSET_Y + ZOOM_WIDGET_BORDER_Y); cr->paint(); cr->restore(); } //Draw FFT data if(m_FftActive && m_fft_surface_ptr) { cr->save(); cr->set_source(m_fft_surface_ptr, CURVE_MARGIN + CURVE_TEXT_OFFSET_X, CURVE_MARGIN); cr->paint(); cr->restore(); } //Draw the grid if(m_grid_surface_ptr) { cr->save(); cr->set_source(m_grid_surface_ptr, CURVE_MARGIN + CURVE_TEXT_OFFSET_X, CURVE_MARGIN); cr->paint(); cr->restore(); } //Db Scale Axis if(m_yAxis_surface_ptr) { cr->save(); cr->set_source(m_yAxis_surface_ptr, CURVE_MARGIN, 0); cr->paint(); cr->restore(); } //Hz scale Axis if(m_xAxis_surface_ptr) { cr->save(); cr->set_source(m_xAxis_surface_ptr, CURVE_MARGIN + CURVE_TEXT_OFFSET_X, height - CURVE_MARGIN - CURVE_TEXT_OFFSET_Y); cr->paint(); cr->restore(); } //Draw the cursor position if(m_cursor_surface_ptr) { cr->save(); cr->set_source(m_cursor_surface_ptr, CURVE_MARGIN + CURVE_TEXT_OFFSET_X, CURVE_MARGIN); cr->paint(); cr->restore(); } //Draw the curve if(m_maincurve_surface_ptr) { cr->save(); cr->set_source(m_maincurve_surface_ptr, CURVE_MARGIN + CURVE_TEXT_OFFSET_X, CURVE_MARGIN); cr->paint(); cr->restore(); } //draw de outer grind box cr->save(); cr->set_source_rgb(0.3, 0.3, 0.3); cr->set_line_width(1); cr->rectangle(CURVE_MARGIN + CURVE_TEXT_OFFSET_X + 0.5, CURVE_MARGIN + 0.5, width - 2*CURVE_MARGIN - CURVE_TEXT_OFFSET_X, height -2* CURVE_MARGIN - CURVE_TEXT_OFFSET_Y); cr->stroke(); cr->restore(); } return true; } void PlotEQCurve::glowBand(int band) { m_iBandSel = band; bBandFocus = true; m_BandRedraw = true; //Force a redraw of curve in next timer without computing bands } void PlotEQCurve::unglowBands() { bBandFocus = false; m_BandRedraw = true; //Force a redraw of curve in next timer without computing bands } void PlotEQCurve::cueBandRedraws(int band) { m_Bands2Redraw[band] = true; m_BandRedraw = true; } double PlotEQCurve::dB2Pixels(double db) { return ((((double)height)/2.0) - ((((double)height) - 2*CURVE_MARGIN - CURVE_TEXT_OFFSET_Y)/m_dB_plot_range)*db - CURVE_TEXT_OFFSET_Y/2 - CURVE_MARGIN); } double PlotEQCurve::freq2Pixels(double f) { return ((((double)width) - 2*CURVE_MARGIN - CURVE_TEXT_OFFSET_X)/(log10(m_maxFreq/m_minFreq))*log10(f/m_minFreq)); // + CURVE_MARGIN + CURVE_TEXT_OFFSET_X); } double PlotEQCurve::Pixels2dB(double pixels) { return m_dB_plot_range*((((double)height)-CURVE_TEXT_OFFSET_Y- 2*CURVE_MARGIN -2*pixels)/(2*((double)height) - 4*CURVE_MARGIN - 2*CURVE_TEXT_OFFSET_Y)); } double PlotEQCurve::Pixels2freq(double pixels) { return m_minFreq*pow(10, ((pixels /*- CURVE_MARGIN- CURVE_TEXT_OFFSET_X */)/((((double)width) - 2*CURVE_MARGIN - CURVE_TEXT_OFFSET_X)/(log10(m_maxFreq/m_minFreq))))); } PlotEQCurve::signal_BandChanged PlotEQCurve::signal_changed() { return m_BandChangedSignal; } PlotEQCurve::signal_BandEnabled PlotEQCurve::signal_enabled() { return m_BandEnabledSignal; } PlotEQCurve::signal_BandSelected PlotEQCurve::signal_selected() { return m_BandSelectedSignal; } PlotEQCurve::signal_BandUnselected PlotEQCurve::signal_unselected() { return m_BandUnselectedSignal; } void PlotEQCurve::CalcBand_DigitalFilter(int bd_ix) { //Init Filter to avoid coef interpolation Filter m_fil; m_fil.gain = pow(10,((m_filters[bd_ix]->Gain)/20)); m_fil.freq = m_filters[bd_ix]-> Freq; m_fil.q = m_filters[bd_ix]->Q; m_fil.enable = 1.0f; m_fil.iType = m_filters[bd_ix]->fType; m_fil.fs = SampleRate; m_fil.InterK = 0.0f; m_fil.useInterpolation = 0.0f; //Calc coefs calcCoefs(&m_fil, m_fil.gain, m_fil.freq, m_fil.q, m_fil.iType, m_fil.enable); //Digital filter magnitude response double w, A, B, C, D, sinW, cosW; //Precalculables double AK = m_fil.b0 + m_fil.b2; double BK = m_fil.b0 - m_fil.b2; double CK = 1 + m_fil.a2; double DK = 1 - m_fil.a2; for(int i=0; iset_font_description(font_desc); pangoLayout->set_alignment(Pango::ALIGN_RIGHT); //Initalize the grid const double f_grid[4] = {20.0, 100.0, 1000.0, 10000.0}; int gridPix[4]; for(int i=0; i < 4; i++) { gridPix[i] = round(((double)m_zoom_surface_ptr->get_width())/(log10(MAX_FREQ/MIN_FREQ))*log10(f_grid[i]/MIN_FREQ)) + CURVE_MARGIN + CURVE_TEXT_OFFSET_X; } //Hz scale 20 Hz cr->move_to( gridPix[0] - 5 - CURVE_MARGIN - CURVE_TEXT_OFFSET_X, 0.5*m_zoom_surface_ptr->get_height() - 4); pangoLayout->set_text("20"); pangoLayout->show_in_cairo_context(cr); cr->stroke(); //Hz scale 100 Hz cr->move_to( gridPix[1] - 5 - CURVE_MARGIN - CURVE_TEXT_OFFSET_X, 0.5*m_zoom_surface_ptr->get_height() - 4); pangoLayout->set_text("100"); pangoLayout->show_in_cairo_context(cr); cr->stroke(); //Hz scale 1 kHz cr->move_to( gridPix[2] - 5 - CURVE_MARGIN - CURVE_TEXT_OFFSET_X, 0.5*m_zoom_surface_ptr->get_height() - 4); pangoLayout->set_text("1k"); pangoLayout->show_in_cairo_context(cr); cr->stroke(); //Hz scale 10 kHz cr->move_to( gridPix[3] - 5 - CURVE_MARGIN - CURVE_TEXT_OFFSET_X, 0.5*m_zoom_surface_ptr->get_height() - 4); pangoLayout->set_text("10k"); pangoLayout->show_in_cairo_context(cr); cr->stroke(); cr->restore(); //Get pixel position in surface acording max freq span range (freq2pixels function is not valid here!) m_zoom_widget.x1 = round(((double)m_zoom_surface_ptr->get_width())/(log10(MAX_FREQ/MIN_FREQ))*log10(m_minFreq/MIN_FREQ)) + 3.5; m_zoom_widget.x2 = round(((double)m_zoom_surface_ptr->get_width())/(log10(MAX_FREQ/MIN_FREQ))*log10(m_maxFreq/MIN_FREQ)) - 3.5; //Draw rectangles at borders in case of span focus if(m_zoom_widget.f1_focus || m_zoom_widget.f2_focus) { cr->save(); cr->rectangle(m_zoom_widget.x1 - 5, 2, 10, m_zoom_surface_ptr->get_height() - 4); cr->set_source_rgb(0,0.9,0.9); cr->fill(); cr->restore(); cr->save(); cr->rectangle(m_zoom_widget.x2 - 5, 2, 10, m_zoom_surface_ptr->get_height() - 4); cr->set_source_rgb(0,0.9,0.9); cr->fill(); cr->restore(); } //Draw the button cr->save(); cr->begin_new_sub_path(); cr->arc( m_zoom_widget.x1, 6.5, 3, M_PI, -0.5*M_PI); cr->arc( m_zoom_widget.x2, 6.5, 3, -0.5*M_PI, 0); cr->arc( m_zoom_widget.x2, m_zoom_surface_ptr->get_height() - 6.5, 3, 0.0, 0.5*M_PI); cr->arc( m_zoom_widget.x1, m_zoom_surface_ptr->get_height() - 6.5, 3, 0.5*M_PI, M_PI); cr->close_path(); Cairo::RefPtr bkg_gradient_ptr = Cairo::LinearGradient::create(0, 0, 0, m_zoom_surface_ptr->get_height()); if(m_zoom_widget.center_focus) { bkg_gradient_ptr->add_color_stop_rgba (0.0, 0.2, 0.3, 0.3, 0.7); bkg_gradient_ptr->add_color_stop_rgba (0.4, 0.2, 0.4, 0.5, 1 ); bkg_gradient_ptr->add_color_stop_rgba (0.6, 0.2, 0.4, 0.5, 1 ); bkg_gradient_ptr->add_color_stop_rgba (1.0, 0.2, 0.3, 0.3, 0.7 ); } else { bkg_gradient_ptr->add_color_stop_rgba (0.0, 0.2, 0.2, 0.2, 0.7 ); bkg_gradient_ptr->add_color_stop_rgba (0.4, 0.3, 0.3, 0.3, 1 ); bkg_gradient_ptr->add_color_stop_rgba (0.6, 0.3, 0.3, 0.3, 1 ); bkg_gradient_ptr->add_color_stop_rgba (1.0, 0.2, 0.2, 0.2, 0.7 ); } cr->set_source(bkg_gradient_ptr); cr->fill_preserve(); cr->set_line_width(1); cr->set_source_rgba(1,1,1, 0.7); cr->stroke(); cr->restore(); //Draw text on button cr->save(); cr->set_source_rgb(0.6, 0.6, 0.6); pangoLayout->set_alignment(Pango::ALIGN_LEFT); std::stringstream ss1; if(m_minFreq<1000) { ss1<< std::fixed << std::setprecision(1)<< m_minFreq; } else { ss1<< std::fixed << std::setprecision(0)<< floor(m_minFreq/1000) <<"k"; int divider = ((int)m_minFreq % 1000)/100; if(divider > 0) { ss1<move_to( m_zoom_widget.x1 + 5, m_zoom_surface_ptr->get_height()/2 - 4); pangoLayout->set_text( ss1.str() ); pangoLayout->show_in_cairo_context(cr); cr->move_to( m_zoom_widget.x1 + 0.5*(m_zoom_widget.x2 - m_zoom_widget.x1) - 15, m_zoom_surface_ptr->get_height()/2 - 4); pangoLayout->set_text("~Zoom~"); pangoLayout->show_in_cairo_context(cr); cr->move_to( m_zoom_widget.x2 - 25, m_zoom_surface_ptr->get_height()/2 - 4); std::stringstream ss2; if(m_maxFreq<1000) { ss2<< std::fixed << std::setprecision(1)<< m_maxFreq; } else { ss2<< std::fixed << std::setprecision(0)<< floor(m_maxFreq/1000) <<"k"; int divider = ((int)m_maxFreq % 1000)/100; if(divider > 0) { ss2<set_text( ss2.str() ); pangoLayout->show_in_cairo_context(cr); cr->stroke(); cr->restore(); //Update coords including global offsets m_zoom_widget.x1 += CURVE_MARGIN + CURVE_TEXT_OFFSET_X; m_zoom_widget.x2 += CURVE_MARGIN + CURVE_TEXT_OFFSET_X; } } void PlotEQCurve::redraw_curve_widgets(int band) { if(m_curve_surface_ptr[band]) { //Create cairo context using the buffer surface Cairo::RefPtr cr = Cairo::Context::create(m_curve_surface_ptr[band]); //Clear current context cr->save(); cr->set_operator(Cairo::OPERATOR_CLEAR); cr->paint(); cr->restore(); //Draw curve area in band color cr->save(); double Y_fil0, Y_fil1; switch(m_filters[band]->fType) { case PEAK: case LOW_SHELF: case HIGH_SHELF: Y_fil0 = dB2Pixels( m_filters[band]->Gain); Y_fil1 = dB2Pixels((-1.0)* m_filters[band]->Gain); break; case NOTCH: Y_fil0 = (double)m_curve_surface_ptr[band]->get_height(); Y_fil1 = 0; break; default: Y_fil0 = 0.75*(double)m_curve_surface_ptr[band]->get_height(); Y_fil1 = 0.25*(double)m_curve_surface_ptr[band]->get_height(); } Cairo::RefPtr bd_gradient_ptr = Cairo::LinearGradient::create(0, Y_fil0, 0, Y_fil1); if(m_filters[band]->bIsOn and !m_Bypass) //If band is enabled and not bypass { Gdk::Color color(bandColorLUT[band]); bd_gradient_ptr->add_color_stop_rgba(0, color.get_red_p(), color.get_green_p(), color.get_blue_p(), 0.3); bd_gradient_ptr->add_color_stop_rgba(0.5, color.get_red_p(), color.get_green_p(), color.get_blue_p(), 0.01); bd_gradient_ptr->add_color_stop_rgba(1, color.get_red_p(), color.get_green_p(), color.get_blue_p(), 0.3); } else //band is disabled { bd_gradient_ptr->add_color_stop_rgba(0, 1,1,1, 0.2); bd_gradient_ptr->add_color_stop_rgba(0.5, 1,1,1, 0.01); bd_gradient_ptr->add_color_stop_rgba(1, 1,1,1, 0.2); } cr->set_source(bd_gradient_ptr); cr->move_to(0, dB2Pixels(0.0)); for (int j = 0; j < CURVE_NUM_OF_POINTS; j++) { cr->line_to(xPixels[j], dB2Pixels(band_y[band][j])); } cr->line_to(m_curve_surface_ptr[band]->get_width(), dB2Pixels(0.0)); cr->line_to( 0, dB2Pixels(0.0)); cr->fill(); cr->restore(); } } void PlotEQCurve::redraw_main_curve() { if(m_maincurve_surface_ptr) { //Create cairo context using the buffer surface Cairo::RefPtr cr = Cairo::Context::create(m_maincurve_surface_ptr); //Clear current context cr->save(); cr->set_operator(Cairo::OPERATOR_CLEAR); cr->paint(); cr->restore(); for(int i = 0; i < m_TotalBandsCount; i++) //for each band { //Draw the curve color area for each band if(m_curve_surface_ptr[i]) { cr->save(); cr->set_source(m_curve_surface_ptr[i], 0, 0); cr->paint(); cr->restore(); } } if (!m_Bypass) { //Draw the main curve cr->save(); cr->set_line_width(1); for(int j = 0; j < m_NumChannels; j++) { if(m_NumChannels == 1 || j == 1) { cr->set_source_rgb(1, 1, 1); } else { cr->set_source_rgb(0, 1, 1); } cr->move_to(xPixels[0], dB2Pixels(main_y[j][0]) + 0.5); for (int i = 1; i < CURVE_NUM_OF_POINTS; i++) { cr->line_to(xPixels[i], dB2Pixels(main_y[j][i]) + 0.5); } cr->stroke(); } cr->restore(); //Draw curve control ball cr->save(); double ball_x, ball_y; Cairo::RefPtr< Cairo::RadialGradient > ball_gradient_ptr; for(int i = 0; i < m_TotalBandsCount; i++) //for each band { ball_x = (double)freq2Pixels(m_filters[i]->Freq); if( m_filters[i]->fType == PEAK || m_filters[i]->fType == LOW_SHELF || m_filters[i]->fType == HIGH_SHELF ) { ball_y = (double)dB2Pixels(m_filters[i]->Gain); } else { ball_y = (double)dB2Pixels(0.0); m_filters[i]->Gain = 0.0; } Gdk::Color color(bandColorLUT[i]); ball_gradient_ptr = Cairo::RadialGradient::create( ball_x - 2, ball_y - 2, 0, ball_x - 2, ball_y - 2, 8); ball_gradient_ptr->add_color_stop_rgba (0.0, 1.0, 1.0, 1.0, 0.7); ball_gradient_ptr->add_color_stop_rgba (1.0, 0.0, 0.0, 0.0, 0.0); cr->arc(ball_x, ball_y, 5.0, 0.0, 6.28318530717958647693); cr->set_source_rgb(color.get_red_p(), color.get_green_p(), color.get_blue_p()); cr->fill_preserve(); cr->set_source(ball_gradient_ptr); cr->fill_preserve(); cr->set_line_width(1); cr->set_source_rgb(0.1,0.1,0.1); cr->stroke(); } //Draw Focused band if(bMotionIsConnected || bBandFocus) { ball_x = (double)freq2Pixels(m_filters[m_iBandSel]->Freq); if( m_filters[m_iBandSel]->fType == PEAK || m_filters[m_iBandSel]->fType == LOW_SHELF || m_filters[m_iBandSel]->fType == HIGH_SHELF ) { ball_y = (double)dB2Pixels(m_filters[m_iBandSel]->Gain); } else { ball_y = (double)dB2Pixels(0.0); m_filters[m_iBandSel]->Gain = 0.0; } Gdk::Color color("#00FFFF"); cr->set_line_width(1); cr->set_source_rgb(color.get_red_p(), color.get_green_p(), color.get_blue_p()); cr->arc(ball_x, ball_y, 6.0, 0.0, 6.28318530717958647693); cr->stroke(); } cr->restore(); }// end Bypass check } } void PlotEQCurve::redraw_grid_widget() { if(m_grid_surface_ptr) { //Create cairo context using the buffer surface Cairo::RefPtr cr = Cairo::Context::create(m_grid_surface_ptr); //Clear current context cr->save(); cr->set_operator(Cairo::OPERATOR_CLEAR); cr->paint(); cr->restore(); cr->save(); cr->set_source_rgb(0.3, 0.3, 0.3); cr->set_line_width(1); for(int i = 0; i < GRID_VERTICAL_LINES; i++) { cr->move_to(xPixels_Grid[i] + 0.5, 0.0); cr->line_to(xPixels_Grid[i] + 0.5, m_grid_surface_ptr->get_height()); cr->stroke(); } for(int i = -m_dB_plot_range/2; i <= m_dB_plot_range/2; i+=(int)(m_dB_plot_range/10.0)) { cr->move_to(0, dB2Pixels(i) + 0.5); cr->line_to(m_grid_surface_ptr->get_width(), dB2Pixels(i) + 0.5); cr->stroke(); } cr->restore(); } } void PlotEQCurve::redraw_xAxis_widget() { if(m_xAxis_surface_ptr) { //Create cairo context using the buffer surface Cairo::RefPtr cr = Cairo::Context::create(m_xAxis_surface_ptr); //Clear current context cr->save(); cr->set_operator(Cairo::OPERATOR_CLEAR); cr->paint(); cr->restore(); //Draw text with pango to grid cr->save(); cr->set_source_rgb(0.6, 0.6, 0.6); Glib::RefPtr pangoLayout = Pango::Layout::create(cr); Pango::FontDescription font_desc("sans 9px"); pangoLayout->set_font_description(font_desc); pangoLayout->set_alignment(Pango::ALIGN_RIGHT); cr->move_to( xPixels_Grid[0] - 5, 3.5); pangoLayout->set_text("20"); pangoLayout->show_in_cairo_context(cr); cr->stroke(); //Hz scale 50 Hz cr->move_to( xPixels_Grid[3] - 5, 3.5); pangoLayout->set_text("50"); pangoLayout->show_in_cairo_context(cr); cr->stroke(); //Hz scale 100 Hz cr->move_to( xPixels_Grid[8] - 10, 3.5); pangoLayout->set_text("100"); pangoLayout->show_in_cairo_context(cr); cr->stroke(); //Hz scale 200 Hz cr->move_to( xPixels_Grid[9] - 10, 3.5); pangoLayout->set_text("200"); pangoLayout->show_in_cairo_context(cr); cr->stroke(); //Hz scale 500 Hz cr->move_to( xPixels_Grid[12] - 10, 3.5); pangoLayout->set_text("500"); pangoLayout->show_in_cairo_context(cr); cr->stroke(); //Hz scale 1 KHz cr->move_to( xPixels_Grid[17] - 5, 3.5); pangoLayout->set_text("1k"); pangoLayout->show_in_cairo_context(cr); cr->stroke(); //Hz scale 2 KHz cr->move_to( xPixels_Grid[18] - 5, 3.5); pangoLayout->set_text("2k"); pangoLayout->show_in_cairo_context(cr); cr->stroke(); //Hz scale 5 KHz cr->move_to( xPixels_Grid[21] - 5, 3.5); pangoLayout->set_text("5k"); pangoLayout->show_in_cairo_context(cr); cr->stroke(); //Hz scale 10 KHz cr->move_to( xPixels_Grid[26] - 5, 3.5); pangoLayout->set_text("10k"); pangoLayout->show_in_cairo_context(cr); cr->stroke(); //Hz scale 20 KHz cr->move_to( xPixels_Grid[27] - 10, 3.5); pangoLayout->set_text("20k"); pangoLayout->show_in_cairo_context(cr); cr->stroke(); cr->restore(); } } void PlotEQCurve::redraw_yAxis_widget() { if(m_yAxis_surface_ptr) { //Create cairo context using the buffer surface Cairo::RefPtr cr = Cairo::Context::create(m_yAxis_surface_ptr); //Clear current context cr->save(); cr->set_operator(Cairo::OPERATOR_CLEAR); cr->paint(); cr->restore(); //Draw text with pango to grid cr->save(); cr->set_source_rgb(0.6, 0.6, 0.6); Glib::RefPtr pangoLayout = Pango::Layout::create(cr); Pango::FontDescription font_desc("sans 9px"); pangoLayout->set_font_description(font_desc); pangoLayout->set_alignment(Pango::ALIGN_RIGHT); for(int i = -m_dB_plot_range/2; i <= m_dB_plot_range/2; i+=(int)(m_dB_plot_range/10.0)) { std::stringstream ss; ss<< std::setprecision(2) << i; cr->move_to( 0, dB2Pixels(i) - 3.5 + CURVE_MARGIN); pangoLayout->set_text(ss.str()); pangoLayout->show_in_cairo_context(cr); cr->stroke(); } } } void PlotEQCurve::redraw_cursor(double x, double y) { if(m_cursor_surface_ptr) { //Create cairo context using the buffer surface Cairo::RefPtr cr = Cairo::Context::create(m_cursor_surface_ptr); //Clear current context cr->save(); cr->set_operator(Cairo::OPERATOR_CLEAR); cr->paint(); cr->restore(); //Draw text with pango to grid if( x > 0 && x < m_cursor_surface_ptr->get_width() && y > 0 && y < m_cursor_surface_ptr->get_height() ) { if(bBandFocus) { x = freq2Pixels(m_filters[m_iBandSel]->Freq); y = dB2Pixels( m_filters[m_iBandSel]->Gain ); } cr->save(); cr->set_source_rgba(0.9, 0.9, 0.9, 1.0); cr->set_line_width(1); cr->move_to(x + 0.5, 0); cr->line_to(x + 0.5, y - 0.5*BALL_DETECTION_PIXELS); cr->move_to(x + 0.5, y + 0.5*BALL_DETECTION_PIXELS); cr->line_to(x + 0.5, m_cursor_surface_ptr->get_height()); cr->move_to(0, y + 0.5); cr->line_to(x - 0.5*BALL_DETECTION_PIXELS , y + 0.5); cr->move_to(x + 0.5*BALL_DETECTION_PIXELS, y + 0.5); cr->line_to(m_cursor_surface_ptr->get_width(), y + 0.5); cr->stroke(); Glib::RefPtr pangoLayout = Pango::Layout::create(cr); Pango::FontDescription font_desc("sans 9px"); pangoLayout->set_font_description(font_desc); std::stringstream ss; double freq = Pixels2freq(x); double gain = Pixels2dB(y); int precision = 1; if(freq < 100 || (freq >= 1e3 && freq < 1e4)) precision = 2; if(freq >= 1000) { ss<< std::setprecision(precision) << std::fixed << 0.001*freq << " kHz" ; } else { ss<< std::setprecision(precision) << std::fixed << freq << " Hz" ; } if( x > (m_cursor_surface_ptr->get_width() - 45)) { cr->move_to( x - 45, m_cursor_surface_ptr->get_height() - 10); } else { cr->move_to( x + 2, m_cursor_surface_ptr->get_height() - 10); } pangoLayout->set_text(ss.str()); pangoLayout->show_in_cairo_context(cr); cr->stroke(); ss.str(""); ss<< std::setprecision(2) << std::fixed << gain << " dB" ; if(gain > 0) { cr->move_to( 2, y +1 ); } else { cr->move_to( 2, y - 10); } pangoLayout->set_text(ss.str()); pangoLayout->show_in_cairo_context(cr); cr->stroke(); cr->restore(); } } } void PlotEQCurve::redraw_fft_widget() { const double m = (-1.0)/(fft_range); float val; Cairo::RefPtr fft_gradient_ptr = Cairo::LinearGradient::create(0, 0, 1.0, 0); double binMax = 1e6; double binX[(FFT_N/2) + 1]; double binY[(FFT_N/2) + 1]; int binCount = 0; fft_plot[0] = 1e6; //I don't care about DC for (int i = 1; i <= (FFT_N/2); i++) { if(m_bIsSpectrogram) { val = sqrt((float)fft_raw_data[i]); } else { fft_ant_data[i] = fft_raw_data[i] > fft_ant_data[i] ? fft_raw_data[i] : fft_raw_data[i] + 0.5 * fft_ant_data[i]; val = sqrt((float)fft_ant_data[i]); } fft_plot[i] = m*(20.0f*fastLog10((int*)(&val), fft_log_lut) + fft_gain + fft_pink_noise[i]); if(xPixels_fft_bins[i] == xPixels_fft_bins[i-1]) { //Inside bin code binMax = fft_plot[i] < binMax ? fft_plot[i] : binMax; //Yes it is reversed because binMax is really a pixel min } else { binX[binCount] = xPixels_fft_bins[i-1]; binY[binCount] = binMax; fft_gradient_ptr->add_color_stop_rgba (binX[binCount], 0.5, -1.0*binMax + 1.0, 1.0, -1.0*binMax + 1.0); binCount++; binMax = fft_plot[i]; } } //Create cairo context using the buffer surface Cairo::RefPtr cr = Cairo::Context::create(m_fft_surface_ptr); //Store a copy of the image Cairo::RefPtr img_ant = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, m_fft_surface_ptr->get_width(), m_fft_surface_ptr->get_height()); Cairo::RefPtr cr_ant = Cairo::Context::create(img_ant); cr_ant->save(); cr_ant->set_source (m_fft_surface_ptr, 0, 0); cr_ant->paint(); cr_ant->restore(); //Clear current context cr->save(); cr->set_operator(Cairo::OPERATOR_CLEAR); cr->paint(); cr->restore(); if(m_bIsSpectrogram) { //Draw the FFT spectrogram cr->save(); cr->set_source (img_ant, 0, SPECTROGRAM_LINE_THICKNESS); cr->rectangle(0, SPECTROGRAM_LINE_THICKNESS, m_fft_surface_ptr->get_width(), m_fft_surface_ptr->get_height() - SPECTROGRAM_LINE_THICKNESS); cr->fill(); cr->restore(); cr->save(); cr->translate(freq2Pixels(MIN_FREQ), 0); cr->scale(freq2Pixels(MAX_FREQ) - freq2Pixels(MIN_FREQ), m_fft_surface_ptr->get_height()); cr->rectangle(0, 0, 1.0, SPECTROGRAM_LINE_THICKNESS/( m_fft_surface_ptr->get_height())); cr->set_source(fft_gradient_ptr); cr->fill(); cr->restore(); } else { //Draw the FFT plot Curve cr->save(); cr->translate(freq2Pixels(MIN_FREQ), 0); cr->scale(freq2Pixels(MAX_FREQ) - freq2Pixels(MIN_FREQ), m_fft_surface_ptr->get_height()); cr->move_to(0.0, 1.0); //Curve smooth version double Ax, Ay, Bx, By; for(int i = 1; icurve_to(Ax, Ay, Bx, By, binX[i], binY[i]); } cr->line_to(1.0, 1.0); cr->line_to(0.0, 1.0); cr->set_source_rgba(0.21, 0.15, 0.78, 0.7); cr->fill_preserve(); cr->set_source(fft_gradient_ptr); cr->fill(); cr->restore(); } } void PlotEQCurve::setStereoState(int band, PlotEQCurve::MSState state) { if(m_NumChannels == 2) { band_state[band] = state; cueBandRedraws(band); } } eq10q-2.2/gui/widgets/button.cpp0000644000175000001440000001472213023240626016144 0ustar sapistausers/*************************************************************************** * Copyright (C) 2015 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "button.h" #include "colors.h" #define OUTER_BORDER 2 Button::Button ( const Glib::ustring& label ): m_label(label), m_bFocus(false), m_bPress(false) { set_size_request( 12 + 10*m_label.length(), 20); //Connect mouse signals add_events(Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::POINTER_MOTION_MASK | Gdk::LEAVE_NOTIFY_MASK); signal_button_press_event().connect(sigc::mem_fun(*this, &Button::on_button_press_event),true); signal_button_release_event().connect(sigc::mem_fun(*this, &Button::on_button_release_event),true); signal_motion_notify_event().connect(sigc::mem_fun(*this, &Button::on_mouse_motion_event),true); signal_leave_notify_event().connect(sigc::mem_fun(*this, &Button::on_mouse_leave_widget),true); } Button::~Button() { } bool Button::on_button_press_event ( GdkEventButton* event ) { //Check click type if( event->button == 1 && event->type == GDK_BUTTON_PRESS) { m_bPress = event->x > OUTER_BORDER && event->x < (width - OUTER_BORDER) && event->y > OUTER_BORDER && event->y < (height - OUTER_BORDER); m_sigPress.emit(); redraw(); } return true; } bool Button::on_button_release_event ( GdkEventButton* event ) { if( event->x > OUTER_BORDER && event->x < (width - OUTER_BORDER) && event->y > OUTER_BORDER && event->y < (height - OUTER_BORDER)) { m_sigClick.emit(); } m_sigRelease.emit(); m_bPress = false; m_bFocus = false; redraw(); return true; } bool Button::on_mouse_motion_event ( GdkEventMotion* event ) { m_bFocus = event->x > OUTER_BORDER && event->x < (width - OUTER_BORDER) && event->y > OUTER_BORDER && event->y < (height - OUTER_BORDER); redraw(); return true; } bool Button::on_mouse_leave_widget ( GdkEventCrossing* event ) { m_bFocus = false; redraw(); m_sigRelease.emit(); return true; } void Button::set_label ( const Glib::ustring& label ) { m_label = label; redraw(); } Button::signal_Click Button::signal_clicked() { return m_sigClick; } Button::signal_Click Button::signal_press() { return m_sigPress; } Button::signal_Click Button::signal_release() { return m_sigRelease; } void Button::redraw() { Glib::RefPtr win = get_window(); if(win) { Gdk::Rectangle r(0, 0, get_allocation().get_width(), get_allocation().get_height()); win->invalidate_rect(r, false); } } bool Button::on_expose_event ( GdkEventExpose* event ) { Glib::RefPtr window = get_window(); if(window) { Gtk::Allocation allocation = get_allocation(); width = allocation.get_width(); height = allocation.get_height(); Cairo::RefPtr cr = window->create_cairo_context(); //Paint backgroud cr->save(); cr->set_source_rgb(BACKGROUND_R, BACKGROUND_G, BACKGROUND_B); cr->paint(); //Fill all with background color cr->restore(); //Draw button rectangle cr->save(); double radius = height / 5.0; double degrees = M_PI / 180.0; cr->begin_new_sub_path(); cr->arc (width - OUTER_BORDER - radius, OUTER_BORDER + radius, radius, -90 * degrees, 0 * degrees); cr->arc (width - OUTER_BORDER - radius, height - OUTER_BORDER - radius, radius, 0 * degrees, 90 * degrees); cr->arc (OUTER_BORDER + radius, height- OUTER_BORDER - radius, radius, 90 * degrees, 180 * degrees); cr->arc ( OUTER_BORDER + radius, OUTER_BORDER + radius, radius, 180 * degrees, 270 * degrees); cr->close_path(); if(m_bFocus) { cr->set_source_rgb(0.2, 0.6, 0.5); } else if(m_bPress) { cr->set_source_rgb(0.5, 0.7, 0.8); } else { cr->set_source_rgb(0.5, 0.5, 0.5); } cr->set_line_width(1); cr->stroke_preserve(); Cairo::RefPtr bkg_gradient_ptr = Cairo::LinearGradient::create(width/2, OUTER_BORDER, width/2, height - OUTER_BORDER); bkg_gradient_ptr->add_color_stop_rgba (0.0, 0.1, 0.2, 0.2, 0.3 ); if(m_bPress) { bkg_gradient_ptr->add_color_stop_rgba (0.7, 0.1, 0.2, 0.3, 0.8 ); } else { bkg_gradient_ptr->add_color_stop_rgba (0.7, 0.4, 0.4, 0.4, 0.8 ); } cr->set_source(bkg_gradient_ptr); cr->fill(); cr->restore(); //Label cr->save(); if(m_bFocus) { cr->set_source_rgb(0.2, 0.6, 0.5); } else if(m_bPress) { cr->set_source_rgb(0.7, 0.7, 0.9); } else { cr->set_source_rgb(TEXT_R, TEXT_G, TEXT_B); } Glib::RefPtr pangoLayout = Pango::Layout::create(cr); Pango::FontDescription font_desc("sans 11px"); pangoLayout->set_font_description(font_desc); pangoLayout->set_width(Pango::SCALE * (width - OUTER_BORDER)); pangoLayout->set_height(Pango::SCALE * (height - OUTER_BORDER)); pangoLayout->set_alignment(Pango::ALIGN_CENTER); cr->move_to(OUTER_BORDER, OUTER_BORDER + 2); pangoLayout->set_text(m_label.c_str()); pangoLayout->show_in_cairo_context(cr); cr->stroke(); cr->restore(); } return true; } eq10q-2.2/gui/widgets/toggle_button.cpp0000644000175000001440000001326013023240626017501 0ustar sapistausers/*************************************************************************** * Copyright (C) 2015 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "toggle_button.h" #include "colors.h" #define OUTER_BORDER 3 ToggleButton::ToggleButton ( const Glib::ustring& label ) :Button ( label ), m_bActive(false) { } ToggleButton::~ToggleButton() { } bool ToggleButton::on_button_release_event ( GdkEventButton* event ) { if( event->x > OUTER_BORDER && event->x < (width - OUTER_BORDER) && event->y > OUTER_BORDER && event->y < (height - OUTER_BORDER)) { m_bActive = !m_bActive; m_sigClick.emit(); } m_bPress = false; redraw(); return true; } bool ToggleButton::get_active() { return m_bActive; } void ToggleButton::set_active ( bool active ) { m_bActive = active; redraw(); } bool ToggleButton::on_expose_event(GdkEventExpose* event) { Glib::RefPtr window = get_window(); if(window) { Gtk::Allocation allocation = get_allocation(); width = allocation.get_width(); height = allocation.get_height(); Cairo::RefPtr cr = window->create_cairo_context(); //Paint backgroud cr->save(); cr->set_source_rgb(BACKGROUND_R, BACKGROUND_G, BACKGROUND_B); cr->paint(); //Fill all with background color cr->restore(); /* //Draw a box cr->save(); cr->begin_new_sub_path(); cr->arc( 3 + 0.5, 3 + 0.5, 3, M_PI, -0.5*M_PI); cr->arc( width - 1 - 3 - 0.5, 3 + 0.5, 3, -0.5*M_PI, 0); cr->arc( width - 1 - 3 - 0.5, height - 1 - 3 - 0.5, 3, 0.0, 0.5*M_PI); cr->arc( 3 + 0.5, height - 1 - 3 - 0.5, 3, 0.5*M_PI, M_PI); cr->close_path(); cr->set_line_width(1); cr->set_source_rgba(1,1,1, 0.3); cr->stroke(); cr->restore(); */ //The button ToggleButton::drawLedBtn(cr, m_bFocus, m_bActive, m_label.c_str(), OUTER_BORDER, 3); } return true; } void ToggleButton::drawLedBtn(Cairo::RefPtr< Cairo::Context > cr, bool focus, bool enabled, std::string text, int margin, int radius, double red, double green, double blue) { //Draw the FFT enable button cr->save(); cr->begin_new_sub_path(); cr->arc( margin + radius + 0.5, margin + radius + 0.5, radius, M_PI, -0.5*M_PI); cr->arc( margin + 3*radius + 0.5, margin + radius + 0.5, radius, -0.5*M_PI, 0); cr->arc( margin + 3*radius + 0.5, margin + 3*radius + 0.5, radius, 0.0, 0.5*M_PI); cr->arc( margin + radius + 0.5, margin + 3*radius + 0.5, radius, 0.5*M_PI, M_PI); cr->close_path(); //Daw focus on LED if(focus) { cr->set_line_width(3.5); cr->set_source_rgba(0.0, 1.0, 1.0, 0.5); cr->stroke_preserve(); cr->set_source_rgb(0.1, 0.1, 0.1); cr->fill_preserve(); } Cairo::RefPtr< Cairo::RadialGradient > bkg_gradient_ptr = Cairo::RadialGradient::create( margin + 2 * radius - 2, margin + 2 * radius - 2, 0, margin + 2 * radius, margin + 2 * radius, radius*3); double alpha = 0.3; if(enabled) { alpha = 0.8; } bkg_gradient_ptr->add_color_stop_rgba (0.3, red, green, blue, alpha); bkg_gradient_ptr->add_color_stop_rgba (1.0, 0.7, 0.4, 0.0, alpha); cr->set_source(bkg_gradient_ptr); cr->fill_preserve(); cr->set_line_width(1.0); cr->set_source_rgba(0.1, 0.1, 0.1, 1.0); cr->stroke(); cr->restore(); //Draw extra birgthness on FFT LED if(enabled) { cr->save(); cr->arc( margin + 2 * radius + 0.5, margin + 2 * radius + 0.5, 4*radius, 0.0, 2.0*M_PI); bkg_gradient_ptr = Cairo::RadialGradient::create( margin + 2 * radius, margin + 2 * radius, 0, margin + 2 * radius, margin + 2 * radius, radius*4); bkg_gradient_ptr->add_color_stop_rgba (0.0, 1.0, 1.0, 1.0, 0.4); bkg_gradient_ptr->add_color_stop_rgba (1.0, 1.0, 1.0, 1.0, 0.0); cr->set_source(bkg_gradient_ptr); cr->fill(); cr->restore(); } //Draw Text FFT cr->save(); Glib::RefPtr pangoLayout = Pango::Layout::create(cr); Pango::FontDescription font_desc("sans 11px"); pangoLayout->set_font_description(font_desc); pangoLayout->set_text(text.c_str()); //a shadow cr->move_to(5+margin + 4*radius + 1, margin + 2*radius - 5); cr->set_source_rgba(0.1, 0.1, 0.1, 0.9); pangoLayout->show_in_cairo_context(cr); cr->stroke(); //and text cr->move_to(5+margin + 4*radius, margin + 2*radius - 6); cr->set_source_rgba(0.9, 0.9, 0.9, 0.7); pangoLayout->show_in_cairo_context(cr); cr->stroke(); cr->restore(); } eq10q-2.2/gui/widgets/eqparams.h0000644000175000001440000000474113023240626016107 0ustar sapistausers/*************************************************************************** * Copyright (C) 2011 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef EQ_PARAMS_H #define EQ_PARAMS_H class EqParams { public: EqParams(int iNumBands); virtual ~EqParams(); typedef struct { float fGain; float fFreq; float fQ; int iType; bool bIsEnabled; } EqBandStruct; void setInputGain(float fInGain); void setOutputGain(float fOutGain); void setBandGain(int iBand, float fGain); void setBandFreq(int iBand, float fFreq); void setBandQ(int iBand, float fQ); void setBandType(int iBand, int iType); void setBandEnabled(int iBand, bool bIsEnabled); float getInputGain(); float getOutputGain(); float getBandGain(int iBand); float getBandFreq(int iBand); float getBandQ(int iBand); int getBandType(int iBand); bool getBandEnabled(int iBand); void loadFromTtlFile(const char *uri); bool loadFromFile(const char *path); void saveToFile(const char *path); private: int m_iNumberOfBands; EqBandStruct *m_ptr_BandArray; float m_fInGain; float m_fOutGain; }; #endifeq10q-2.2/gui/widgets/pixmapcombo.cpp0000644000175000001440000001155613023240626017151 0ustar sapistausers/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "pixmapcombo.h" #include #include "setwidgetcolors.h" PixMapCombo::PixMapCombo(const char *bundlePath) :m_bundlePath(bundlePath) { //Create the tree model m_refTreeModel = Gtk::ListStore::create(m_Columns); set_model(m_refTreeModel); Glib::RefPtr m_refTopixbuf; Gtk::TreeModel::Row row; //Enganxar una imatge al pixbuf m_refTopixbuf= Gdk::Pixbuf::create_from_file(m_bundlePath +"/" + std::string(RUTA_LPF1)); //Fill the ComboBox Tree Model row = *(m_refTreeModel->append()); row[m_Columns.m_col_pix] = m_refTopixbuf; //Enganxar una imatge al pixbuf m_refTopixbuf= Gdk::Pixbuf::create_from_file(m_bundlePath +"/" + std::string(RUTA_LPF2)); //Fill the ComboBox Tree Model row = *(m_refTreeModel->append()); row[m_Columns.m_col_pix] = m_refTopixbuf; //Enganxar una imatge al pixbuf m_refTopixbuf= Gdk::Pixbuf::create_from_file(m_bundlePath +"/" + std::string(RUTA_LPF3)); //Fill the ComboBox Tree Model row = *(m_refTreeModel->append()); row[m_Columns.m_col_pix] = m_refTopixbuf; //Enganxar una imatge al pixbuf m_refTopixbuf= Gdk::Pixbuf::create_from_file(m_bundlePath +"/" + std::string(RUTA_LPF4)); //Fill the ComboBox Tree Model row = *(m_refTreeModel->append()); row[m_Columns.m_col_pix] = m_refTopixbuf; //Enganxar una imatge al pixbuf m_refTopixbuf= Gdk::Pixbuf::create_from_file(m_bundlePath +"/" + std::string(RUTA_HPF1)); //Fill the ComboBox Tree Model row = *(m_refTreeModel->append()); row[m_Columns.m_col_pix] = m_refTopixbuf; //Enganxar una imatge al pixbuf m_refTopixbuf= Gdk::Pixbuf::create_from_file(m_bundlePath +"/" + std::string(RUTA_HPF2)); //Fill the ComboBox Tree Model row = *(m_refTreeModel->append()); row[m_Columns.m_col_pix] = m_refTopixbuf; //Enganxar una imatge al pixbuf m_refTopixbuf= Gdk::Pixbuf::create_from_file(m_bundlePath +"/" + std::string(RUTA_HPF3)); //Fill the ComboBox Tree Model row = *(m_refTreeModel->append()); row[m_Columns.m_col_pix] = m_refTopixbuf; //Enganxar una imatge al pixbuf m_refTopixbuf= Gdk::Pixbuf::create_from_file(m_bundlePath +"/" + std::string(RUTA_HPF4)); //Fill the ComboBox Tree Model row = *(m_refTreeModel->append()); row[m_Columns.m_col_pix] = m_refTopixbuf; //Enganxar una imatge al pixbuf m_refTopixbuf= Gdk::Pixbuf::create_from_file(m_bundlePath +"/" + std::string(RUTA_LOSHELF)); //Fill the ComboBox Tree Model row = *(m_refTreeModel->append()); row[m_Columns.m_col_pix] = m_refTopixbuf; //Enganxar una imatge al pixbuf m_refTopixbuf= Gdk::Pixbuf::create_from_file(m_bundlePath +"/" + std::string(RUTA_HISHELF)); //Fill the ComboBox Tree Model row = *(m_refTreeModel->append()); row[m_Columns.m_col_pix] = m_refTopixbuf; //Enganxar una imatge al pixbuf m_refTopixbuf= Gdk::Pixbuf::create_from_file(m_bundlePath +"/" + std::string(RUTA_PEAK)); //Fill the ComboBox Tree Model row = *(m_refTreeModel->append()); row[m_Columns.m_col_pix] = m_refTopixbuf; //Enganxar una imatge al pixbuf m_refTopixbuf= Gdk::Pixbuf::create_from_file(m_bundlePath +"/" + std::string(RUTA_NOTCH)); //Fill the ComboBox Tree Model row = *(m_refTreeModel->append()); row[m_Columns.m_col_pix] = m_refTopixbuf; //add to combo pack_start(m_Columns.m_col_pix); //Setup style SetWidgetColors widgetStyle; set_style(widgetStyle.getPlainButtonStyle()); show_all_children(); } PixMapCombo::~PixMapCombo(){ }eq10q-2.2/gui/widgets/templatewidget.cpp0000755000175000001440000002264013023240626017651 0ustar sapistausers/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "templatewidget.h" TemplateWidget::TemplateWidget(main_window *m_ptr, void (*f_set_ptr) (main_window *myptr, int b_ix, int type, float g, float f, float Q), void (*f_get_ptr) (main_window *myptr, int band_id, BandParams &m_params)) :b_load("Load Preset"), b_save("Save Preset"), b_remove("Delete Preset"), l_presets("Presets"){ //External functions external_get_ptr = f_get_ptr; external_set_ptr = f_set_ptr; //Inicialment el botto load no fa res current_preset=-1; //Inicialitza punter a objecte principal main_win_ptr = m_ptr; //Dibuix de la GUI set(Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, 0.0, 0.0); m_box.pack_start(l_presets); m_box.pack_start(preset_combo); m_box.pack_start(b_load); m_box.pack_start(b_save); m_box.pack_start(b_remove); m_box.set_homogeneous(false); m_box.set_size_request(560,-1); m_box.set_spacing(2); add(m_box); set_padding(2, 2, 2, 2); show_all_children(); //Aseguremnos de k el directori arrel per desar presets exiseix redi::ipstream in("echo $HOME"); std::string cmd; in >> strhomedir; //std::cout << strhomedir << std::endl; in.close(); cmd = "mkdir " + strhomedir + "/.RafolsEQ"; system(cmd.c_str()); //load_combo_list() //<--Ho farem en el on_expose de la finestra principal //Signals b_load.signal_clicked().connect(sigc::mem_fun(*this, &TemplateWidget::on_load_clicked)); b_save.signal_clicked().connect(sigc::mem_fun(*this, &TemplateWidget::on_save_clicked)); b_remove.signal_clicked().connect(sigc::mem_fun(*this, &TemplateWidget::on_delete_clicked)); preset_combo.signal_changed().connect(sigc::mem_fun(*this, &TemplateWidget::on_combo_move)); } /*Si el load clika, comprobar k no es pq s'esta introduint text i k realment volem canviar de preset en cas afirmatiu carregar el nou preset */ void TemplateWidget::on_load_clicked(){ //std::cout<<"Button load cicked"<(&f_filter),sizeof(f_filter)); //cout<<"Row name readed = "<get_text(); Glib::ustring presetname = entry->get_text(); std::string cmd = strhomedir + FILE_NAME; if(!presetname.empty()){ std::fstream ofs(cmd.c_str(), std::ios::out | std::ios::app | std::ios::binary); if(!ofs) std::cerr<<"Error: file can't be open"; else{ ofs.clear(); //gestio del nom del preset preset_combo.append_text(presetname); f_filter.name_length = (NAME_LONG-1 > presetname.length()? presetname.length(): NAME_LONG-1); presetname.copy(f_filter.name,f_filter.name_length,0); f_filter.name[f_filter.name_length]='\0'; //ultim caracter //Escriure tots els parametres del filtre for(int i=0; i<10; i++){ //10 es el nombre de bandes external_get_ptr(main_win_ptr, i, band_param); f_filter.fparams[i].type = band_param.type; f_filter.fparams[i].gain = band_param.gain; f_filter.fparams[i].freq = band_param.freq; f_filter.fparams[i].Q = band_param.Q; } //Ho escribim al fitxer ofs.write(reinterpret_cast(&f_filter),sizeof(f_filter)); }//fi else ofs.close(); } } } /*Si clickem el butto de delete: - mostrem un misatge de text de si estem segurs de voler vorrar el preset - Eliminem l'entrada del combo - Eliminem la linea del fitxer de text eq_presets.prs */ void TemplateWidget::on_delete_clicked(){ //std::cout<<"DELETE clicked!"<get_toplevel()),"This will delete the selected preset, are you sure?", false /* use_markup */, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL); int result = dialog.run(); if(row != -1 && result == Gtk::RESPONSE_OK){ cmd = strhomedir + FILE_NAME_AUX; std::fstream ofs(cmd.c_str(), std::ios::out | std::ios::binary); cmd = strhomedir + FILE_NAME; std::fstream ifs(cmd.c_str(), std::ios::in | std::ios::binary); if(!ifs) std::cerr<<"Error: file can't be open"; else{ ifs.clear(); ofs.clear(); desp = (row)*(int)sizeof(f_filter); ifs.seekg(desp, std::ios::beg); ifs.read(reinterpret_cast(&f_filter),sizeof(f_filter)); //pasem-ho a una cadena /*for(int i=0; i(&f_filter),sizeof(f_filter)); ofs.write(reinterpret_cast(&f_filter),sizeof(f_filter)); ix++; } ix = 0; do{ desp = (row+1+ix)*(int)sizeof(f_filter); ifs.seekg(desp, std::ios::beg); ifs.read(reinterpret_cast(&f_filter),sizeof(f_filter)); if(ifs.eof()) break; ofs.write(reinterpret_cast(&f_filter),sizeof(f_filter)); ix++; } while(true); std::string cmd = "mv "; cmd = cmd + strhomedir + FILE_NAME_AUX + " " + strhomedir + FILE_NAME; system(cmd.c_str()); Gtk::Entry* entry = preset_combo.get_entry(); entry->set_text(""); }//else ifs.close(); ofs.close(); } } /*Si el combo es mou, carrega el current_preset la fila k correspon del combo */ void TemplateWidget::on_combo_move(){ current_preset = preset_combo.get_active_row_number(); } void TemplateWidget::load_combo_list(){ //std::cout<<"Omplint el combo ..."<(&f_filter),sizeof(f_filter)); if(ofs.eof()) break; /* //pasem-ho a una cadena for(int i=0; i #include #include #include #include #include #include #define KNOB_TYPE_LIN 0 #define KNOB_TYPE_FREQ 1 #define KNOB_TYPE_TIME 2 class KnobWidget2 : public Gtk::DrawingArea { public: KnobWidget2(float fMin, float fMax, std::string sLabel, std::string sUnits, const char *knobIconPath, int iType = KNOB_TYPE_LIN, bool snap2ZerodB = false); ~KnobWidget2(); void set_value(float fValue); double get_value(); //signal accessor: typedef sigc::signal signal_KnobChanged; signal_KnobChanged signal_changed(); protected: //Override default signal handler: virtual bool on_expose_event(GdkEventExpose* event); virtual bool on_mouse_leave_widget(GdkEventCrossing* event); void redraw(); //Mouse grab signal handlers virtual bool on_button_press_event(GdkEventButton* event); virtual bool on_button_release_event(GdkEventButton* event); virtual bool on_scrollwheel_event(GdkEventScroll* event); virtual bool on_mouse_motion_event(GdkEventMotion* event); float m_fMin; //Min representable value float m_fMax; //Max representable value bool bMotionIsConnected; float m_Value; std::string m_Label; std::string m_Units; int m_TypeKnob; int width; int height; int mouse_move_ant; bool m_snap2Zero; bool m_focus; double m_slowMultiplier; //Fader change signal signal_KnobChanged m_KnobChangedSignal; private: std::string m_knobIconPath; Cairo::RefPtr m_image_surface_ptr; Glib::RefPtr m_image_ptr; Cairo::RefPtr< Cairo::Context> m_image_context_ptr; }; #endifeq10q-2.2/gui/widgets/abbutton.h0000644000175000001440000000334013023240626016106 0ustar sapistausers/*************************************************************************** * Copyright (C) 2015 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef EQ10Q_AB_BUTTON_H #define EQ10Q_AB_BUTTON_H #include "toggle_button.h" class AbButton : public ToggleButton { public: AbButton(); virtual ~AbButton(); protected: //Override default signal handler: virtual bool on_expose_event(GdkEventExpose* event); }; #endifeq10q-2.2/gui/widgets/faderwidget.cpp0000644000175000001440000002703313023240626017115 0ustar sapistausers/*************************************************************************** * Copyright (C) 2012 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include #include //For the function Gdk::Cairo::set_source_pixbuf() //#include //Switched back to gdkmm.h for cairo portability problems #include "colors.h" #include "faderwidget.h" FaderWidget::FaderWidget(double dMax, double dMin, const char *bundlePath, Glib::ustring title) :bMotionIsConnected(false), m_value(0), m_max(dMax), m_min(dMin), m_bundlePath(bundlePath), m_title(title) { m_image_ptr = Gdk::Pixbuf::create_from_file(m_bundlePath + "/" + std::string(FADER_ICON_FILE)); // Detect transparent colors for loaded image Cairo::Format format = Cairo::FORMAT_RGB24; if (m_image_ptr->get_has_alpha()) { format = Cairo::FORMAT_ARGB32; } // Create a new ImageSurface m_image_surface_ptr = Cairo::ImageSurface::create (format, m_image_ptr->get_width(), m_image_ptr->get_height()); // Create the new Context for the ImageSurface m_image_context_ptr = Cairo::Context::create (m_image_surface_ptr); // Draw the image on the new Context Gdk::Cairo::set_source_pixbuf (m_image_context_ptr, m_image_ptr, 0.0, 0.0); m_image_context_ptr->paint(); set_size_request(2*m_image_surface_ptr->get_width()+4*FADER_MARGIN, FADER_INITAL_HIGHT); //Connect mouse signals add_events(Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::POINTER_MOTION_MASK | Gdk::SCROLL_MASK); signal_button_press_event().connect(sigc::mem_fun(*this, &FaderWidget::on_button_press_event),true); signal_button_release_event().connect(sigc::mem_fun(*this, &FaderWidget::on_button_release_event),true); signal_scroll_event().connect(sigc::mem_fun(*this, &FaderWidget::on_scrollwheel_event),true); } FaderWidget::~FaderWidget() { } void FaderWidget::set_value(double value) { m_value = value; m_value = m_value < m_min ? m_min : m_value; m_value = m_value > m_max ? m_max : m_value; redraw(); } double FaderWidget::get_value() { return m_value; } void FaderWidget::set_range(double max, double min) { m_max = max; m_min = min; redraw(); } double FaderWidget::get_max() { return m_max; } double FaderWidget::get_min() { return m_min; } void FaderWidget::redraw() { Glib::RefPtr win = get_window(); if(win) { Gdk::Rectangle r(0, 0, get_allocation().get_width(), get_allocation().get_height()); win->invalidate_rect(r, false); } } //Override default signal handler: bool FaderWidget::on_expose_event(GdkEventExpose* event) { double m, n; Glib::RefPtr window = get_window(); if(window) { Gtk::Allocation allocation = get_allocation(); const int width = allocation.get_width(); const int height = allocation.get_height(); m = ((double)(FADER_MARGIN + TITLE_OFFSET - (height - FADER_MARGIN - m_image_surface_ptr->get_height())))/(m_max - m_min); n = (double)(height - FADER_MARGIN - m_image_surface_ptr->get_height()) - m_min*m; yFaderPosition = (int)(m*m_value + n); Cairo::RefPtr cr = window->create_cairo_context(); //Draw fader backgroud rectangle and paint it cr->save(); cr->set_source_rgb(BACKGROUND_R, BACKGROUND_G, BACKGROUND_B); cr->paint(); //Fill all with background color cr->restore(); //Draw fader backgroud line cr->save(); cr->set_line_cap(Cairo::LINE_CAP_ROUND); cr->move_to(round(width/2) + 0.5, FADER_MARGIN + m_image_surface_ptr->get_height()/2 + TITLE_OFFSET); cr->line_to(round(width/2) + 0.5, height - FADER_MARGIN - m_image_surface_ptr->get_height()/2 + TITLE_OFFSET); cr->set_source_rgba(0.7, 0.7, 0.7, 0.7); cr->set_line_width(4); cr->stroke_preserve(); cr->set_source_rgba(0.15, 0.15, 0.15, 1.0); cr->set_line_width(3); cr->stroke(); cr->restore(); //Draw fader dB scale double yBarPosition; //Draw thin lines for each dB cr->save(); cr->set_source_rgba(0.8, 0.8, 0.8, 0.4); cr->set_line_width(1); for (double i = m_max; i >= m_min; i-= 0.5) //The var step size is one dBu { yBarPosition = round((double)((int)(m*i + n + (double)(m_image_surface_ptr->get_height()/2)))) + 0.5; //Sum 0.5 to center cairo to the pixel cr->move_to(width/2 - m_image_surface_ptr->get_width()/3 - FADER_MARGIN + 2, yBarPosition); cr->line_to(width/2 - FADER_MARGIN, yBarPosition); cr->move_to(width/2 + FADER_MARGIN, yBarPosition); cr->line_to(width/2 + m_image_surface_ptr->get_width()/3 + FADER_MARGIN - 2, yBarPosition); } cr->stroke(); cr->restore(); //Draw text with pango cr->save(); cr->set_source_rgba(0.9, 0.9, 0.9, 0.5); Glib::RefPtr pangoLayout = Pango::Layout::create(cr); Pango::FontDescription font_desc("sans 9px"); pangoLayout->set_font_description(font_desc); pangoLayout->set_alignment(Pango::ALIGN_RIGHT); for (double i = m_max; i >= m_min; i -= m_max/2) //The var step size is the half of max value because I like this way ;-) { std::stringstream ss; yBarPosition = (int)(m*i + n) + m_image_surface_ptr->get_height()/2; ss<< std::setprecision(3) << abs(i); //cr->move_to(width/2 - m_image_surface_ptr->get_width()/2 - 3*FADER_MARGIN, yBarPosition - 4); cr->move_to(FADER_MARGIN/4, yBarPosition - 4); pangoLayout->set_text(ss.str()); pangoLayout->show_in_cairo_context(cr); cr->stroke(); } cr->restore(); //Draw title (using same pango) cr->save(); Glib::RefPtr pangoLayoutTil = Pango::Layout::create(cr); Pango::FontDescription font_desc_til("sans 11px"); pangoLayoutTil->set_font_description(font_desc_til); pangoLayoutTil->set_alignment(Pango::ALIGN_LEFT); pangoLayoutTil->set_text(m_title.c_str()); //a shadow cr->move_to(FADER_MARGIN + 1, FADER_MARGIN + 1); cr->set_source_rgba(0.1, 0.1, 0.1, 0.9); pangoLayoutTil->show_in_cairo_context(cr); cr->stroke(); //and text cr->move_to(FADER_MARGIN, FADER_MARGIN); cr->set_source_rgba(0.9, 0.9, 0.9, 0.7); pangoLayoutTil->show_in_cairo_context(cr); cr->stroke(); cr->restore(); //Draw strong lines with labels cr->save(); cr->set_source_rgba(0.4, 0.4, 0.4, 1.0); cr->set_line_width(1); for (double i = m_max; i >= m_min; i -= m_max/2) //The var step size is the hlaf of max because I like this way { yBarPosition = round((double)((int)(m*i + n + (double)(m_image_surface_ptr->get_height()/2)))) + 0.5; //Sum 0.5 to center cairo to the pixel cr->move_to(width/2 - m_image_surface_ptr->get_width() + FADER_MARGIN - 2, yBarPosition); cr->line_to(width/2 - FADER_MARGIN + 1, yBarPosition); cr->move_to(width/2 + FADER_MARGIN - 1, yBarPosition); cr->line_to(width/2 + m_image_surface_ptr->get_width() - FADER_MARGIN + 2, yBarPosition); } cr->stroke(); cr->restore(); //Draw the fader drop down shadow cr->save(); cr->translate(width/2 + 4, yFaderPosition + m_image_surface_ptr->get_height()/2 + 6); cr->scale(m_image_surface_ptr->get_width()/1.2, m_image_surface_ptr->get_height()/1.2); Cairo::RefPtr bkg_gradient_ptr = Cairo::RadialGradient::create(0, 0, 0, 0, 0, 1); bkg_gradient_ptr->add_color_stop_rgba (0.3, 0.2, 0.2, 0.2, 1.0); bkg_gradient_ptr->add_color_stop_rgba (1.0, 0.1, 0.1, 0.2, 0.0); cr->set_source(bkg_gradient_ptr); cr->arc(0.0, 0.0, 1.0, 0.0, 2.0*M_PI); cr->fill(); cr->restore(); //Draw the fader icon cr->save(); cr->set_source (m_image_surface_ptr, width/2 - m_image_surface_ptr->get_width()/2, yFaderPosition); cr->rectangle (width/2 - m_image_surface_ptr->get_width()/2, yFaderPosition, m_image_surface_ptr->get_width()+1, m_image_surface_ptr->get_height()+1); cr->clip(); cr->paint(); cr->restore(); } return true; } //Mouse grab signal handlers bool FaderWidget::on_button_press_event(GdkEventButton* event) { //Act in case mouse pointer is inside faderwidget Gtk::Allocation allocation = get_allocation(); const int width = allocation.get_width(); int x,y; get_pointer(x,y); if( x > width/2 - m_image_surface_ptr->get_width()/2 && x < width/2 + m_image_surface_ptr->get_width()/2 && y > yFaderPosition && y < yFaderPosition + m_image_surface_ptr->get_height()) { if (!bMotionIsConnected) { m_motion_connection = signal_motion_notify_event().connect(sigc::mem_fun(*this, &FaderWidget::on_mouse_motion_event),true); bMotionIsConnected = true; } } return true; } bool FaderWidget::on_button_release_event(GdkEventButton* event) { m_motion_connection.disconnect(); bMotionIsConnected = false; return true; } bool FaderWidget::on_scrollwheel_event(GdkEventScroll* event) { double increment; increment = SCROLL_EVENT_PERCENT*(m_max - m_min); if (event->direction == GDK_SCROLL_UP) { // up code set_value (m_value + increment); } else if (event->direction == GDK_SCROLL_DOWN) { // down code set_value(m_value - increment); } m_FaderChangedSignal.emit(); return true; } bool FaderWidget::on_mouse_motion_event(GdkEventMotion* event) { int yPixels; double m, n, fader_pos; Gtk::Allocation allocation = get_allocation(); const int height = allocation.get_height(); yPixels = event->y - m_image_surface_ptr->get_height()/2; //Offset fader icon to grab the center of the fader //Stoppers yPixels = yPixels < FADER_MARGIN ? FADER_MARGIN : yPixels; yPixels = yPixels > height - FADER_MARGIN - m_image_surface_ptr->get_height() ? height - FADER_MARGIN - m_image_surface_ptr->get_height() : yPixels; m = ((double)(FADER_MARGIN + TITLE_OFFSET - (height - FADER_MARGIN - m_image_surface_ptr->get_height())))/(m_max - m_min); n = (double)(height - FADER_MARGIN - m_image_surface_ptr->get_height()) - m_min*m; fader_pos = ((double)yPixels - n)/m; //snap to 0 dB a little bit if(fader_pos < 0.5 && fader_pos > -0.5) { fader_pos = 0.0; } set_value(fader_pos); m_FaderChangedSignal.emit(); return true; } FaderWidget::signal_FaderChanged FaderWidget::signal_changed() { return m_FaderChangedSignal; }eq10q-2.2/gui/widgets/setwidgetcolors.h0000644000175000001440000000411613023240626017513 0ustar sapistausers/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef SET_WIDGET_COLORS_H #define SET_WIDGET_COLORS_H #include #include #include class SetWidgetColors { public: SetWidgetColors(); void setButtonColors(Gtk::Button* widget); void setGenericWidgetColors(Gtk::Widget* widget); void setBandFrameColor(Gtk::Frame* widget, int band); Glib::RefPtr getPlainButtonStyle(); private: Gdk::Color m_Button_BgColorActive, m_Button_BgColorInactive, m_Button_BgColorNormal, m_Button_BgColorOver, m_Button_FgColor, m_Button_TextColor; Gdk::Color m_BandsColors[10]; Glib::RefPtr PlainButtonStyle; }; #endifeq10q-2.2/gui/widgets/PathConfig.h0000644000175000001440000000320113023240626016306 0ustar sapistausers/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ //Defines the install path for eq10q gui acording cmake definitions #ifndef EQ10Q_PATH_CONFIG_H #define EQ10Q_PATH_CONFIG_H #define EQ10Q_GUI_PATH "/home/sapista/.lv2/sapistaEQ.lv2/gui/" #endif eq10q-2.2/gui/widgets/dynplot.cpp0000644000175000001440000002376513023240626016331 0ustar sapistausers/*************************************************************************** * Copyright (C) 2015 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "dynplot.h" #include "colors.h" #include #include #include #include #define CURVE_BORDER 1.5 #define CURVE_MARGIN 15 #define CURVE_TEXT_OFFSET 18 #define PLOT_WIDTH_HEIGHT 250 #define DATA_RANGE_MIN -60.0 #define DATA_RANGE_MAX 10.0 #define GRID_STEP 10.0 PlotDynCurve::PlotDynCurve(bool isCompressor): m_Ratio(1.0), m_Range(-100.0), m_Knee(0.0), m_Threshold(0.0), m_Makeup(0.0), m_GainReduction(0.0), m_InputVu(-100.0), m_bIsCompressor(isCompressor) { set_size_request(PLOT_WIDTH_HEIGHT, PLOT_WIDTH_HEIGHT); } PlotDynCurve::~PlotDynCurve() { } void PlotDynCurve::set_gainreduction(double gainreduction) { m_GainReduction = gainreduction != 0.0 ? 20.0*log10(gainreduction) : -100.0; redraw(); } void PlotDynCurve::set_inputvu(double inputvu) { m_InputVu = inputvu != 0.0 ? 20.0*log10(inputvu) : -100.0; redraw(); } void PlotDynCurve::set_knee(double knee) { m_Knee = knee; redraw(); } void PlotDynCurve::set_makeup(double makeup) { m_Makeup = makeup; redraw(); } void PlotDynCurve::set_range(double range) { m_Range = range; redraw(); } void PlotDynCurve::set_ratio(double ratio) { m_Ratio = ratio; redraw(); } void PlotDynCurve::set_threshold(double threshold) { m_Threshold = threshold; redraw(); } void PlotDynCurve::redraw() { Glib::RefPtr win = get_window(); if(win) { Gdk::Rectangle r(0, 0, get_allocation().get_width(), get_allocation().get_height()); win->invalidate_rect(r, false); } } double PlotDynCurve::dB2PixelsX(double db) { const double m = ((double)width - 2*CURVE_MARGIN - CURVE_TEXT_OFFSET)/((double)(DATA_RANGE_MAX - DATA_RANGE_MIN)); const double n = CURVE_MARGIN + CURVE_TEXT_OFFSET - m*DATA_RANGE_MIN; return m*db + n; } double PlotDynCurve::dB2PixelsY(double db) { const double m = (2*CURVE_MARGIN + CURVE_TEXT_OFFSET - (double)height)/((double)(DATA_RANGE_MAX - DATA_RANGE_MIN)); const double n = ((double)height) - CURVE_MARGIN - CURVE_TEXT_OFFSET - m*DATA_RANGE_MIN; return m*db + n; } bool PlotDynCurve::on_expose_event(GdkEventExpose* event) { Glib::RefPtr window = get_window(); if(window) { Gtk::Allocation allocation = get_allocation(); width = allocation.get_width(); height = allocation.get_height(); Cairo::RefPtr cr = window->create_cairo_context(); //Paint backgroud cr->save(); cr->set_source_rgb(BACKGROUND_R, BACKGROUND_G, BACKGROUND_B); cr->paint(); //Fill all with background color cr->restore(); //Draw an interesting frame cr->save(); double radius = height / 50.0; double degrees = M_PI / 180.0; cr->begin_new_sub_path(); cr->arc (width - CURVE_BORDER - radius, CURVE_BORDER + radius, radius, -90 * degrees, 0 * degrees); cr->arc (width - CURVE_BORDER - radius, height - CURVE_BORDER - radius, radius, 0 * degrees, 90 * degrees); cr->arc (CURVE_BORDER + radius, height- CURVE_BORDER - radius, radius, 90 * degrees, 180 * degrees); cr->arc ( CURVE_BORDER + radius, CURVE_BORDER + radius, radius, 180 * degrees, 270 * degrees); cr->close_path(); Cairo::RefPtr bkg_gradient_ptr = Cairo::LinearGradient::create(width/2, CURVE_BORDER, width/2, height - CURVE_BORDER); bkg_gradient_ptr->add_color_stop_rgba (0.0, 0.1, 0.1, 0.1, 0.6 ); bkg_gradient_ptr->add_color_stop_rgba (0.5, 0.2, 0.3, 0.3, 0.3 ); bkg_gradient_ptr->add_color_stop_rgba (1.0, 0.1, 0.1, 0.1, 0.6 ); cr->set_source(bkg_gradient_ptr); cr->fill_preserve(); cr->set_line_width(1.0); cr->set_source_rgb(0.3, 0.3, 0.4); cr->stroke(); cr->restore(); //Draw the grid cr->save(); cr->set_source_rgb(0.3, 0.3, 0.3); cr->set_line_width(1); for(double i = DATA_RANGE_MIN; i <= DATA_RANGE_MAX; i+=GRID_STEP) { //Vertical grid cr->move_to( dB2PixelsX(i) + 0.5, CURVE_MARGIN); cr->line_to( dB2PixelsX(i) + 0.5, height - CURVE_MARGIN - CURVE_TEXT_OFFSET); //Horizontal grid cr->move_to( CURVE_MARGIN + CURVE_TEXT_OFFSET, dB2PixelsY(i) + 0.5); cr->line_to( width - CURVE_MARGIN, dB2PixelsY(i) + 0.5); cr->stroke(); } cr->restore(); //Draw text with pango to grid cr->save(); cr->set_source_rgb(0.6, 0.6, 0.6); Glib::RefPtr pangoLayout = Pango::Layout::create(cr); Pango::FontDescription font_desc("sans 9px"); pangoLayout->set_font_description(font_desc); pangoLayout->set_alignment(Pango::ALIGN_RIGHT); for(double i = DATA_RANGE_MIN; i <= DATA_RANGE_MAX; i+=GRID_STEP) { std::stringstream ss; ss<< std::setprecision(2) << i; pangoLayout->set_text(ss.str()); cr->move_to(dB2PixelsX(i) - 3.5, height - CURVE_MARGIN - CURVE_TEXT_OFFSET + 3.5); pangoLayout->show_in_cairo_context(cr); cr->move_to(CURVE_MARGIN, dB2PixelsY(i) - 3.5); pangoLayout->show_in_cairo_context(cr); cr->stroke(); } cr->restore(); //Plot InputVU and GainReduction double prange = 0.05*(m_InputVu - DATA_RANGE_MIN); cr->save(); cr->rectangle(CURVE_MARGIN + CURVE_TEXT_OFFSET + 0.5, CURVE_MARGIN + 0.5, width - 2*CURVE_MARGIN - CURVE_TEXT_OFFSET, height - 2*CURVE_MARGIN - CURVE_TEXT_OFFSET); cr->clip(); cr->begin_new_sub_path(); cr->move_to(dB2PixelsX(DATA_RANGE_MIN), dB2PixelsY(DATA_RANGE_MIN)); cr->line_to(dB2PixelsX(DATA_RANGE_MIN), dB2PixelsY(DATA_RANGE_MIN + m_Makeup)); cr->line_to( dB2PixelsX(m_InputVu + prange), dB2PixelsY(m_InputVu + prange - m_GainReduction + m_Makeup) ); cr->line_to( dB2PixelsX(m_InputVu + prange), dB2PixelsY(DATA_RANGE_MIN)); cr->close_path(); bkg_gradient_ptr = Cairo::LinearGradient::create(dB2PixelsX(DATA_RANGE_MIN), dB2PixelsY(DATA_RANGE_MIN),dB2PixelsX(m_InputVu + prange), dB2PixelsY(DATA_RANGE_MIN) ); bkg_gradient_ptr->add_color_stop_rgba (0.0, 0.1, 0.2, 0.8, 0.4 ); bkg_gradient_ptr->add_color_stop_rgba (0.9, 0.1, 0.6, 0.4, 0.3 ); bkg_gradient_ptr->add_color_stop_rgba (1.0, 0.1, 0.6, 0.4, 0.0 ); cr->set_source(bkg_gradient_ptr); cr->fill(); cr->restore(); //Draw the curve cr->save(); cr->rectangle(CURVE_MARGIN + CURVE_TEXT_OFFSET + 0.5, CURVE_MARGIN + 0.5, width - 2*CURVE_MARGIN - CURVE_TEXT_OFFSET, height - 2*CURVE_MARGIN - CURVE_TEXT_OFFSET); cr->clip(); cr->move_to( dB2PixelsX(DATA_RANGE_MIN) + 0.5, dB2PixelsY(DATA_RANGE_MIN) + 0.5 ); double knee_range, y_dB; if(m_bIsCompressor) { for(double x_dB = DATA_RANGE_MIN; x_dB <= DATA_RANGE_MAX; x_dB += 1.0) { knee_range = 2.0*(x_dB - m_Threshold); if (knee_range < -m_Knee) { //Under Threshold y_dB = x_dB; } else if(knee_range >= m_Knee ) { //Over Threshold y_dB = m_Threshold + (x_dB - m_Threshold)/m_Ratio; } else { //On Knee y_dB = x_dB + ((1.0/m_Ratio -1.0)*(x_dB - m_Threshold + m_Knee/2.0)*(x_dB - m_Threshold + m_Knee/2.0))/(2.0*m_Knee); } y_dB += m_Makeup; cr->line_to( dB2PixelsX(x_dB) + 0.5, dB2PixelsY(y_dB) + 0.5); } } else { //Draw Expander/Gate for(double x_dB = DATA_RANGE_MIN; x_dB <= DATA_RANGE_MAX; x_dB += 1.0) { knee_range = 2.0*(x_dB - m_Threshold); if (knee_range < -m_Knee) { //Under Threshold y_dB = m_Threshold + (x_dB - m_Threshold)*m_Ratio; } else if(knee_range >= m_Knee ) { //Over Threshold y_dB = x_dB; } else { //On Knee y_dB = x_dB + ((1.0 - m_Ratio)*(x_dB - m_Threshold - m_Knee/2)*(x_dB - m_Threshold - m_Knee/2))/(2*m_Knee); } if( y_dB < x_dB + m_Range ) { y_dB = x_dB + m_Range; } cr->line_to( dB2PixelsX(x_dB) + 0.5, dB2PixelsY(y_dB) + 0.5); } } cr->set_line_width(1.0); cr->set_line_cap(Cairo::LINE_CAP_ROUND); cr->set_source_rgb(1,1,1); cr->stroke(); cr->restore(); //draw de outer grind box cr->save(); cr->set_source_rgb(0.3, 0.3, 0.3); cr->set_line_width(1); cr->move_to(CURVE_MARGIN + CURVE_TEXT_OFFSET + 0.5, CURVE_MARGIN + 0.5); cr->line_to(width - CURVE_MARGIN + 0.5, CURVE_MARGIN + 0.5); cr->line_to(width - CURVE_MARGIN + 0.5, height - CURVE_MARGIN - CURVE_TEXT_OFFSET + 0.5); cr->line_to(CURVE_MARGIN + CURVE_TEXT_OFFSET + 0.5 , height - CURVE_MARGIN - CURVE_TEXT_OFFSET + 0.5); cr->line_to(CURVE_MARGIN + CURVE_TEXT_OFFSET + 0.5, CURVE_MARGIN + 0.5); cr->stroke(); cr->restore(); } return true; } eq10q-2.2/gui/widgets/filter.h0000644000175000001440000000400513023240626015554 0ustar sapistausers/*************************************************************************** * Copyright (C) 2011 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ /*************************************************************************** This file contains the filter definitions ///TODO: codi duplicat entre aqui i el motor d'audio ****************************************************************************/ #ifndef FILTER_TYPE_API_H #define FILTER_TYPE_API_H typedef enum { NOT_SET, LPF_ORDER_1, LPF_ORDER_2, LPF_ORDER_3, LPF_ORDER_4, HPF_ORDER_1, HPF_ORDER_2, HPF_ORDER_3, HPF_ORDER_4, LOW_SHELF, HIGH_SHELF, PEAK, NOTCH, }FilterType; //Convert int to FilterType FilterType int2FilterType(int iType); #endifeq10q-2.2/gui/widgets/bassupwindow.h0000644000175000001440000000576513023240626017032 0ustar sapistausers/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef BASSUP_MAIN_WIN_H #define BASSUP_MAIN_WIN_H #include #include #include #include #include #include //LV2 UI header #include #include "mainwidget.h" #include "knob2.h" #define PORT_OUTPUT 0 #define PORT_INPUT 1 #define PORT_AMOUNT 2 using namespace sigc; class BassUpMainWindow : public MainWidget { public: BassUpMainWindow(const char *uri, std::string bundlePath); virtual ~BassUpMainWindow(); // Informing GUI about changes in the control ports void gui_port_event(LV2UI_Handle ui, uint32_t port, uint32_t buffer_size, uint32_t format, const void * buffer) { float data = * static_cast(buffer); // Checking if params are the same as specified in the LV2 documentation if (format != 0) { return; } if (buffer_size != 4) { return; } // Updating values in GUI ======================================================== switch (port) { case PORT_AMOUNT: m_Amount->set_value(data); break; } } LV2UI_Controller controller; LV2UI_Write_Function write_function; protected: KnobWidget2 *m_Amount; Gtk::HBox m_Box; Gtk::Alignment m_MainWidgetAlign, m_KnobAlign; Gtk::Image *image_logo; //Signal Handlers void onAmountChange(); private: std::string m_pluginUri; std::string m_bundlePath; }; #endifeq10q-2.2/gui/widgets/mainwidget.h0000644000175000001440000000344313023240626016424 0ustar sapistausers/*************************************************************************** * Copyright (C) 2015 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef MAIN_WIDGET_H #define MAIN_WIDGET_H #include class MainWidget : public Gtk::EventBox { public: MainWidget(); virtual ~MainWidget(); protected: //Override default signal handler: virtual bool on_expose_event(GdkEventExpose* event); virtual void on_realize(); Gdk::Color m_bg_orgi; }; #endifeq10q-2.2/gui/widgets/eqwindow.cpp0000644000175000001440000007040013023240626016461 0ustar sapistausers/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include #include "eqwindow.h" #include "guiconstants.h" #include "setwidgetcolors.h" #define KNOB_ICON_FILE "/knobs/knob2_32px.png" #define KNOB_ICON_FILE_MINI "/knobs/knob2_25px.png" //Constructor EqMainWindow::EqMainWindow(int iAudioChannels, int iNumBands, const char *uri, const char *bundlePath, const LV2_Feature *const *features) :m_BypassButton("Eq On"), m_FftRtaActive("RTA"), m_FftSpecActive("Spec"), m_dB10Scale("10 dB"), m_dB25Scale("25 dB"), m_dB50Scale("50 dB"), m_LRStereoMode("L/R"), m_MSStereoMode("M/S"), m_FlatButton("Flat"), m_SaveButton("Save"), m_LoadButton("Load"), m_FftHold("Hold"), m_iNumOfChannels(iAudioChannels), m_iNumOfBands(iNumBands), m_bMutex(false), m_port_event_InGain(false), m_port_event_OutGain(false), m_port_event_Bypass(false), m_port_event_Curve(false), m_pluginUri(uri), m_bundlePath(bundlePath) { //Get LV2_Feature map = NULL; for (int i = 0; features[i]; ++i) { if (!strcmp(features[i]->URI, LV2_URID_URI "#map")) { map = (LV2_URID_Map*)features[i]->data; } } if (!map) { std::cout<<"Eq10q UI: Host does not support urid:map"<set_value(80.0); m_FftGain->set_value(0.0); m_FftCtlVBox.pack_start(m_FftRtaActive, Gtk::PACK_EXPAND_PADDING); m_FftCtlVBox.pack_start(m_FftSpecActive, Gtk::PACK_EXPAND_PADDING); m_FftAlngGain.add(*m_FftGain); m_FftAlngGain.set_padding(2, 5, 8, 12); m_FftCtlVBox.pack_start(m_FftAlngGain, Gtk::PACK_SHRINK); m_FftAlngRange.add(*m_FftRange); m_FftAlngRange.set_padding(2, 5, 8, 12); m_FftCtlVBox.pack_start(m_FftAlngRange, Gtk::PACK_SHRINK); m_FftCtlVBox.pack_start(m_FftHold, Gtk::PACK_EXPAND_PADDING); m_FftAlignInner.add(m_FftCtlVBox); m_FftAlignInner.set_padding(25, 8, 6, 6); m_FftBox = Gtk::manage(new SideChainBox(" FFT ", 10)); m_FftBox->add(m_FftAlignInner); m_FftAlign.set_padding(0, 3, 0, 0); m_FftAlign.add(*m_FftBox); m_dBScaleBox.pack_start(m_dB10Scale, Gtk::PACK_EXPAND_PADDING); m_dBScaleBox.pack_start(m_dB25Scale, Gtk::PACK_EXPAND_PADDING); m_dBScaleBox.pack_start(m_dB50Scale, Gtk::PACK_EXPAND_PADDING); m_dBScaleAlignInner.add(m_dBScaleBox); m_dBScaleAlignInner.set_padding(25, 8, 6, 6); m_dBScaleFrame = Gtk::manage(new SideChainBox(" Range ", 10)); m_dBScaleFrame->add(m_dBScaleAlignInner); m_dBScaleAlign.set_padding(0, 3, 0, 0); m_dBScaleAlign.add(*m_dBScaleFrame); //Stereo mode pack if(m_iNumOfChannels == 2) { m_LRStereoMode.set_active(true); m_MSStereoMode.set_active(false); m_StereoBox.pack_start(m_LRStereoMode, Gtk::PACK_EXPAND_PADDING); m_StereoBox.pack_start(m_MSStereoMode, Gtk::PACK_EXPAND_PADDING); m_StereoInnerAlng.add(m_StereoBox); m_StereoInnerAlng.set_padding(25, 8, 6, 6); m_MidSideBox = Gtk::manage(new SideChainBox(" Mode ", 10)); m_MidSideBox->add(m_StereoInnerAlng); m_StereAlng.set_padding(0, 3, 0, 0); m_StereAlng.add(*m_MidSideBox); } //dB Scale & Fft Ctl box packing if(m_iNumOfChannels == 2) { m_FftdBBox.pack_start(m_StereAlng,Gtk::PACK_SHRINK); } m_FftdBBox.pack_start(m_dBScaleAlign,Gtk::PACK_SHRINK); m_FftdBBox.pack_start(m_FftAlign,Gtk::PACK_SHRINK); m_Bode = Gtk::manage(new PlotEQCurve(m_iNumOfBands, m_iNumOfChannels)); m_BandBox.set_spacing(0); m_BandBox.set_homogeneous(true); m_BandCtlArray = new BandCtl*[m_iNumOfBands]; for (int i = 0; i< m_iNumOfBands; i++) { m_BandCtlArray[i] = Gtk::manage(new BandCtl(i, &m_bMutex, m_bundlePath.c_str(), m_iNumOfChannels == 2)); m_BandBox.pack_start(*m_BandCtlArray[i], Gtk::PACK_SHRINK); m_BandCtlArray[i] -> signal_changed().connect( sigc::mem_fun(*this, &EqMainWindow::onBandChange)); m_BandCtlArray[i] -> signal_band_selected().connect( sigc::mem_fun(*this, &EqMainWindow::onBandCtlSelectBand)); m_BandCtlArray[i] -> signal_band_unselected().connect( sigc::mem_fun(*this, &EqMainWindow::onBandCtlUnselectBand)); m_BandCtlArray[i] -> signal_mid_side_changed().connect( sigc::mem_fun(*this, &EqMainWindow::onBandCtlMidSideChanged)); } //Bode plot layout m_PlotBox.set_spacing(0); m_PlotBox.pack_start(*m_Bode); m_PlotBox.pack_start(m_FftdBBox,Gtk::PACK_SHRINK); //Box layout m_ABFlatBox.set_homogeneous(false); m_ABFlatBox.pack_start(m_BypassAlign,Gtk::PACK_SHRINK); m_ABFlatBox.pack_start(m_ButtonAAlign,Gtk::PACK_SHRINK); m_ABFlatBox.pack_start(*image_logo_center); m_ABFlatBox.pack_start(m_FlatAlign,Gtk::PACK_SHRINK); m_ABFlatBox.pack_start(m_LoadAlign,Gtk::PACK_SHRINK); m_ABFlatBox.pack_start(m_SaveAlign,Gtk::PACK_SHRINK); m_LoadButton.show(); m_SaveButton.show(); m_LoadAlign.show(); m_SaveAlign.show(); m_CurveBypassBandsBox.pack_start(m_PlotBox ,Gtk::PACK_SHRINK); m_CurveBypassBandsBox.pack_start(m_ABFlatBox ,Gtk::PACK_SHRINK); m_CurveBypassBandsBox.pack_start(m_BandBox ,Gtk::PACK_SHRINK); m_InGainBox.pack_start(*m_VuMeterIn, Gtk::PACK_EXPAND_WIDGET); m_InGainBox.pack_start(*m_GainFaderIn, Gtk::PACK_SHRINK); m_OutGainBox.pack_start(*m_VuMeterOut, Gtk::PACK_EXPAND_WIDGET); m_OutGainBox.pack_start(*m_GainFaderOut, Gtk::PACK_SHRINK); m_GainEqBox.pack_start(m_CurveBypassBandsBox, Gtk::PACK_SHRINK); m_GainEqBox.pack_start(m_InGainBox, Gtk::PACK_SHRINK); m_GainEqBox.pack_start(m_OutGainBox, Gtk::PACK_SHRINK); m_GainEqBox.set_spacing(2); m_MainBox.pack_start(m_GainEqBox); m_MainBox.set_spacing(0); image_logo_center->show(); m_MainWidgetAlign.add(m_MainBox); add(m_MainWidgetAlign); m_MainWidgetAlign.show(); //Add some tooltips m_AButton.set_tooltip_text("A/B eq comparation"); m_BypassButton.set_tooltip_text("Enable/Disable the equalizer"); m_FlatButton.set_tooltip_text("Reset all values to default"); m_GainFaderIn->set_tooltip_text("Adjust the input gain"); m_GainFaderOut->set_tooltip_text("Adjust the output gain"); m_LoadButton.set_tooltip_text("Load curve from file"); m_SaveButton.set_tooltip_text("Save curve to file"); m_dB10Scale.set_tooltip_text("Change plot range to 10 dB"); m_dB25Scale.set_tooltip_text("Change plot range to 25 dB"); m_dB50Scale.set_tooltip_text("Change plot range to 50 dB"); //connect signals m_BypassButton.signal_clicked().connect(sigc::mem_fun(*this, &EqMainWindow::onButtonBypass)); m_AButton.signal_clicked().connect( sigc::mem_fun(*this, &EqMainWindow::onButtonA)); m_FlatButton.signal_clicked().connect( sigc::mem_fun(*this, &EqMainWindow::onButtonFlat)); m_GainFaderIn->signal_changed().connect(sigc::mem_fun(*this, &EqMainWindow::onInputGainChange)); m_GainFaderOut->signal_changed().connect(sigc::mem_fun(*this, &EqMainWindow::onOutputGainChange)); m_Bode->signal_changed().connect(sigc::mem_fun(*this, &EqMainWindow::onCurveChange)); m_Bode->signal_enabled().connect(sigc::mem_fun(*this, &EqMainWindow::onCurveBandEnable)); m_Bode->signal_selected().connect(sigc::mem_fun(*this, &EqMainWindow::onBodeSelectBand)); m_Bode->signal_unselected().connect(sigc::mem_fun(*this, &EqMainWindow::onBodeUnselectBand)); Glib::signal_timeout().connect( sigc::mem_fun(*this, &EqMainWindow::on_timeout), TIMER_VALUE_MS); m_SaveButton.signal_clicked().connect( sigc::mem_fun(*this, &EqMainWindow::saveToFile)); m_LoadButton.signal_clicked().connect( sigc::mem_fun(*this, &EqMainWindow::loadFromFile)); //FFT Control m_FftRtaActive.signal_clicked().connect( sigc::mem_fun(*this, &EqMainWindow::onButtonFftRta)); m_FftSpecActive.signal_clicked().connect( sigc::mem_fun(*this, &EqMainWindow::onButtonFftSpc)); m_FftHold.signal_press().connect( sigc::mem_fun(*this, &EqMainWindow::onHoldFft_press)); m_FftHold.signal_release().connect( sigc::mem_fun(*this, &EqMainWindow::onHoldFft_release)); m_FftGain->signal_changed().connect(sigc::mem_fun(*this, &EqMainWindow::onFftGainScale)); m_FftRange->signal_changed().connect(sigc::mem_fun(*this, &EqMainWindow::onFftRangeScale)); //dB Scale controlrs m_Bode->setPlotdBRange(25.0); m_dB25Scale.set_active(true); m_dB10Scale.signal_clicked().connect( sigc::mem_fun(*this, &EqMainWindow::onDbScale10Changed)); m_dB25Scale.signal_clicked().connect( sigc::mem_fun(*this, &EqMainWindow::onDbScale25Changed)); m_dB50Scale.signal_clicked().connect( sigc::mem_fun(*this, &EqMainWindow::onDbScale50Changed)); //MidSide Mode Selector if(m_iNumOfChannels == 2) { m_LRStereoMode.signal_clicked().connect( sigc::mem_fun(*this, &EqMainWindow::onLeftRightModeSelected)); m_MSStereoMode.signal_clicked().connect( sigc::mem_fun(*this, &EqMainWindow::onMidSideModeSelected)); } //Load the EQ Parameters objects, the params for A curve will be loaded by host acording previous session plugin state m_AParams = new EqParams(m_iNumOfBands); m_BParams = new EqParams(m_iNumOfBands); m_AParams->loadFromTtlFile(m_pluginUri.c_str()); m_BParams->loadFromTtlFile(m_pluginUri.c_str()); m_CurParams = m_AParams; //Set cutom theme color: Gdk::Color m_WinBgColor; SetWidgetColors m_WidgetColors; } EqMainWindow::~EqMainWindow() { //Send FFT_OFF to DSP sendAtomFftOn(false); delete image_logo_center; delete m_AParams; delete m_BParams; delete m_GainFaderIn; delete m_GainFaderOut; delete m_VuMeterIn; delete m_VuMeterOut; delete m_Bode; delete[] m_port_event_Curve_Gain; delete[] m_port_event_Curve_Freq; delete[] m_port_event_Curve_Q; delete[] m_port_event_Curve_Type; delete[] m_port_event_Curve_Enable; delete m_FftGain; delete m_FftRange; delete m_FftBox; if(m_iNumOfChannels == 2) { delete m_MidSideBox; } for(int i = 0; i < m_iNumOfBands; i++) { delete m_BandCtlArray[i]; } delete[] m_BandCtlArray; } void EqMainWindow::request_sample_rate() { //Request Sample rate int AtomPortNumber = PORT_OFFSET + 2*m_iNumOfChannels + 5*m_iNumOfBands + 2*m_iNumOfChannels + 1; uint8_t obj_buf[64]; lv2_atom_forge_set_buffer(&forge, obj_buf, sizeof(obj_buf)); LV2_Atom_Forge_Frame frame; LV2_Atom* msg = (LV2_Atom*)lv2_atom_forge_object(&forge, &frame, 0, uris.atom_sample_rate_request); lv2_atom_forge_pop(&forge, &frame); write_function(controller, AtomPortNumber, lv2_atom_total_size(msg), uris.atom_eventTransfer, msg); } //Timer to redraw all widgets in case of host port events bool EqMainWindow::on_timeout() { if(m_port_event_Bypass) { m_port_event_Bypass = false; m_BypassButton.set_active(m_bypassValue > 0.5f ? false : true); m_Bode->setBypass(m_bypassValue > 0.5f ? true : false); } if(m_port_event_InGain) { m_port_event_InGain = false; m_GainFaderIn->set_value((double)m_CurParams->getInputGain()); } if(m_port_event_OutGain) { m_port_event_OutGain = false; m_GainFaderOut->set_value((double)m_CurParams->getOutputGain()); } if(m_port_event_Curve) { m_port_event_Curve = false; for(int i = 0; i < m_iNumOfBands; i++) { if(m_port_event_Curve_Gain[i]) { m_port_event_Curve_Gain[i] = false; m_BandCtlArray[i]->setGain(m_CurParams->getBandGain(i)); m_Bode->setBandGain(i, m_CurParams->getBandGain(i)); } if(m_port_event_Curve_Freq[i]) { m_port_event_Curve_Freq[i] = false; m_BandCtlArray[i]->setFreq(m_CurParams->getBandFreq(i)); m_Bode->setBandFreq(i, m_CurParams->getBandFreq(i)); } if(m_port_event_Curve_Q[i]) { m_port_event_Curve_Q[i] = false; m_BandCtlArray[i]->setQ(m_CurParams->getBandQ(i)); m_Bode->setBandQ(i, m_CurParams->getBandQ(i)); } if(m_port_event_Curve_Enable[i]) { m_port_event_Curve_Enable[i] = false; m_BandCtlArray[i]->setEnabled(m_CurParams->getBandEnabled(i)); m_Bode->setBandEnable(i, m_CurParams->getBandEnabled(i)); } if(m_port_event_Curve_Type[i]) { m_port_event_Curve_Type[i] = false; m_BandCtlArray[i]->setFilterType(m_CurParams->getBandType(i)); m_Bode->setBandType(i, m_CurParams->getBandType(i)); } } } return true; } void EqMainWindow::changeAB(EqParams *toBeCurrent) { m_CurParams = toBeCurrent; //Reload All data m_GainFaderIn->set_value((double)m_CurParams->getInputGain()); m_GainFaderOut->set_value((double)m_CurParams->getOutputGain()); //Write to LV2 port float aux; aux =(float) m_GainFaderIn->get_value(); write_function(controller, EQ_INGAIN, sizeof(float), 0, &aux); aux =(float) m_GainFaderOut->get_value(); write_function(controller, EQ_OUTGAIN, sizeof(float), 0, &aux); //Reset the Curve Plot m_Bode->resetCurve(); //changeAB action will overwrite Q values by defaults to keep the values we use this var float usedQ; for(int i = 0; i < m_iNumOfBands; i++) { usedQ = m_CurParams->getBandQ(i); //It's very important to set de values for bandCtl and bode object. //Because if there are some value that does not change between A/B curves this could be not correctly updated m_BandCtlArray[i]->setFreq(m_CurParams->getBandFreq(i)); m_BandCtlArray[i]->setGain(m_CurParams->getBandGain(i)); m_BandCtlArray[i]->setEnabled(m_CurParams->getBandEnabled(i)); m_BandCtlArray[i]->setFilterType(m_CurParams->getBandType(i)); m_BandCtlArray[i]->setQ(usedQ); m_CurParams->setBandQ(i, usedQ); m_Bode->setBandGain(i, m_CurParams->getBandGain(i)); m_Bode->setBandFreq(i, m_CurParams->getBandFreq(i)); m_Bode->setBandQ(i, m_CurParams->getBandQ(i)); m_Bode->setBandEnable(i, m_CurParams->getBandEnabled(i)); m_Bode->setBandType(i, m_CurParams->getBandType(i)); //Write to LV2 ports aux = m_CurParams->getBandGain(i); write_function(controller, i + PORT_OFFSET + 2*m_iNumOfChannels, sizeof(float), 0, &aux); //Gain aux = m_CurParams->getBandFreq(i); write_function(controller, i + PORT_OFFSET + 2*m_iNumOfChannels + m_iNumOfBands, sizeof(float), 0, &aux); //Freq aux = m_CurParams->getBandQ(i); write_function(controller, i + PORT_OFFSET + 2*m_iNumOfChannels + 2*m_iNumOfBands, sizeof(float), 0, &aux); //Q aux = m_CurParams->getBandEnabled(i); write_function(controller, i + PORT_OFFSET + 2*m_iNumOfChannels + 4*m_iNumOfBands, sizeof(float), 0, &aux); //Enable aux = m_CurParams->getBandType(i); write_function(controller, i + PORT_OFFSET + 2*m_iNumOfChannels + 3*m_iNumOfBands, sizeof(float), 0, &aux); //Filter type } } void EqMainWindow::onButtonA() { if(m_AButton.get_active()) { changeAB(m_AParams); } else { changeAB(m_BParams); } } void EqMainWindow::onButtonFlat() { //Popup a waring message Gtk::MessageDialog dialog((Gtk::Window&)(*this->get_toplevel()),"This will flat the current curve, are you sure?", false /* use_markup */, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL); if(dialog.run() == Gtk::RESPONSE_OK)loadEqParams(); } void EqMainWindow::onButtonBypass() { #ifdef PRINT_DEBUG_INFO std::cout<<"onButtonBypass... "; #endif m_Bode->setBypass(!m_BypassButton.get_active()); if (m_BypassButton.get_active()) { m_bypassValue = 0.0f; } else { m_bypassValue = 1.0f; } write_function(controller, EQ_BYPASS, sizeof(float), 0, &m_bypassValue); #ifdef PRINT_DEBUG_INFO std::cout<<" Return"<getBandEnabled(band) ? 1 : 0; if(m_iNumOfChannels == 2) { switch(m_BandCtlArray[band]->getStereoState()) { case BandCtl::DUAL: ival |= 0x00; m_Bode->setStereoState(band, PlotEQCurve::DUAL); break; case BandCtl::ML: ival |= 0x02; m_Bode->setStereoState(band, PlotEQCurve::ML); break; case BandCtl::SR: ival |= 0x04; m_Bode->setStereoState(band, PlotEQCurve::SR); break; } } float fValue = (float)ival; write_function(controller, band + PORT_OFFSET + 2*m_iNumOfChannels + 4*m_iNumOfBands, sizeof(float), 0, &fValue); //TODO maybe I want to use AB comparation with MID-SIDE???? //m_CurParams->setBandEnabled(iBand, (fValue > 0.5)); } void EqMainWindow::onInputGainChange() { #ifdef PRINT_DEBUG_INFO std::cout<<"onInputGainChange... "; #endif //Save data Change m_CurParams->setInputGain((float) m_GainFaderIn->get_value()); //Write to LV2 port float aux; aux = (float) m_GainFaderIn->get_value(); write_function(controller, EQ_INGAIN, sizeof(float), 0, &aux); #ifdef PRINT_DEBUG_INFO std::cout<<"Return"<setOutputGain((float) m_GainFaderOut->get_value()); //Write to LV2 port float aux; aux = (float) m_GainFaderOut->get_value(); write_function(controller, EQ_OUTGAIN, sizeof(float), 0, &aux); #ifdef PRINT_DEBUG_INFO std::cout<<"Return"<setGain(Gain); m_BandCtlArray[band_ix]->setFreq(Freq); m_BandCtlArray[band_ix]->setQ(Q); //Write to LV2 plugin ports //Gain write_function(controller, band_ix + PORT_OFFSET + 2*m_iNumOfChannels, sizeof(float), 0, &Gain); m_CurParams->setBandGain(band_ix, Gain); //Freq write_function(controller, band_ix + PORT_OFFSET + 2*m_iNumOfChannels + m_iNumOfBands, sizeof(float), 0, &Freq); m_CurParams->setBandFreq(band_ix, Freq); //Q write_function(controller, band_ix + PORT_OFFSET + 2*m_iNumOfChannels + 2*m_iNumOfBands, sizeof(float), 0, &Q); m_CurParams->setBandQ(band_ix, Q); } void EqMainWindow::onCurveBandEnable(int band_ix, bool IsEnabled) { m_BandCtlArray[band_ix]->setEnabled(IsEnabled); int ival = IsEnabled ? 1 : 0; if(m_iNumOfChannels == 2) { switch(m_BandCtlArray[band_ix]->getStereoState()) { case BandCtl::DUAL: ival |= 0x00; break; case BandCtl::ML: ival |= 0x02; break; case BandCtl::SR: ival |= 0x04; break; } } float fVal = (float)ival; write_function(controller, band_ix + PORT_OFFSET + 2*m_iNumOfChannels + 4*m_iNumOfBands, sizeof(float), 0, &fVal); m_CurParams->setBandEnabled(band_ix, IsEnabled); } void EqMainWindow::onBodeSelectBand(int band) { m_BandCtlArray[band]->glowBand(true); } void EqMainWindow::onBodeUnselectBand() { for(int i = 0; i < m_iNumOfBands; i++) { m_BandCtlArray[i]->glowBand(false); } } void EqMainWindow::onBandCtlSelectBand(int band) { m_Bode->unglowBands(); m_Bode->glowBand(band); } void EqMainWindow::onBandCtlUnselectBand() { m_Bode->unglowBands(); } void EqMainWindow::loadEqParams() { m_CurParams->loadFromTtlFile(m_pluginUri.c_str()); changeAB(m_CurParams); } void EqMainWindow::saveToFile() { Gtk::FileChooserDialog *fileChosser = new Gtk::FileChooserDialog("Save curve to file", Gtk::FILE_CHOOSER_ACTION_SAVE); fileChosser->add_button("Save", Gtk::RESPONSE_ACCEPT); fileChosser->add_button("Cancel", Gtk::RESPONSE_CANCEL); fileChosser->set_current_folder( getenv("HOME")); fileChosser->set_select_multiple(false); fileChosser->set_do_overwrite_confirmation(true); //File filter Gtk::FileFilter filter; std::stringstream ss; ss << "EQ" << m_iNumOfBands << "Q Curve File"; filter.set_name(ss.str()); ss.str( std::string() ); ss.clear(); ss << "*.eq" << m_iNumOfBands << "q"; filter.add_pattern(ss.str()); fileChosser->add_filter(filter); if (fileChosser->run() == Gtk::RESPONSE_ACCEPT) { ss.str( std::string() ); ss.clear(); ss << fileChosser->get_filename() << ".eq" << m_iNumOfBands << "q"; m_CurParams->saveToFile(ss.str().c_str()); } delete fileChosser; } void EqMainWindow::loadFromFile() { Gtk::FileChooserDialog *fileChosser = new Gtk::FileChooserDialog("Load curve from file", Gtk::FILE_CHOOSER_ACTION_OPEN); fileChosser->add_button("Load", Gtk::RESPONSE_ACCEPT); fileChosser->add_button("Cancel", Gtk::RESPONSE_CANCEL); fileChosser->set_current_folder( getenv("HOME")); fileChosser->set_select_multiple(false); //File filter Gtk::FileFilter filter; std::stringstream ss; ss << "EQ" << m_iNumOfBands << "Q Curve File"; filter.set_name(ss.str()); ss.str( std::string() ); ss.clear(); ss << "*.eq" << m_iNumOfBands << "q"; filter.add_pattern(ss.str()); fileChosser->add_filter(filter); if (fileChosser->run() == Gtk::RESPONSE_ACCEPT) { if (m_CurParams->loadFromFile(fileChosser->get_filename().c_str())) { changeAB(m_CurParams); } else //This is the error case { //Popup a error message Gtk::MessageDialog dialog((Gtk::Window&)(*this->get_toplevel()),"Error loading curve file, number of bands does not match or this is not a valid eq10q file.\n\rNothing is loaded.", false /* use_markup */, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK); dialog.run(); } } delete fileChosser; } void EqMainWindow::onButtonFftRta() { sendAtomFftOn( m_FftRtaActive.get_active() ); m_Bode->setFftActive(m_FftRtaActive.get_active(), false); if(m_FftRtaActive.get_active()) { m_FftSpecActive.set_active(false); } } void EqMainWindow::onButtonFftSpc() { sendAtomFftOn( m_FftSpecActive.get_active() ); m_Bode->setFftActive(m_FftSpecActive.get_active(), true); if(m_FftSpecActive.get_active()) { m_FftRtaActive.set_active(false); } } void EqMainWindow::onHoldFft_press() { m_Bode->setFftHold(true); } void EqMainWindow::onHoldFft_release() { m_Bode->setFftHold(false); } void EqMainWindow::sendAtomFftOn(bool fft_activated) { int AtomPortNumber = PORT_OFFSET + 2*m_iNumOfChannels + 5*m_iNumOfBands + 2*m_iNumOfChannels + 1; uint8_t obj_buf[64]; lv2_atom_forge_set_buffer(&forge, obj_buf, sizeof(obj_buf)); LV2_Atom_Forge_Frame frame; LV2_Atom* msg = (LV2_Atom*)lv2_atom_forge_object(&forge, &frame, 0, fft_activated? uris.atom_fft_on : uris.atom_fft_off); lv2_atom_forge_pop(&forge, &frame); write_function(controller, AtomPortNumber, lv2_atom_total_size(msg), uris.atom_eventTransfer, msg); } void EqMainWindow::onFftGainScale() { m_Bode->setFftGain(m_FftGain->get_value()); } void EqMainWindow::onFftRangeScale() { m_Bode->setFftRange(m_FftRange->get_value()); } void EqMainWindow::onDbScale10Changed() { m_dB10Scale.set_active(true); m_dB25Scale.set_active(false); m_dB50Scale.set_active(false); m_Bode->setPlotdBRange(10.0); } void EqMainWindow::onDbScale25Changed() { m_dB10Scale.set_active(false); m_dB25Scale.set_active(true); m_dB50Scale.set_active(false); m_Bode->setPlotdBRange(25.0); } void EqMainWindow::onDbScale50Changed() { m_dB10Scale.set_active(false); m_dB25Scale.set_active(false); m_dB50Scale.set_active(true); m_Bode->setPlotdBRange(50.0); } void EqMainWindow::setStereoMode(bool isMidSide) { m_MSStereoMode.set_active(isMidSide); m_LRStereoMode.set_active(!isMidSide); for(int i = 0; i < m_iNumOfBands; i++) { m_BandCtlArray[i]->setStereoMode(isMidSide); } int PortNumber = PORT_OFFSET + 2*m_iNumOfChannels + 5*m_iNumOfBands + 2*m_iNumOfChannels + 2; float fValue = isMidSide ? 1.0f : 0.0f; write_function(controller, PortNumber, sizeof(float), 0, &fValue); } void EqMainWindow::onLeftRightModeSelected() { setStereoMode(false); } void EqMainWindow::onMidSideModeSelected() { setStereoMode(true); } eq10q-2.2/gui/icons/logobassup.png0000644000175000001440000004443513023240630016455 0ustar sapistausersPNG  IHDRBsibKGDC pHYs aFtIME 0 f IDATxܽy\Wu->5wԚmKvFX'g3H”1lfB !H ` 6xdda[Cuwuw8G$%ےMT[uk&<?4o} Pz3C@@yX4`0G:A.]E'Az=؃n߂0Xop7Oee`N 6 tng\u™(02f,3,G1sR yk,RJfeo%t@^ 7~cذЧJ000a.%^*_{o`@Ptew !rVq[QX0caʊU~FEE3`|J4? ##Mi 8890]N\Kl[^0O}i,MxKR3QP!q!nUڭj")΃EI\ y֝*ų@4v۬XW.]^r`!`^wb,b#NR7c+ڑ_ @06tfAɊcf򛟓Vx8UPZ0Q鐍 1F3Kbr @FFd8aØ@qN9hw!K@ܸ6/:OdۣD>/=L/CHA3Fjv^Y:,u8m/)Ve3]wd[:1K<4]"ㄱrdĎ3 gC+^J2 K\;Wb_Cild[HLm!/XVigf2>媻$Q6iq;QSAK,eKD  Ai "9.0e6Idl|\8} N% اGx 5 e'iUgX$Z|b7Eqkt5e@3-&= Nf@V.GEki w5DJm(0q)0UYUSZMm4|ZUǹ26 | 86 5#~tfixFUW5z.ec ޙmU+Bh4r4fS<4$)6:Q~ ꆏ~j vˮϽCZKH.2:M1w Od?hbz&ܻ=}%s~O|->-:yis4HHD Ѳ2jI*kMs-oŋu2sxi'~ 0kvN!.zQR@jwsSs20  (`=}ec._*P(D7N{V}J2NjV\`[5#V:Ȓq ck5 (Ix\Z?,GJ܋[$l@CAq "҂uvBѠrU<6JkNn֍׾q>6$V)tX1~P UV4udevgfc3@SjÁd~7-{șD>ꉟnOT#KۇZҙމtbP9ezciJ^4&Z ۾Ö׽iRP9Z?9FVLP-MxfD.wĽSdni_>i ֬ofVƺ*zFRGԨPr~ayjb*E;Le01;ye;guH5#YU#n^Yt K^妻,PY"mc :ɜSEM}_ |&qX!P"P J8T"h&9$hj}8;]IDXUFu:+HEܐ5LV⦮)|z΄[xYV[5L {i̋xEı<ͯOmXQݶ= lUζk' Zuyb6(ug=*xyqL4:Sz3S 8/3H#|esptg!H$P. Q/_5 {NKSY?w/𜵫V?}񊷽`y@='Fz$dtc@-}-R"Bm&fpIG^!"aađwY 3K53Ѹ33qf+0ǒmٱ3D#GN 10?~y3֬P|}NhKRɬF,zgPXsh?d;.q(ռ{6Ce#mKN/2;\m^tP9~X,8]'ln`n҈P~ka@B \*$ZH9N9fĒ@~}ƚ^*"Z E6,¤Q:4 1˃ok[y?8ŵKyX&jkΙlx3]jen70Y.6SƛЁ= ?@򾳈3~#06`rFZwy4E(+@L܁GJ1 QY8ǭ~syæSl8ԁz 6n' Brof^.qVrJt^g|Om_o{,b@i0ˢU ;NMc jPHm~R$' ȰdLF K85 }o־ fRP!fp|/y3 Um3 =\8_:B _m)u2d#\IN[Bjic#S]+ * 3h{zuԘ$2e?}UW#fotFNeLcӆ*ha>e-شSRG>~N&tĻ473O{w~SN1 %C{K:"M&od!;H  1CƓu黫;/쨭s 9+ Rl(4ʝzmk-Okgf,Csv&Gq"tڊ Je< q]wPr΂7O14KAbMX,_L5rjazy 0HPUlL\inzd}_MA, 'P@N@p޶Ev启E}M2$yx/$s۵V c(֢nc3|x_l.ъr gCT߸svTk+K-9FaRăs D}5E\uqOo|# (A`pdCC!H&jf])dj:}ؙhVrI.V4Rm[$8pN4I#+X%.MLҋ>3{MQ~cdDsx'o@3!18Y]4N{[k*]m)b0R D+Da,$!T1|%>kfwx͟wsap"o|է>qL[XRiע4'"qcXvŊ?qֳ W}7=p߽!"xk/Y>Vkc 6<"6VpIQ40uR@za8AQ~Oa""YEV∎}⬐;867V{l `D 'I:0S 咤kΙ 7,=m*z_x5P6H>gUKXv켍D=GlHUiun"ܑ#wy٩kN$IjaB遽E/ONe> mtr_#U*l9!ƏW??nDwX"q-)NQ.kࠝ3߳_OZ Zo}^¦j5ua/ǭ99s0If^- a@*=bi DD/}b&sӻ=S1*K-wI8SDy ;'E>1}TMJ%x'.S݆rIDË_-o|H͌+ "'c4>K(Mt69|sAXg\wt r-c()l=qiA=c-)4 νZU½w/#ο|[Wo3϶<BLdMql/yʊ R1" "(*ۧ"$BD0QF5w[ڋ{nmJyk4/Mq5 QVALM9X9&5D M0V=@&L"GND[[e ‰ݧF8w<`qY7bb~w[>]D>Nl7:k~Bp/(u "hH[،PG&Eml@臨'P*yR( ~gZf~(KDq"^"R^ǒo }\ɉA@ ڝ32ٌPp^Oaܟ>) \ ,[8Ɩ-{?3Zu݇v3'O&᳟KUK<$VB\ZۣJë{vc;7[^d98t-HNN$f3͸׿ޏV4+m~l:`)Y|_7s܁߽GZ_G/.+b!ŎDs#Z(.V;Mgc^) <5  2u;RJ$&w#J;;ߐhK"nu "d`q+ }oJŋHD"+%>䜟*Ws݀`4ksf>)0+x~ 4\6֚멙6ӆB98q;?8з~'zvxw.x ^Uf2Ց ;ۿS7yМֱw$3s2~~~8x|ݻP϶ {\֦7-DI–2I$ ^e@dkCL ]n ?goз=eV3v҆1[oܒ36*eь/wX#h.Nc8\tٞ*>lP%UUJζKCGo} .`j5*QQ$P$I CX".8pm;#+dSK@ NA]L6g1.21 3:C_'.-LUEsbfJ`(ZHĎ 9c$LD"°r9 dw$pYӜXz^=/r ػ+TC^Q !n[AD4/˝%U%kON̿,.TPrrm B9dIKo,]gR$~ί|q6{N'T5lၘ{{>aI+Wxɞ-[Ck x8 "$A2=Å#K gH,uʆ;^02 (GZ=Oo'*f4w+9k[?1ɬyWk_= hJAgIUr]y<u`h` &=OPHGj+u}ZoL|pG,*'9̲`E֔*E3c\(RW)+r嗿8Wʿ.7~깧{Q1  XOv_QlObB:+I MSi$9ӝ I-&(AN\z!V% N,3{gfڇ@G} _λfΙo_B&@K++#Aߞ849TgFkRT Ghd|Q ~n݊FL*L=Aց5(!لcB Af1f^7y~~[v  Lv_C+(c NOԇ N> Jm/;_3hjطgs2{QAhSrWpd$| @բ=]~mEm޹em.]j`GqeU&'# 1xn]Vaup5c)"둤 h^L k-*dȆ8iqՀDz N/0O6ttuT.1pY!"!%a#^i&NͤoYU5o>[)ށjڊw*ϩLMW8GϱJ>c- xygթBi%M:+ظQ ԭWE PDhJ|Yu-gY۾SY.C :2\JZQ֊;]c%")xQF[2Blj4':D3dn.d6ڏI7V˄_kyI@ 0wRˆ+e?i9|sz.Z6׮r.D}i<'vFE*)~j!v"!a=2VlJB`=֜S@yY淟_=i}֮3̷l鴭IE>4<;`~>u#pG6pNk((*pFd r!v498\eY̎褚1832wjy<;J:Z%J+a3Y: Lla祧̮% A; ;Dܞ$/oo:ܖ( UQs?LKt} %JI\Of0Qk3z;3Rĥw|K@ҍ ҉D[0xH%|".IM6]fa}?SQ^^[ ~:?ؼ?cn%a6e@Q>If@fPs|P=zʽΉMgz0CR'wxφ'!&3Pue dӄ@1e:]A%VH|a_zfz9"?=H2iK\b:úRq"u}s#B/i68ιZ&Efp¤ =%OGrO p.|DLoGsMs}Rh| ijKSrhp~*y6乴=%>, , Y2VI6> EKsy^t`Wp!,(8σ)r2 $֋lZo> 6uEs|&ŠRWB$"fB1W:>.A6+,jn;gq>ۇ1f>>G\<>^r1Y睇WO12+@\W$t(qJA(?8LOذ}'pxר]02"8&o![}̼> }}ras뇓!(+;غ<G,{l-Ե}Hb>p?h_#!IDi6Iu  KbrGJze6T+ @6n:ڄټT[dBg D FQν"d⾻/ ~S_lqD-bjH<e})'"Gyl@ϞGQrh*`6}gj~Y!X}҉< !9 f3u.v< y[gHd^A`^)cs"q xl`g^ DdfÑm{3VmBW7m™瞋7]NTUbƤ)Z{{#fs\14%1ٟ})dw^[C<ΧDl ^;n7}nC1SwY(8gw:طgzp+4k ,(AsfI9(y ɾB{n3#3/ $w/7&@@Sq&+ +m2[lC~#&b5Mrwk|:ۥIzD>'5_{Ӛ2+6B.`+YdR$p_JW665 ^x!u6?\[w-/J$nE9g,TafC` A:N4`BZО) ,r_t/ijoyyA45>_z &.xb;̥L#;bXXfH8m\%O=n[tw x @tvqE~a֞U?̧I$H_j贛/I{@E=4KL #0Gc25{ 5qc{?焀n!iϣZlUX.Rp !6n߇pkINeiMs~ `Ba ;vf\ed[;0۲dYS\EyCJ l#iMԌLVS7Z<%#걢&`UfMC[> C^{#bzY)А|z P+ÛrKj?j^ҧ}sv6QSE /-,%)R?|' ͛FZ'!9s ӚbפZtk<̂ ̵-*9i:,z`E8q 2."yqi;v/6pcˢۑ>Hyju}=}lCF iY UMW`^~ Ky8uL6K\"|q;ĭZ D:fD=b`+^07ӌjrix0w|g;9zAN7Տ7RvtFZyjd`вҕ]b'رeJOjK h~1g}>'!]iNkj84^DkDX zԖԗw^xao QߴmJ%'Cu޷>e_׆1Cq+35k+' 8@ ް_#ltD}ҝ!(m֥<؞%/=њ2Z"OQ>xͶ|i,|͉֖3u[\E.oPpNڎSg/e<\xsWG$_LeC%Ub62l:T}O]XY憶~%R9xGi8/ڀVH`v.׋n:y}=ٶJܙp inMFݩ@zvՂٕk&/*:@? TJh) ~iMpZ~ޝWt(G]kO='깢 9kNB2KIK֟M'$y,4>M[M*uҹίOo~W{L9q ܝ\_#]õ@+O"A0@:DvXP*qO,P&2j]c=ԺvSf),-hLKU5w߁Dk E†᫄#TcV;0rz Fajd3ZsݾXZӒtPk\a2RQSߞ<5 ;D KT|U[5~3kZxݓ:`p%MqzqZXvlT1llxugS ij,Ub5 X?.`-#-$0S3OIDATLKjx2yVRqQ_48&f'g_?hXڂfӌ/l`<Lƀbz 'gwx)~nEDZuL_5oYb蚕 ??RӅiIO 6SKm>oՍ8vD(V2Dà?o8 2 Buж|zWz7?ߩdQA%)Yü[u.f٤HsљNHjG7.v ;;FE/Gb@1溂{O ,~V;$ܳ`#H$iA~yo)ZqU҃,IaS!$N:1 VIR. Yk]U1}+f: #fluLXJ bf]&JKQ0?~,k!&(TFxb>]jw{4[ߠK`SP+*q˩my0kYmݡ~zwՒgzc"P! ӧ~&K[ ]wkw#Cgʮ0ճj𿱙wƇGmK935n7r{[2m!7Z l{6'M}ѽ~Ndrs]簒U,Zn A#A&_hAl4|YGuG 7XMc4b'̧;̰Xq\hcsG", 6|Y*7t6IBJ%;ƶ`%"zW_IW~ޤys5lh*|mU$Bc wChLV%U:5۰ȥBQoct*g: 1YUήXGo*L52$Md stt>l'?Jx^#h2]mXrϵIϯC}l`!®;d2LSnTݍp9H $emX+!F9buwPׄϗH*ɯ^9!.OOO]8[-.]ğ~`]\+w:w7OCrOG}w 6w邕h~s^W -Drv9Û@+k:[iQzfrjzl hUӻp.u ZwBmL07f[Lqx&{[Y.k/$@e2=8wgVzΘs ±wWXt@49?MφXNY\59KGWZ><`'߿zH}}b*QCFEm\cbD5Ȃc!yDLޛA#/~wkN~7=?׿[ESN_1T`Y!^BڲzΥF{عq;cɹnN.mΫYQٳYۻ'};d 2W~|Spɸm V適;Dl2Uel-_oaG1pL6xO{Zb{w/娐rDwt `ҚOo eW???_ƩF}*noK?禙.IENDB`eq10q-2.2/gui/icons/logodynamics.png0000644000175000001440000004422713023240630016766 0ustar sapistausersPNG  IHDRB?bKGD pHYs a ptIME 9j4q IDATxwdWu.sn[sOIMRF HD4d  &L0A?c`0<1A$DPQ<3SUWu9g?z$a^֪^jo[-~Ko[zWu[Ov^~g}»"o|,mpſjf޽52ܯފm?-7c rV0UP)Z rK[ӻ|Cͱ;`xtgnɰVe&ra7$Q׵T/|y[aT*2PU͛Mqk 7\~ /ȶJU:v$3k֏F]_з'MusJVZ#N-"QiQpk& Z J]QM`tMݾZrQkRޠi}./vLJ1x@-=NcΗȦRl!/Z◩Ԅȥ-|هMŠeLĉn/4g>S|jwOyI녅7=k9Bؚg9$X٫*N. ;ƀ,n R~kny&օTv%&axyE1(N - N:L/7,taaqTrM_lJ " X ٺѓnIi Ru]~2ksl KJI 0!ɤx+{?]Y3oE&_rqT[ҶvZ'=zq+Ov ތ=[ qk{6/b[{x[/JqaTu>{-t6wK49iz29}Nsّ.J,rmx)KnRdFzyyWȮL P6Ntlz)sூV{oV+V l;,rXjMMQmv~@QQ n!#lsci\Z{vK}ٿ[@`zjQC: HUu0E[<ިTm>K%)OiTgY%AKS.x@*4P-Qzū#],XW={(cr|*ֽ] gmȻ]uE^׭`]ٰɱqd[+:)k޾>Br4,a|q2- 5/wo- ;GMm\e}7[d u'=xsJ:,$T룀փ 3,#!IR zdT4Ƭ'A˵sk(CR,+CB) ׺~ln CpӞFxՅ+W`ppcaтHJ!PpQ<>~a !͡nCv|s}d-o,[ fAl }۷~6\ǁ1,y;!");+qrT'(60HQ`͆7n3l"Xgs;A1`&!hw|:x<#\yS](F]{>أBώ SV~;֎!ćqBɿO0`}oGɼ[YiC[l|H%y; J'SncmO}J7IR=X %#.W.3^3 #mLd|erE(ZyLaB,r (PR뵊`& "H" exs8y8DQ ~xj*Dļ! BBD>3(=u@IDf3#Nbcc_10JҶrْ$I$y@k˲@8VDdqZ,ϰc|:ᤥwَ h|aiLMˮ6]xȪ `Q?@+axB߀!h?=Ez~oz@xɲN36;7{'܁? #<. ]߻mp$>>Y_kda23{xȆboj[Sr]á{/%GZMs-ScDت$:cc6ܓs ^`]i&Jb6 iI"hPg.`^v>1#nA A0J C  0fI$`/0LVQaA23TZMƤRJRJNˁAH/ +-8L'A R].@6B\ 30XM2-TIoݵAG͹ϩo灱"=dXXq94><i5÷SM=nYK2;_y_]7&l;#UV~䯲?Lo ޾<ݶQɅ\VҐ,R\T|(jEK<T>_MVڦ*p6異J1vf 8 !%h<I;=}t f Dvpj$?8t:% CaZ:JABu%@~1H0)) 1|$ۓID9|Z%JXR@Hz D̀Jԏ-a(CmfG-R Kp] fa=v ~WNTu17cR35!wְ6o:6WmrsL]ۇv A}$)|А3Zٮ/_|:7|-_Kϼ5C+>|k'n*=sA:k vzcrz]dmKOqȜv'b;Ԅ:E$=H#c™T  b0!#̶>>: Bft`FObnf @Za1@)W霣#b%+FA!ZC@ "[mh!mL20f;^i2RZضS̙hjǁQI#Ib؎ķTl1w@d5hc8)hdeRν}'T^1߽E['6lQdkZQbd @P53ku|rDLHlZem\˖A0oO5R*P2tSf2ĘexF֮Æ[)'|QKgvFX|wQ) (Hr%K1h frKV,6VJb۶mt|>x! \nQB0=58Θ=}_uɉwr_3c unrڙl欩v|ԮZ$ 92V9 -BS4Zj)( 'BERd˄AoZI=k/DRvk :B)b}{^׾;x5/yv2SGr|eGvP BĊuEexsPͿs|կvu߷؟k "6Di20`&0$ÆX`NIȱ|-N{(\yv2=JK_3 Um.*sh6B{`־^SJ71ljsU2xQWnߴ0z LR FAf49X1YUavfDK1bMuP.t̔c'տ"\zՓf;a~v LBb@=ZU! (íLIoY[3*Raam8WN,>$jY)׷htpۤԢЂbz4 eBJ(%C9l wEV.-85?)*2߇}wS.]-Cd6^0ηW qZ'ۍV. C8cGl5+ؼrIɊfJ0ƓݝSseUY4Z#òm8 IΧ5XQ_\[AnLdV;K$h 6 nZlnƻgDY`goswney7{Senߝ֏!ѻlH{ִ=fmWA Jk lyC4'^P3n%)9Pyzqy[cfMtcphL8J4<_ V 2ki[lwyc7h(~kUk]c+]g)U1{N;S.eSQJn=ܤ\_ [vU;jqF.9[atq5J1X7;B5E2_{(?ʠ#ɴn$=22`--P?ʦ7.w (Z bNQV~"UM."[^^k:W( af2W[S3 ccX R&L͔u{eJYו0P,RMƷM@Yfnqu0n4Oj{ %,q)55 *)3I+N~gǸd4)ө7&A@12#]`MWH#k}r^L}RIE oL9τ\$0u̍BzQQ]Ho*;֖LTgmaTX|ŹJd$@N*Nz<]Y3S}_iP?nHȥ,xk,Xu C}D-vzk*{Κvn}gMz3ͰtE`*CE&[ƐM'̱fNj)9m4$!H "ײE!{3*2:MllKr&NN@lZMN4Jyoڴ N.*Fk_)8GRXڳX(фIiG4weG1)k@=FPZSv,lF,a)Es\yl. i+f3xšim3u-3Iܟ LD(@G`ɓ2#|K}lq֙l`dKKe;w}Ԃ2 q@]6PP`8k< һ?Zu#Zf[?}1緬tP58@z^Zxrb.%ig\iup2hl}!,C8U]tԭ ݳw$04 ݓFr52A9]Ȭtu''5["S4LwnAQa VL"(V;v}4q`A BBLHYJZ|#2 akRjnNCH}x SÞ3>;Kr -L l0UɬfMva.3`Pڅ#fy_}MjK4|R1 79ZGB*L0<I0떪vBG1ḴBQ gXf'^ͭ1\EGztPtRq'}'Nieqrhz`~T4=Y49$ɡZ7yO/{yjF]:$<x1ݙv},ζ\< k*Rgg+x+A?aB;DAibN3ŽI?q!lDG-p^.{|3%o ct8_Z\(ڇrRD $*OPtΆeLijLi&[31\vfc>eX0&@1SP BLq,y+n=e>-mmd"d}%X\EfNdM:V= O{<?_s(+_{S 1pk^ؾk_"gmL`zWmש7R ]'Um1 `1X!@1&nsv=^/\ ôM3ayajKu\%EBJPXOz;?{/˧_S?iP ! _ ?m`8ލ7o~ d`нe3- {Tu?FJ\T;4,. CsZvT*5w>Q祡jF%!!Rs%4CH)"ŋ?I +Ons9YEvhm S^k>ͷ{>&ž?nbGA8.'@Qs1ω3kw.W0DHΞ~Pp㣟!\;wހC7~#/cS0sIi>{YxvvvZjջ| ^50S/$D&zS\Z1ҥ&@YnP$6yt ZzԂ.,cEǀEHԩ`ٵ+P#9j$@#=`0܄=D坋01Zw̯>9"9_[.O<^:2!OW\CXZ'|?%xgbn9ͷގ Z 5Oמ  ud tykkNjTl`\gsG"7tKTNh~F z-nG0,/v>L Q#RD(J 4xXh܏?A+ ÷~Y 2  6 4 ̏=~-o 6lh<}Jz%a9^܎ᣀQ\*X|8pJ<?ep_hccW\8mn s`X!3X)sQ6ɜ ",wlj.@ ϥ@`93 ۫iwx6lٽf,ZOc^_ Bbz{oC_PÇoi WŠLͧАcR9D:yͶrC㐭$fCcX ȏ pjn\oDQOܝPh"I0#ncYpg?@qF g@`qD `@dԛ\nȡ51l3Զm"-^ꢝC]=od`ywOE!ft%؈d +=wFΛi/lz iotn/ӯD:HX;;Hr|"D :L&Eb2h67@B J6A,ثMB i=60FKn$99,H,Gy)JBtY½ {0 " 5 D" 82&[-24 . "V!:2jgrHvp> Nt'h,붨CP7 a<;![b3!"0;`Xk>ԅ 5WhE6M½d-g]Jya,_XA"fK؉C,KI"{}W?rg#Hg٣&,_"Pݧ:@?JO9,1B~f,B&qW7@hn@mr?: ׳Dcx`HNip cll'yQ]:P~S3kSB=[g6'qA*R?HUk_Ll qZD_Rڱ. GPW&nQԜ: 4ʱXږ$(iMw4xt YI{P8򉻋w<9#"#|( [jY+8B & !KH{B  ?CB B!X jKZh#6Iǐf00fCRK#!`A BXTr"ٷug5yq6i!MBS ,,#rX$El!J: RN*T\6V}[VCg%B2#_8^ K)h)Dr%K~~]_#3^E)DW㽒E9=;[[=a50ɾ7x ϸ&61{aR?_w.O崴l~OXkl 8_.& ȒЦ=rC`}AG'w~kWm?s`8U+ٙM)amj𮔰m!63sQOŒD]ѓ_߫j VOjtӟtYxX8$|fܮZ/ dC?xR\ozs bJ|q:V]<ϻl|@AXw2ŤG(OQ 8B%KbmfIQ;21bE*: 8Pli"y.v @7lflu߅Qg-ۊ씰Qף:_.]t~q `DefS QQ Qdzʗ>ATJ D[rɦK'8yz}g ;f[=oUl> vHv{bՓu{aʲh! {{w믾y+ӑ$>;s﮼i &˛:ssoB8cX—䷚ڄRPRKjXafb;;M\׀D;L1<ds9aTtR r\scF)xÄb|jnFIbX#x9{m$2g vv?\.F@cvy[TtDL'K5jU}T&f5i|z!n_ \YVtnBwt<$ڂՕܳ6|g;O<:qS>zHkZQuDw߯xj71ahvw0D^7wƏq3H_xȺ1"P,)B3Yl &luMCZkY"|raY6)y޹YvU>G?gZѼg$FaSƒ%\*l918SqbBL98l.6, pR,=@hޏ}T&]}>w^|_}ZʲLΞ~7}8g9V7Hx`uWm&Ƿ=uKy?/OfŘk@dg6vNYڕfX*[ڳg!/tBc[ (Z r59llipdDnb||TR"͒,'$8 Ǻ$W y^P#[{}w L2{޻7MWVF[ؚB9}Nu>':wn3#w⫯b œ0ALCzngMw?{wiC32j?=o|['90c;;[[wZ_̕$cV{+3`(c6~|9*wsRXh稏W> 0{319 +k@6o(!?>s+]N:A]<=hwpldON_Sc#c9Y|j~b=qt_| FYlpy阇8ZSQwgȈO>۸i}^*,~>9gJzڽo9y]?'}owݚ[4555ve?܃)[].-MwcbdJa6ϙV?542zݐ,7E$ d)wHe]VEYzuO~UW_dCO%w_^ߜxS/=̻?d 9MQӅ* Bhp8SE 1ŸMqr׎ٽC7<tEπ8Eǐ,A,>@ Ce$&D$Jܸo[=JV+q۟:z~PpDV % m !3 NAdSpKiR5)buq+CeaUla2JݓN^&w)R}J: 9b\F$v^Bb[mc\JL@%rFOmdt)fFUiR0w =U?f#m훻o_\Zv#6-haUeKNh2Sn Z3UcEVN  I;_,y9"TnwP"", n\N2U,nw\d D|< BrzPo~{u= .N'4(٥zlKHuԒ f3*dqXݪ6fLR2w "q[gvolSgϜ<|oٍ VA) (74L-FRtX,@UUT2ir8!pcë A*fr4H+b;U`6[U)BP\YR"<M-ϻH7 gP= IDATK&ģ? M _ =Ml"$B!s FhNx(AtAGA FŖu#aLI)0PrU1b|($ ˇ|!{_f& IJ  R+ yɆ*R!EE WEjÎ~^$B%̾)MH3Z n<#R˔d)kNJ-Fz}XWóūy L#Kgϑ‹39E 4aQd!dH߂<%V57(ِn +#HfTrGP)6&p!! .ZQ8hU砻leQPQ̻2rs3scLtSfr8\U|`J&%DRcRPK ):ef#s38'',Ze nD-y !$'cHFTWO&%pUo@9<3'&x \B]r gR<+BRe)})L i%2P}^rv{zi' -T3.d{`c:*ޓ~s[ \w1/,'Aη?wg8)i FBj{g]XAڂ^feIb‹Z)E˚ZsĮrw(}j?W \ 1'`#0|˒2>FGyZb` Jj>W[-\ucq& ͍SnhUo`NmEAb# ["5QTk.vzx X[jޫ'Ȧz77lF75h 'u c{!<~\Q\|g_54*66M\iJgClNP¾V& Cgt16K/|uN1%6MbomwEQ@Jƚ֨Yv>{SI|#НHɫyky]+ceDq30mLu¢2pљpݹzǎG-}y~N6zo,,e[2q3z |7@ש׾vhhdsrqJ7G88.7d̫{ūG~960R 95fd_mhLu}GvYfksku߹r|2vDgVmg 7_4^1@ww m#HlaPaT37糇Kt/%g7xEo?wsњY5jvܨ{EV9}xWŮ-szj:60[gqLl7Ύ\:NSШmZ%Xe[yđmWYc\i'V6ȸWҒ@\,Ay~:j։& ,0KW/lf gM2;?s)Oڵ [zߺTݩ>颭tU_:ֳpwm固W$7>__4dUJU.BP1c<{uw"Po$H֭g|wO Yˍ?);0O-8*H4P+#q^-np=/_CPq `;BJ PaҤH)RJ2 gфac˲_G@G\ M"h!~?~1'uIh6ĬYiMDSzQ' v:s*J)H)!3dB!3wk;2Z8e7 l#L o fI0vؖ $xkן71Qwul ~7%/x7sB`}/\.?n^L6GKۣ?ޜf3,lJ7&ɷ~b¿U8`| ˤ)4FT>ޏڮ:=*"dr9dr9RQ m48R1 lۦkT%v;x)X%j 퓧8 Y)Bw1?J]9y"IëXKϠlr#JP R"-x@WO[f'NaZ+9 N<;m?+dz{CZ "ԹSxogFudG m6{CM^p+:k֣z8㥇ro|kù/7}{<^~S[s:)!Ą$=qŸ6xa ?1G9PܿJqo+^28 9)˵&]IDhMRJNgfف6q c/u3gX+r|lۆ$ N13۲`wtPa}Ҩ&Q!j"u?2A%:}Z$IL^_Nk׭JN?_)e'ں;^aHhpn,g2;h8 pǫ^X6nc߲n+PqS5}"PQd"$IBw a߸ѿ<,/ ҷx&-դl}_yI?hADXv~{tE;!xzr0mc=@9޴nqb^Tyf';ϑc5B>txqn#nyՓ'pn|YoM\ bh!U*n /um?L=VOs2ͶcwAy>8*!)uٌpǼDD{oG-i[D!z?@\u9Oavj[ϿW_fphA5Nfcݷn߸71 fm_o±Ç/gIή0A>!"%INX໇.{Jss~LB@+a̗RJH☊3SKSE-ҖHL;C~͕rrE׆/U0$ggPeY !Zۚ/hMAr =|x",g"L @Jjx`af =^OAJkJ=]=tb~XU2JZλlB IߍH i1s06ɞOvc3Y$U/mmHyh*:=A? j*yw WӚ\X{iX,LA)9|r;83>[6amxGWr aO> AJ֓W`Lݿx `v7Gn \{鰊feL|x+té9\Z-z_ц{Pmcw~hGhAVLq" 2 B.Q ڍN'O{) 5,P&FP H03!^c1%8Rd±CPkY )%"v6z13 ؎ 0ð1/,3Y *Q5a8cli1oK"1, Iarr׭J\US"[С+FujX KyT lHg},?~BVZD{wh YT E6gKe峀IC !E u*=֢rt-7͙0Ա RDdfʭ/9m׮Lz|p*HK`Ng~놑Mc?b}].<]CB E8k23$OlX^[R=pH+a O$c@1GȵX &j O0Aè(udbKħS1è (H~"L&/@Az'oٙmd]R c h @hn=l ʥ2@*-92lۆgxqaq|-D A+>̷|1\{;WU=)M8wn?KC$m+պBlj/OFz2I8`;%/).,|LB@H 2i)R_BʪE=h6wz/^c{1BFB}F4H& ёfL9y{cy.Brwk:4#pD^ӥA*{*yKexӯoN8W(ś֔@Atcg7t 7>vIX;˷o,YcdѶV0DY,Gο 2?/{>+aURm2 0mi+buc kʵY^;F\X0 $a)̟\=Ʋ#{';UzaW '6<$` x<-?Ә+OnMfKO 3{~WO.+/T/(Ye T y1|y߆6cG'SNpʎy/n/F[/^s}Ɲܞo\<*[v~E$hB̶RBH͵=gM5}\EZb5g] B%WPJC)V IVb0IDg9n$6: )ǐBDeI&grG\e۰$Zi/;iAf3ެ`VfA 8_p2C.@@'lJM[Q2.{2>f0 @8NlXR HB@3r@r !SA:h4aɖ.b$jbf0Vt{ą"}L w0Dt})/ʸ^Zk΅fsq'G@f oM73K= CX Ӏa̟pF$L Z0'~ k:o_,GGge% Fs=sd-fhog_XS(P,QknlyWdIҖDIwbM]cFOqdz]iEGfYEjCBNɒm%CՑ*7қ5':2%-}Ҋx!jrf?l{4]snͮzҲl(C)XC+iPX$ QWɈv+mt=DlB%hh^.0@V%rK7#U'.SW++[~cZ` @+GY ^0nsҾjsXZ+BZ-U 8zĸ^U*E(ef9HZYTܒ/R)`J^xMJ ݨ(XME+,}jdZ:)|})Ľ[,AV 8c aAf 2 m]8;Gyeo\x?=S$^lPڭ ';ݩylR2$XU. IhrwՊ#EbOOJ=rZQ[؎BX\\DF0l9ǜ#ôݙ|&^K/2Da h h9 ZX> ѐ~ ^;3هQfrNFs 5X>6lӂiJpr*c9{5# ֒ZCHٚ5 s$ҫU%Jqhff`Y9 FRz-@20 iW\Ay=(&X+ŪQ/+X FFjs}Sf.DQ& k}e>3ֱceiҽ.]6VKXYb6BKswͦ Ze>y>V2^H1lF#kMr$сs*rfR#GA p\l 0B$gKE "AS-ҺI_a֭B{~s>\ç *h@-$xDž^36B4#w$fݝP (}VKffil2,°Eת*'q(JVtyA#R$}MͺyY+M&'0`dPF$?EZ pf1/ )䘥o3?`۽0" !lUͅ9do-M:u4>?2flgߚɞW}7D\х9*!&f2fэ rܶ; dg|Л}q_6LM 8 IDAT;գG63\cGo[Gb*KO0 !fDihX"Fk,9V|.XOlCBMdyNKZ}h͈>u\؎}I!m&j c_U۳_MQ8 >o_Gjt}C]u5N;ٙiXKrL |4\P^n}'(9w18؋ Ȍ'HW`@{REt[{Z*2⥡~ D#k֬- O!V\DZr&k2A[R*fO=koox042l6[@Ď /Ʀ-1~h+tLwwy,Z6cuRi"&a3B`k FhB;hZRor^N~K8nXBS ,Ĕ/0e2e<6G̦"`^ldf׌T[ n9kcw?žgg(remZCxi9 ßǺgIZ* 1K=g wLB1xmC~vvw:֗\n5پ{S("6U /~郧k &H ȄI+!&&m?Eg[ )`;6#jMs`h*~|'~镸oz#n}pƏ8-nnk6NtUt΄GST3-Y:pK[^koW^{-rmX\ko|{a,` m܂zbt< uD{O:{ҋӰ*+׿p?YYlpm{Ōv:\O^$<, @Rm\;.ډWeZ|#%VI-;дU_zhW&̳՞ֱ*4VـWv+z\{M(t@~FUɓ'qa0k nC쒊/u:B4 ?#!-$d RPH"VkdsI]7ίso A,ĭBI Ě3oJtu#8K F[%<9lT)~K|0zG͙.1ў{ɩR}mRL;iHa!QČ k bt* E|c_Qz3Gtbw?Wn܃pCU$D=ĥ4C'>yx^b$):Rġ)p% _YVǾݛMI_!Q>qnds&00Qa&"0izLa*Me8,"G2{3X=o77?}5De TQ'XU殁tS7ƥ޹`1>>}/1Tlҕ:9:J@l 4{'`к r-Q,lQ DƏ)붆gY/OAQ{V}'ORv ᅭYg 1 Y+3SVX Jid3 DFŅYd[=խ֞YT!0džg@b[|;_(Α̌0 !z9ztNOj^7n'DlxCNbZ*1ARa}C"4@\REcSbUe`fʟoKʒm)(}x<σz A s]"Yn\?uUS2tSө0<1"`{JZ:_x {ml.3"qF4 WKwCJA rԾOZ$ B30yAx~7a﹙M{ + qr;M#:L'O+udoH k{fՑ:b$ ǪSBkEDž,%LZPZR؅G>a&A0zȴ{DգTF+-c'kz·K^0 8BU,jM+s~jٶjRZtdX6'vF #DF2Vs2p,;^E$8oߋm!ɢ V{VnycOMUf,0  ۿ~`]/#qPGFpI(P*4- Y.nȕb4A0cY2<#ͣ͹?ۚJVG:^L[esaݰ̓%9`Q&e*̺$w }?OYν& ʆ:(Jl}B&a$nxm&SN + 1 ':Ҧ6 PAҒH1jK*)Zx`h܌ϵL%>{e` lQ'6vK2$Y`DI(Gi-y!xw9{`$ D׉DUHQ)oSzu02{lX鹋 kֲףmuoQ5yeF:NU'8V ШCp_uUV???Y*l٧m[ФɒYY\Mߛ?:y!sGY&vHtlA.[h?%nKFo%5&}Ŧ"3JlĂ%yQHn(N"KrE9maY:%u=EuSWzKHRX)A $Q0FC.O:)9% O,jZC#DĂ5Zsb (\ lXÅhn[t6n2Ph94AlP˧UnYuk;4dkv'0T DGyٕGg #Ԣ6`LBL6ufg zE Z]"x\O+ꦮW .<hOxF[Fϟm˂"*ZwX6t6T$[4B MC9l;sGï0kϐpUk~?m̬:aIB z'ۥ`3sm!.&N@"AShU1ң7gMpLXcx+ Avmc#JP\LQV07fr6'e꒞lBڡ2Fn ؠv3aDSRl^uS^v{OT&öp>KB@J1kX&VۀkCzEO5`P"[gp `"b=c \ゕ]ۗ9ɮ"tLQ"Q)DJLIsbѵfiD)$H7v":M]Nˍ2uĸp9(Y2:Z)k!D':&QbL؁6iNtI )7?[7Jw\z~ ˜*l Ri*4MA+M%%#e>{FtdDMR,@xm=hrd2 %/Tڰj:΂QIBT!k e64Ay&L4i1 9[{C驹+m{~9#rs'-O#C *Q6eљmP3e %d!LİA C@X#Cӻ!\04+9?6ّ_&n#ASp^0( *Fj)$!Q`8؟ǟhN0pyG= x'QW.PΥLs{$RƆmEJ8FICatV6Ȱ3H$DNd$#xr,O}, euq)aSr(sfWZآaR2hԃEU&c 8>&[@ @k7q'RMYm lYĜHlNȰHe֪cCkP+.ۗd :҉m\A@u cOH AP5BUSՍF܅5s-Rd]e 85 bX܄25!J,hJfӦZ&!GF4/D̊d{:/ E-i\hS,h`洦hh 9tM Y\[aI7hT¶bj̦D,&yf m(R*,8g1 O7*M\6J4my@ % s 1% Z% B^ [ (<Hhm]m^#WDaT"9=*`,0Ej/1HN\'"}=C΅:Ȃ+ km7]u|3A$*VI㩮_jKV5fS1 A" ڍERF EC!` D`>uZrk^#qlEZ] T5k=e"7TS%*D17r"[2yvƆ ,D[6lɭ;3i(H(&EƯ?? 6bd ÷6i1 Ddi!D5ق$E )$1|']50f4 d8(2@D1(Y Q¶`v(p] 8À,f& J' #1 A!PQR ݚ$(Å:DHK%UE ͌ bE4Ggr^5Sv◍žQZ!H#"1,N3yD(!1X$9m0)ofm@`xA /FG;A9l00z++KKD!<{SA'E" Ie-_Tj>3R>frdu|#? ?DHv\u?Uά&eW1vR)A`$ x@cEHH-<}!( B0 Mvvt>gֻ޵8B zjNns~+Y_ҷ K /k{|s7xw5K\`9h1rj%"rHie/z$O^_:{wz ];JKͨ94Mݞt,"뱕P$coGHCDiC1,q.LaP2ڠp6CWr~❄Wh 4#i޾=s7ZA&xYg*M[]5エMCq`aUf}a^~%&_o}Ozr#u>%#3I(̚, a3XJE}&DŰ6 ؚBS:`̜o҇Xb2$IZ#SbCycmc2 A٥2Г "2CLNARj%G**c4'ԬrLD$%,HֆSGW#aͲG{ڶ!Vںf6#AANFNMq@y7kz̷W<_&Z:F(Z|ŏ,&̂0c8uN) CWVy} =mjSbP6q?$74ݾbW(K5cՁo~WM^mfd]|ޅgֶ7}J)2Ouk~?ef7@#*vT[ 掊fP-Љb6MbװKssUܘliTOُė?[ԯ/fx ^>3]}Y- !jxsFImmfF55M my7 g Μ sB`h33 7D=ͮ_8GQ %pv{/`PhQ*Ι0@<v[nN:|v`'ijn*´\ie5i/FM0D9ܴ 57O*v6lSK%>“s|~oX`7:Ēs^R_t8u&H™UQh%:賈4BӥШ_^:<$#^Z;꒣cWP}R̢9"9fuBmsfZ*C49KY] UΜLzgd,d elA?ktuo.;EG߾;~v;9< >O<+Оgjh#'mXμsxx本nZh.H' ŮB;Ԛ(:\Z!fl,MJRV]? B|蜜= TRIdE8 I0a9Xi8,%ښ+lmn f̅923IlX@7YF'w'4؞Wl08dÿ5 pѾ]ߋ8uO=ew ~(17799rҕo8sw) ^qiN̎wy 49e VnQ͔`4X<&8 wtE7{+ͳv+H7wR* 1KيPh !7mwe%]8 o&b]*-xK66ӡ7Fٙ^CϜu߇mEOҺ, `Z9yS0L|ö*-݀jǡXp.@I&5Kb1fvtq8&_rr%wЕS'|,YOy v ;ΟU[I 䌊45b7`_#|/&Zg#tEZ^͊= "uNq,}޿W/v yu.dGGy+]1:ߝdE0+4ĶEHd212;'W#vo_s *[u|sO$M'3^`f9P#Fݿ 2`!!L<_`lopP ?|;~énn!;{da`bHt|f0004e`X&²Ц$;']27;2 !03QZ&ZJ,_AɠHSB2/)>bm-76# >xWxaF 3SiTj;k ;L~ 4&PF> |!GXVӲx޽HRH ’HDeD76Kw5ɱ f}WpQZkRRhE0 6RXY0$/"_WBBM!Jg|4&L>9m2?? 6ɢ 1%0BeShO V_!ƓI_XM v$n47L g[Y&|1r)w<}Ƅ$HȗP4ciROX֚HVtW"O{~5fJxRO\W @(@+PQ*+$ 8,q}Ða[ 9  '7;nmm-n#YKG3 |ѾFkC(T оbbnˏ?;NwrپnO_eeE#l:1#1Mv\Ҡ@lZ!};O&0vp>^5 #`$ɶx_:/43g_źk V6=BJT,oo'HCzH#G;D:I41dڷ|_zn%ꁇok VPM߿=uL)6tKBJ&I0cPS>{r 4&LN}筕[i^ݳکvs'O3id2+5׊CAҩ$%FC#P=GECT8iK&7w/?kyo;&^zٌ S1o&440cLFUp &]TÑCmUV>XNkg\ v Z9XsSmCCxuqAA!C#Ɖ;w}okii⒆'/s^zMnkVVUq;,^r>|PszBeLFL=uIq;}3;sfgv+Dqɍ,˜3S~yWן^/vAk֭Sai:i F ,RH%ɒL'I%w?֮[k(/'kgQJ!&weB ft $D< s-)z)Etr淶"ze:;;6@y ?&\)1 `0@($!)AJI<}]ԯ~o s:YD"%eLD38ρɤSiRN Ĵ,L*@ya踮B406:HSHŶ6~xJ$o-Ygo7fc||v@A:MhZj   [nۨB 0L@ @8!,U^Mvp]/7=C6m\7tyKq`CRiJJl!Ja~M?\<JJKBC_5]2-R4552w 86 +%Ts6υᅣL&3O="JDJ70`^~UeURJ+Eci2 $### 11>N&Bpl 'tD&d:E*a˯{p$@x.PRP$&'yE\e+h30H%dL:͒˹+0- 0$Du֬[V/o[E}*/  HL&MƦ&C* ]װ!K4k>)jjd2HqDQPJ q&'H$LLL0:2J&O}Lt2#=ݼ:xK/օ A)(3>>o ;wJwrzʩ]2[ a`&SSSK}c#J;P(D}c Q__Gee$͒NgdmR,RCPJai躎RX>~''$&TԀhiKVLSC7<|f|o[!;,sGn% 7B,ŏ6[ZtA(D<0s Q}oM-sߛcWD*Iuu-=D' ,NX%3Ebqy{L#ʻyі{z ҳJMMzp[<)i! 4]#N]@o;w  q]7꽯BKG>zilhl:M  :1=@Wwޱ;n EA @(0t BbϦ5P{l ҟ)-AӅ)ij#L .XlA ʫ>.Z~g3RϑuzzzH:xn4MJIsK }rsrE tʅjkkGN;-F"}0 5zF$LՕ  w7S40,P E0 LSN};с@ ^_sԂE9ގhtFvjj80U`"+V]Ӽ+4l/)IͲ=|y) T022ƞ]/@u,0 +*8g457#m> s6ų۶*M||qpKYy9\~vFLQ eaρ ?+]@j1.OπOڝj. M wVYH|~'CC!^g tMu_Ʒ[huu5 :r&1\0 w%,?;~=iU95-}HC+C溫.6$!U"ptuv[ūKo9C2>6 JQ[[a,_>w+C7<2,% q凯bيSi8l._Ƌ\|")E weu%@:guiy?o}J 3I/FNɡSwbxh}#_([~O 8wywy"4OCE?{Y7ںRS[y NXȚuoj┍'Ke9ys#w#f"i$ eqCzՑ`ӓP4^|̙ۂkyE :៯ _Ggn{DZu !V|tdeUTēol/`|喭췧,F9"0sMͫ YdҘOW,[ çH9#%R {_ퟘhרCG,O:~E83"b+m!=GXD'Q!,444zz̀eS;x xb,Hexn;J+w|O}W._Iv##utefq0 Xx1cd$Tl&gmz}1d2z²)OeyKSS\'Bʓ%/̋ ˿@ȣH9Qө&'xP!z'iU$ V^M0DL:#ìY=O7ub8R,8 ih(_ᗙ8sJ5o h^2r ӔwiniB[*"O5D;_7̒ R&W;|hj淶"kbF&&`]YgN{Ǚa "140nR1soz⯚ ,6szNA򓏡{TIh"u,峗^aM t Y|ϳ$ /WXl/+0J)+)--!J |ukǴ%K2rjjj^ܹ};<,EEO}1uV끩4v2 !>yU#jhjD*FGF-yzd:&/3ClwS[SMCCf||CuMkp]@0t%uD"D"XlomE2|X<=}XW-?v?TVWR@<>OTf,\ȑnrős6浶rpFQR!x1K-JD Er=oEfMDOwqc|/gh6-S$S^Je9 ߺ;Vg h3Y,LJ%-\ȵ$/!aϯu֟xڹcB[[&٬M2$!p+Wb[wtPWFB'$Mk>2i0eo$ϒM<\W148w6|8tbP$3w<5t]es=3fmz>v9[ȄC>ItD— YF'q]Ou ***%1 UW-))EdD<8(G:.{ .rQ|K)p^9UKkƴ)O5@y7/n{Le3܇WMo4ᵜSM ibZi ]g=J $JQ]SC*dk]Tir.i%)XԥW:y*&x\+0O E,V۞F=Wv1:: P`(H8р1yp iR)|/"1 FGA/4!>4Nz_MxY~o)ήf5H%1>- @:c~w*BmQ2<Cߢ9tv摇 (++uAUՔ}Gj;##t]3 AL#&3kŭi%®@_yG-ޅ$C~-rjQ*bxpm U- f1Tأiץ,"S^QA$`0ttRRN+C7tKvJI" ]3Ph+`DT4\E)5?4b;n>n)$C{C9|ү53{|'d<3qw8xÃd3_ exunE3rz`Z\@WJ4M➚O9:iRf%&ERH墤U$:M2;N .W':mΛwN $}}|mwCKKw93+" @Z-)p悾`;7h_;z4ED*`yJ$/R>_(Us)?o}rf- ƅwR˂kW5~Hu36AG%3#[bI{{;L8 Mu-`"XZnIy>l\(ڶ9$<0|W~_2>^ I_KȲ X4z|4 Jia[ZUl7_PRdg>͂FICސIoқ=l/Z^UR\br'_s`,^l3TOmL722L&0LL$ q]D"qV\żV̝c;di4M066eY+OeLjf>׽e]湖T6yaiP{+ȇQ$|fwY, ӟ0MB2 %b6TLf u]:&'H%D".316i-;A foHMZO|P >IXӟVEygRϖՋ$Zn|8gx,J4:l)T*iat[i180@ֶ9#|gUz?nZFъvhӋS['azʾ>C- l Hۢ9uIEE9sc%D"a(=Gx酝d٣M&QH디|122J<`n]W˭j5/^~/Hbd!7oO s WSxVo1. ,qԙyu膎 ˄?68 ={(P鸄g+qi`qKtz$;9yοKWH|Е?έ^tw3?m'cC/RһfL3%%yl& t!rqػg-#GD"H% G"X2N8fE/Y~S$qD\V* e,WTR,\!28)@Aͳ:_RZVMTT*Ev@::A) àҲ2@i#rZ"P\$<3׈@Ƀ<5 ŽT<ӎxn\8+a%*%7U5K !laY&8װdpp9 ,m3!7t݋7%9e:.7$AN'|БUGNQdqU+ϙ9\\Z[x'o_qqi;8s۷cyu'd"I S~:O:٫&&!niɂO8=Ps!@țR32K} w/3Y9v2vvz۞0tV!WHw.`xp>^LIY##äINh.gyYT.(ӷ4}-G\#4"ԱcPWkp9ydd2`x<ڀ>VU:ƴL9tp?V²,L+@yY){3g|StBy*SjUeɜujyNE+T>kv"o2 Kc:O?JzeEJpr<}8ѱQ\%BNҋ/0cP@0y,k2Ks*g*[7]gZ뢘s|Iŵ,:GN8p_طwV ***fA[}?8J WJetwu %\=v#D}$ҹfd-ZĻ~3?_Åq 㦄`#|.OV@mla ZzB:'%dz% [_x7 Zy-@=<zp-/~~܆wsם^ىt]ΝGWgtt*U0MkY<|`70gN)BFf*#fhDtL ;n総>a춧EI8؎7*翨N?L<$DNJJJg`$dU=RZVNww۟~N4] iL&! 8 a6˕͐L GQZZ6bb|~/$ .be֢hΡD';˿C$}` $w(T@h\ ij!\RaZ<{yM@P(D8Rao7;gL²,}7ƆFG!z Lӛ 464q4! .$H306D OQ=oJBn)V@^)i-0P@0L 2-mO=35i"(mܳy-3TP ?chcۘO !6P(/NmABJKT\o& Jͥ&R4#̙3:r[+-(7DוBA9͗>?=7N^og3AΛGֶŢ0En?oCWtvr3#tnSP!E$ &ehp] 8{Owlҩtwg1LJRNcSpm2Ї"8e&c3HI qFEe@#)//gɒTTVL[ҕhFwgM>_Լ=Wjd8v2щq8LG{;XM-AII)uu p=wm[6z#WBhTTT Ia2gtdX,F,% H%dJ?A MtrU>uJ)BLf!^ݽͷCLNN"B06:B˜?'zη]ר+WQV^l6v6c  2::iYQQYIeE%eW=wo0tX`i ))-ptt4>KAyy9i`k?(׵ZbضMlbX,@?݌"]9U7z;cRRZFuuB ] (<U}j(~/{+.z%j '2g.H}{ٷo?I}ڷ Ԍ[V1u04Mz{y癌0- $o#9kӹʲ,Lf5I',^̊qo$۲=Elb 9B_dr~@_VUqIUPW05 ($x$b$۞ϗ'nf[  ځ<IENDB`eq10q-2.2/gui/knobs/fader_white.png0000644000175000001440000000060213023240631016546 0ustar sapistausersPNG  IHDR/Q`sRGBbKGD pHYs  tIME!,IDATXM@75IŢ$¶wt8DU:e'l$42kHCx<)ͦhÕyxxxͦ8  sãNW*Uw[ιr4 z%eG1ʇQb1/nwL4zWu=?A;O ]pZiN7%_ﹾW,xt+NvIENDB`eq10q-2.2/gui/knobs/fader_dark.png0000644000175000001440000000241613023240631016354 0ustar sapistausersPNG  IHDR&pbKGD pHYs$$P$tIME 5][lIDAT8˽[Ѥ:X![3#Th)^&()҂4El'3fvgyӋiw`:gѕLC̈|@ ]dy }U-faf% dt׉k6jfVMEͭ`Ð=y6o0D0QSZDqUI+x4Nuv{\Pe/P䔀$ugw.VV Z q[iK׿8kkuUΰnYV=uzG x+-dJx啷.?wbCq9:50޺'#  7GhtɓkY'Rf 88<лFvCUD9f 2qφB_?P(ϿN/_̇!9dQMNJ";?t:@PuK 99`C5?ӛWt6=ro7C^ jUQ\uCnf;9-uݷ aUT5DPX]/o8BTb~hďNٕGbJ2DPU3}xwKl7k3"\k5umCFzٳ?vd]JuC*9wd f*,V H*l5`X6M0 %U&we0n_uQWmdk+-םEM}IENDB`eq10q-2.2/gui/knobs/knob2_32px.png0000644000175000001440000000606413023240631016164 0ustar sapistausersPNG  IHDR szzbKGD pHYs  tIME $S IDATXÅ{t\usνw4#i~ZlIel$`1eVIZ"iCVCVHʫ)ԥ+i #j?x 2`,[m-4h^?FPhku|uxl^7,b*L\UD"PZZ7`0_;l?ޞ (GqUW_sض:/1Wm4.\ =Sv.%4ZHJ3w嵆Gÿ;zx[4nn^ ,LR'۵3pӻ^@K˅:tu^M7m7 Ssexd':BDMF2n|;z}*g=}s=SO>Mضgee[PP{㾩He+t]c\풊i; ]s=X3{7m^WQYO&Mb;gΤȴ>ؾw4(..Yn%TWW Vb<]]m] VWPiX~hZiB>.陼{+*9ٱb\q&zkH֎~цcc.Z#wdSp5rD;sswZ<8I6/T48896C{ll^H) B)JBX P$S~t7pp[&Bܲ>Һ?HeҥnU[8^4̩0J 2( -l i`+>S_;m{(+㍱#H$s̩WO7-~`pEYE~_m;{g{)#BZ¶A)vbXNrۃ/ׄFbSQ^F" N_m T|J54.Xs ێꁷxx*R4RIp(ScQ}$ÿbxN1(%Lh%( /p%TrVuMN !ۂLX! AJʶ;RNdHrӅ+]i܋웘 0J'#7US+.3$''' &w*,0@.#DR), i+ eaKz.!w[?iE`V,2klα£a3R[;W-nRH R R(F’#ps WSK0/ ݄8H0"IY LNֻo366Jeuu^:dя8q W_+b4v ґ٢- xk;97H*gy;: c0a 13ID̫g&c)e!ӥH1LKd %Z ў`PZhmT(JeSݨ2@ $d_)TI%c;288ʲp,#14nE9"^ 2`$F @c1U+)c떫4mG䣏ϋ L|'{֕ t5Әd BH 01ѸZS㧩qu3<;0L&s|5+`Aa#Ali2.33u`@" b,\өi.Z1fΧ!'IKIu?ҍ[E'ɩ$!ܴs5Fkk0 &{<a5KEnY՜n?NO 'ٶTGg'qSTѺnHQ-0ip3ihgMng_`ټhڨEEE_.L:>Gj78~enQ'hLڀa԰~nNtCetxxh8{^~ɧ{.;Vfҩ>;0%Xf5gxSxTlw3Ȃ%U_Y''g[<0vlrsp hd29|]C3t_n;<#p a&}[!/XDR944.RȡΎOFFF-\xee婻r~p|i+Wч^gλU$񍍅yui"\וT*ut@۷g?Wb媢hLA5IENDB`eq10q-2.2/gui/knobs/knob2_25px.png0000644000175000001440000000412013023240631016155 0ustar sapistausersPNG  IHDRcbKGD pHYs  tIME+\JoIDATH]Ypog''!!IE( U;vl;M[m,ÔjENJ,Z\;(4$BYd1;YIvNr"yoy/^#>gc`h'NUM*V@0tӧG7׬=]5e{;0pϽP3+g~IICYqq(EkʪBw*=u Z0o!/25~L&W\.,pE7Ԭ-Rvpp+' ) )+[[[Įe 6??񓇤jX^1O`L)_I:Cdr.>o2ϴrep}L F}qt@Xa.[mdMFi5###ۼ]\{h0L&x<"fkoK()-&240@kksd-K5طFgg'ZoL.ZŮ+x A8x`Ǚ芏R m2+Mzx̫ knfëp΢jH)KJ& tw=FYRRZYMhu-8aj -mMIn<]i>m37oO"s1GTϘAwו[B2HLqaKtd# Dj, 7?/F0H%݃C2TUUalCy]c̽yͣ a;aSg~8*FH9$ " Quu< XEofӧ-ޅ Ù&mI7( -|p޴E(@%_+1dIb efFdR.*C @( fWTr#BEHB$%y^\DJ7+Ȧ]TNMlV0rBrBjt6ME8yL}=֐f59S ʸ*2F#@hpsVhȹ95+OX} i50?I y%K S Ώrɡ2 N(AiP@,ߙaUYK ƧTL2sf#ҲQi Ο?7M]ҕӤR \YvZk.BO4J!U9.Cy6M4蓱ן~I pĉHqҲ\:ǍcIH"Βθh'd$s)*B|of%TW!`Ͼ?xxZ߽ `P_w[+0\՞ʎ~>px|$6mhl(ț4iKig.]`/__aED{{%j:WPw=Db11> yǗ_e2Dr<O'LOxWO,X(aF]IENDB`eq10q-2.2/gui/knobs/knob_bassup_165px.png0000644000175000001440000010234713023240631017547 0ustar sapistausersPNG  IHDR=+=bKGD pHYs  tIME%) IDATxylYTfwF1 c6c{x0`"p8f<!Il1jmh][+3r=7YYuD:sym'N'Nqk'm:I4!B"Dj!D\DQDE!Wզ˵y,oSS^C7N !~QS*P1B&@M(+A˵??SAmi)_7.hfΝRt1lNY4M#B4MV&@D-# IX1`B)Ea("r'MM}422#֩-/ fLj?_o:@ȇKf)oLzeY0ӆaJ)R C|>_"2uDT!$12Rat|juL6eZHM`*&Uz~ٌ]ץE4MLN3ӷD~ZwOl<={O ѱ`΁k׮! 5G5tƢ(B I&<2$Eҩ4BJT ]J upv[m+ < ؽ{ŅnE/>'>~@RJ-~wōHf)6ô&R2-뭦e^RGPu廞jܦ^np\ QQCS$r-ّO]7E "L" $u ]u00t00- C7tM+ ܼqF?zRVFFEVOş'ȏoo 'O?hRʫaBF f0{w>5KWJR5oi~y]vɇ~Si\uVDӦ^Bq@H%$qR 4]G4&ѴwEĜJ(03$щb(<%| RA@ۥnPDӴP(L +\*9w~wrmێrR HzRNwxo{tR~iGw4ǩRVI3*Rzz=n鰲Rgyiq(躎L@׷lib&eI*zύV&%ƠV 4MOӑRM4)R $}Ujet"NP(RD*EM_50 sJy{M'џBE*(A?@V~vs'~JMf)s!$~$0+OvڙR$8ȃ'O{{kW}͟kF]u:mR(@<⿠?_ZLy]RJʷm߳wonR4M0bn~qDQ" IRDZeӦ F>o06>ǩ ~$?R 5-CUL.OgI"G Hw!DjHT\I "BH:++i.`@Ԩ%5Mc&R vٻ=:6n,qUnݼ!fn~((YRV(??Xƾ18㚦YRJ}0B)\*BEң0, tJmT4iEJJ)l;E*fiqՕ( 2|O̅a8aWq˃O~cﬥ|O0'TPOca~,aE,8?<@0㪈njIciWc :0 ?u](L!=N c`9C b'@#.eQVط{%li4VՖY^ZdqaE:NEaievc0>1$AL&#vE\::kWzڲp\T땊 !ijJO}+mNF*zRi}\z uH39ejAl|?o5A% uv-,"q ǥ!i0>>FGa`톈(= 8"W2Yea\\Ol=|i81gݩT0 .t]GJU" - Bu||Tr(-E Z\38NӉE2zFgrrC[/A%4J !E(X2Y `AbG.^>tv{ \(v3IB̷L\.7RAKbrB!T" 6P5A6# [ E:0 |Y)u %{퓓}u]4}U]I)2,b EZ$`ЉyJ!u ;"R,)/dҤiR)ۊyDA$G1=}&ıf\R T M蚌ҤP"N0q=z 82l]j.0#\/x |>OZ%Nq ~6l%nԖ=W~+:/ybLJ?T*x&L;,zHMTRaRKE'&eZ!|\͛,-.8=۶IdsYhY# Svw~oNutq0 (XYij"LTBHuJutjJT$IaDy>^fGceգt^B+9< ]M]?FD& G?34eJ)3}R('p'M.Jd-IƔ, KJ"D 2Jqp(ФmXTe'quRcJb˴8=Q[^҅ik4Ms}[$:?S?#~~up o}G3̻.bj&WA!,b8S۶3958r&2i&&W}Q.TTF)) 3yVUL{\vg3Kեڣhw:=pynf :^56Z{}!:`hW ؾBRR64V0r80M(@~*)+BŕiyߡǠv;ZM5jg[a@ J|@^cuuiB/Jٳ]0}2iB$XImƶ;( $ ڭ.zϮ~܏p2Nix=A$G+\XP. 6 Oڳ\3_?B|Hb,cj?i l: caaLII6e||bqڐ,H`U_{8Z-fgn3;sn|^ܳ6ů\w]GGFF311\.i(vlktdJeǙb%m P&v*Ou)dRyGgf2Z_v6ŀ\ /PV< K7/3FEez URQ$"(~EG_~HklΤ"+lo'-)+eP*VcOd239D]Atmg}9+ ma@TO311}i[a0Mn JQ.ڽBN#eg>R$ḇ#DQ.벲`fɥ-]K7; Z1ܐ77k.z(RkI*  J-AW[e.C%L>jX^1f|2Y; #_ȣi:3upOٷR L߼,//vJ5qҥݠIwbOT(JḮ @A&uL&SSO'5hĝ`.c(Vgzå%m|kW/̴op+7^bJ 0h8I&ZA!.hVѪ{kԺ9|.OX&/`FAZB+6Ce D9:++ufn+,/->\1 [a@ML'IN~V۷i<4J0 0 1 3rRXhjp;*RDQh6[_2&% ǀj!EڋThdԚPdH~GkE.y^*#UvN 6 BCҶ;Kt:-=}[7i6WJ[R<}?{œO7oٶ}۶o qMWI-;V((V[S,m+\Opi:,37pkeE Nb &Wi&eC&k;րP2(5&T #0=K35t:e˵zbj(Q:KKܺyAa'AJ&po%( 0>1L6 ձ11N6F0=M.][+7.6Va?!f [ԳF wS=O.1iVcu-ɂD]bLjs${mZF[ʡ2$ wՠJ<*eiD0P:)(?7Kmbƍ;z}Б&lNHr9ߏ:z {tݸ}!H=BRXG-*o'_|'XgY7ZD!V[M%$U%7RmpAq(BM㝏ێQbbáG z`L|ZYi0?jsN}ePB54M/+v{ٗ^[a)?Ϯ۶mL6jUr )n.?7J'2X8WwޛXǭ@:a?N %@kqma4wU2<o=\.ͤ@PEz>*+[-(¶l:Ŵ,t:mR(5MF)&Ik]8lKi!? qz=VWZM<8LӲS(V@FQ7BQ4ͿQW8qұS)mds9zE# Dvu{ahF&a(fL+w=xT޶H fS4 0<ףDy˧t?~GS̤n O> _ӂWI|s,\nkSA%E6!Zeg`L7)88s {O0R)Ĭg<2(p=VsF*l&K.CJI,-.*a0(;R_/fyyUwS{M?z;5 CVl6mtz]|KTj@ڶ;8|쥘Ih3ُOpunȕ;f@XQdwKty׭m(!~Rmeג_B=3<~GNǯfQ\F:+^\5 tM GɄӲ0f$Ϳy-VCӴwIMJiAꍆz B':N<). HeҌr~9B!xmϜ \ZN(7-LFj *h8r1TCtOԵ\o6+ /`%,ٝ9}A a|?,N*B++y:C?n b*,[trb|]B#2o2 IDATɺa'db?/ȯ-G;{+'d:5wXADeyK_ g?ϭyƲli%=LӌKm'A zNՕ|C !ҙ |\>^;9>|[Svꨦi?P:}떰ia&RBs\ܤczڗT*ٻ2Rsܜ3g oc(N{51Fy\ Ѻn_䯃Xb>=N=Xut}rֿ% #<ף^s^t/C:%SQH"bCo#B`b 󘝽?B *BӴ ?›O\?y+5{r-!Ddh:R]aYqs~QJ]#t]g|jCs>Fezř:?zzB|Y'#R߾MyIw| ff8+gpI8iD3B ZkMĺPmL:L(G0MٟG~P7)cґBZ;# ӌ{#06 Uӹ;wLO">wi ..?{P<ۣ)CY,zK"bj{DEjROf)9;H/ܧ3P /~~q ׯr -lUm!!Fl1(uxKVcaavJŮ=BVt:Xm/3A4 ׽1_U~a;H-FPdbjRL͛,.,sTسo/a83W'se.U*fUI= FM&am-nTTOI:Oe6V9N:ury+z[E J)/`6/_gJ_ Yniɷ;Ț6W뱲`uu9h6WV -h/4,ǩT.\P4PcΜu !t@ B)9&&&ػw,//P4 &ط?ۧ-]I>`3)*1%.\l YH v z{M3 c+9cc.ٱ+'+9;!|5Ducύ<{ޠ ׁȨzv= f6[ಸh4B`ٱrVGryS?ZG~ǫTѨ;.\Z'N>eϤ3#VRJ-џ}N>ʶ;(WF(JT*Ur&*x珮t5k#.̂n&r2˕Q,OǕ}*%ܗ;e;Z|"[#lQMo{N>F!jnF0dfz_2WA_IGҕ mݤ,^1?77h[-!0 Ӳ ELw)d{gnO{ުRSZSJI!e%@je[J%F↯RNaHt6xFRZpeo%O~T=[.Wb4f?6Tl Vu9 ՚{e 9"}}T(* :,,,r9μ|YK0r*>?Jz Rvd@3SH+c(Jr:p$r bEjrziaqʍd.oeY>*L;fLMmc||l.LB h@\$MSʦH^Թi.\i20nzV+7b (2TI,h VZEc9R}6&aƩ?s|:+m]gYt.E&BDJ%\|pZe2?_ZX$:CvСiL HvN %&mRi1eEqR4f<ㄼ8}^Kn.+Zo-ʷ,%|(ʝ!ePpR %rj ;ΝX)}+ A\K^ 7VE{PRc\!Lw+3-/Rqx @4A`&;@4(ˌOv'}SNR{oHS=IZ0#NTF\B)aSBug|_RwnnM`ߕol* Jq6o= ޽bM^8G~UBr|yVZ,XyIAuHVqXErk7n칋 @.%U9C&Y#+!^tFQ<(R(Rz=LKQb;e϶[>{f}ۻߥiZCRj#4#v͎]N8aȟyW8,5ߏ ^2ΐFR Z&%ϣBm0ψ}oz8T}[Z=Ϟ1i.##ej")zޠ/ C|r5Mngռd@tsv~~9x3e l,o |Pԗ\r/=J1an͕+\[Iym^EDQY ֔>j(W%: VA6sxn^1A.FJK'}.\rOsyvmA (w!:+wMڡK9\.Q-q :NeAيuBSJUTꭚƫNt]ەBXBjteqgbpz=z21ϳY & q/ꕓQgfDe@OKC=7h@/$:0{943B7CƓ-:^>ϋ`MkPn?ڌ^KXTT,<)A&ϑf u3AijKT:YChZI6oAjPܵQJym%+mɌqMj y/l8J2l:Wxz)n6}Z{=_Cn0ѝ-6뺶D,"{Ʀx>$+E^{py͕&x%^ro c^2ܐm{[EЋGi.>Oc<"jZPN8spxQnRr%s];ݶc*yZ? "u3>Ԇ}^A-N{9Ј&DuvcHN/]/\Kt+/Žk`ަ-Lÿ{Yg{Al-KE8x|@eJ\&Bj˵dVd6SәAs=-eҩs: /Y+'i2ĩtQ&1חsvVo~^ƑrgݨcwĒ[hD L!N8ɃNPĢ=,J?㱼̙ //puq?`sGGbs7O{dj WsFq ,3D4##/#iɪj= Ntڭ9vמ;Ofi3, , p |wMµ1 o1+:,{iwNRHVCQA7-VVWq2v;Nt`P/z[f4x@狆i6 #m&e(D_C>xTqDeTU*4קWXXtߥf-xedFڢfjgjش`) Ɂ}yٳk;vX7uw5XIWE^qsW/yPjݽ!n+b+NFIT,tV#brl.?( %z}[2Uń!iMNK!TЍB8aDF]uR ]R ,;\`эHm@k .b):M_7ElpцEC>JC)tsQ*xQRInVr?Kz/ճ,QJ`d96w˶ՆsY(a==Z = I:mcZ)zxt&MXb~~n6HCRUTpDѣ]67Rl.f`x1I<@?8|0\էq/;|kP%6X?z+y8+j>bYp~}J)fsIלy6G 2QU~[녹ja.yl@AFyl[}" ˆ6pE7F!f7\܂*,$wɬW[*Ix}][f\D vyZK\Kg2rydܸG53 vs (dǞO3\.T9$ ;xK,/K~rݰXmuXXcs luB+ ԝ u볍N2X`ɀ#xq= R(%csa(?0s/^zۍx2*ۀl@U+bl 0f2]c[ WQ4ОFL&mۃ]ȸ L ŦrrjaV0 Q(=( KkF*&W bޤ6e,tY?kG݅JhCnz(V yUoֻ Rya|4?G8}A\ DhQظD_)K|՗a5ՈPFVEMu/]åG\:w#\OjpqBc²lLÌ:C˧ .hJ0̬a5)E:"(?Ʉ]3#0M,|t:G,[6B_/ ]kbsZQGe+%iJHRE! 5.n:,-_zW6Jfض)PRV0 l.K&0MznbEH%f& RKJ~ߍL^ #P Ȑl(S;صkB6nAޤֿ!Ne~i/]NxwJP~F/)qkQߤBR>Op^2Lz6R 0?7Ǖ7x:׮h(v!wےG܏nnYڂ )ݐVc!"I^tgMdˮsr|o~W&jPIUR Zm!2n mLYvƌmw $@IRJ%<Ɲ9{FdDdSiv*e w>{J P(Pp2FYVS"IPNK! ÃҴ…XHQ (H 㤦RJ(0M펏V!sߡDa[/-eɜ I*vBWRxcEr&@*axM,ŝwOߏ#KGtcv+&u!jC^DžK"Eb7]F2r;}AN8Asaz쯖P.c H䫻,TQZDC2T8^Gހ}hja""jPІfAp . (l1&mXc0̵aОMu7犆kqj${8t GwTJFk[x˯b˿6b]5 NG}pե^Qb Ty.0V @^*-hH:[t:!R( ?Qo49w fGp FqqT77j3.CGvIwUAC";7Q"]δ 8)q[_`j  IdM\tϾp/\y`-Q~I< IDAT#R!䨮{p*o!$lMlnb{kd\4ut<RJMנ:lˆZVvO J!9ڭ]8>xj&nX 0!ǡ%=~ N hPoA,w+fdW^$>c#3MrQc[vlcqq 7| go h~PѢ FV Sp$8D04 ^XՀfb餎LL°X'zJJaHfxgW͈SJU_1?%n0 swM{F -VHy7 FQ_WP -rvlePJć=ϽR Cf@ 3X\Z$ Q(!DԊu^y61 9*p5ΆF< i!y,B$#McJ{wn)Iw$\xsxR+^L7T$^Pg1a8~oC ";y˸ܾ<]86LˀL %_Up}s Ϣa{0Coc|tݎ *$;T %J.GR FRҠrd03ɀE)!cB~3P|ZAzm%|SxuZgi(# h>G]d^,IViEzI.{VAWZڂ2)z$c`cֈ)]KF$dKb}wOAU1e* @{ 3h #acvnRLct|M`r(C:,̌dL Cқ)YRQUzKo45:A .8iTݙ1Ȅܙ_}u? < ${9Y;LEO}9H/IP :GSB1YC})u6n;s'EXBZë/m\hu j#U8l{y8Oq sPX5lIҗt{q )w&IP)1RB6I>+2Q0M)$TbAqT-%}]t6`6<:zUmr Q/mM-LN67v]_&{æX "9g;(@ A&n1 -冫@2arYTiP׻Qz1JMiYk0c'1'w8&&aQ0 CWN1b טsEw;qP&.]ic[Ǹp8 ` M`}c \i)ux1G0?f٤h>ARф?0N17RQfBH֝GsBB؈htPBv'14T*>@4ɺcGq844 E-eً#f"F5S2K&ӤbCh@ !Jm:8#DKظ~2x U1i``(p]'$*ၮ]adh,S0MSъja;|e-`0 ,Á1AO^j%Š.k!C&174M @4 ѓ/ywv?Q0 A 1( "X$S?W79Q<E#2}۶177۶ARffA E0 XšW8؋Sbi%bu27&mq/{dfd$) 1_#n2߈P(Rq(zJ8B js]t:^Q! #&p9`>*SiʤP빉_4j5Q *}QF >iX pКtma\SCNz$?E_@ SUC2t)2 Y=1d&AyaVLSXoD GA ,B\488Bp~fގJ*@E GP8OBIȘ$Y D7ȶp.t|Dq(&OXhv#dɀļ6la$mfDo''Kˬ%>5_S$vr8= (E!HsjE.zj<ހ"+sz#!G방2 1AG=&,3E8 J Ac,Sk+u m#(wj5x{Ri(qT)d*8i( xhh{.(Bq:)}jp4P: HJsJwUHSK\IΨTν;9h"4rY7v8 e(z B7`jP[!1y|(c0 u!d(1&u sp4Z bVvtjb`v4= R^MD/QjȜ0jxrH)3:ᩲ nG!Q˺tr>մifIK&Eؖ鹧Vۆ+ rJn2őaJI)C$(vE)]SG6Pykg sJ ! !|:PW a8[pO?/Q'NߥbF%}1o?kgILauhI=ٻ^ZYaw.3=h) Q-a,%X]};;y)I{N0eC+4ί̦Ad~y / Suq!H0JT[޾A''>|H*r8򌎣KӘ,R޵jxGFBFI5RzqOq<0Sa٨lE8xSԞd i-ɂdZNLJEl*1CMDM }L9p7'2}\@>`s 9H, ^~-?3a G ݇7<caMh|p)BylẞbnB)Rg򙧿ҩSꡇyWE?`"l\W T2uL;&Jf !MQ QiIlrЏDthOM%WAynsGNz^%l5{d3um%d/t؅CFcчgC34D*ݍaz* ?3FQvhl wBp֗;f|\+($ˏ/_~Jfu])BF(Qbn$LK)E%PضC!M8\to 2X*ّd44'rňvʽr "/Bʾ@$a̒"9ڏOGpmmۛv*VWm,,,bvnRJ4u4u#H/]M'_|C?K%hB4ý6CL0ȓe߼?WC&W6{+?}꽒A]U: 9tD!t49yPF8T(㎣8<= Vau:_GC ( 1q? meyb3!(e_B"'00M%abFin*@`;&u:8Ⱦ=  P=$IkG56>hv&R^c:حTz[zmfKhNaG1 0֨02(7774MӋ2,>]ӥ繤ljify=[Xk Vp18$ŴQ@N [Qb!}y'z)i|t6ɱU3kE/(JPB88`90̜-y6!(J\dڪv"N ÐH~Q pPZm]?C)BVh5<efRB! 0-Б:DQ2,8-N2[G A2}S0S݃[yG12 ,Hg"Z=fP{Nř#aY󰶶n%;) TJe- &V&B'֢(<|{Kb]4??11Qk{*;j0y2QF 5D "cĐaT`K.FU, Y 3FN<$9g"#&=)6b|%.>*[>pq|Û?)x嗰Xb鶂qT4Q,P,i ]J/ܯ^8R/1F|챷xOfggn.juz2)_gB ".i/|7k&.} #/@A,sӎQΦ 1q8~C .z K4\n$K͝(1((O(E8̳+ xO|W Ji& azu'&195))%u0-FH1Gv@k [t4^Snǝe,ϛCqEr5$z|_l'PlqqKO rn9F8z €͍mm`wgAB5w5X1Iic [ժEy)}A8VMޢ(2!Ӕ0?HvƂsVMСE\%Q`Z fKq+| [0h/>Zעei2c}ըl%< `4Qc(;*:WVNFH|t]OtUP* [iDBƔ- `{wyR2vJ_S'agk ;srl Dt]܌`H 7FܜGgT+N7o$ .p+}S"rвY`n2B?(Ynx#P Ƥ?Vj 3'0^:`}sW/_BVU+Ɛ%o31gLSy )D}n~W>W_=3ΟJ U)G u)e$ /ˤhZTvf nfWArH3"n2av,텹EQ{d7{BN+dx<^[A?pQ0Q n9sLLmw ĝGNdzk؄v{B(`-95NR$"<6erw=yjo8ΧMlBI^!92i`TyZ C:nKTMT :QQ #7Nɺ"5鹟!bw#E.~ !ӟG0Q`nw?,(Gb*7'xo]\K( 3t@t P똞ndu:VWx9z܍/=4}o1K2%cRB :v-lmn`ff B!0 IDATݝm,_GmC84Mˈ# h87o#H4CQ9q@_ ָߔ(Efbt?(?(K.bsc#B$"A'M5]e@Rbl|tVR /=tϟabJ)3H@ LewgG\x{?w¶,[NO(x2!tveng&G XMP曧!PkZDW䰝14V.IrWn{+2#U嫸ꫨI>P}R2N- alNDxka~7>.\fA'OqRǤ'D(o= q mcssòlAll! B8S!8:B<`s2L>2~[Ar~~7IdHtמmEV4@ En!NuMKɩ) .oZ?rZK{ =it>ٿy+8.QJ)c B1Y۶Q*a0MGZE,Oxjn@MLMYSdX0νӚfO;,c'C~-PEǙY Rb d>z/{?ǽԴR8}ۢX(jZXt|*\(HRa(777s/yZrLe]no3Mi iJ۲IXnBxeV,&'89oC%x3 WZhynҳ=/g`sc*K[g*_}J$'xݱgߍןG@^ aA;d" CP u*xKZS;;ժb_͝WWV֖_Qub΢P(A7tpPFɾ0@4eò)q[k#$vY0;D25wx&KbĴ |>W}mo8{3¡ hUb !$0Fl^bgk +ױV( HbVE?oV+=(}Sի xÃM35=3k&ɞ8c,3yrˏ^9G{H)a:lA(@"I!٦w(\</O~!g?i99eq2tlL.SϾm88 Ӡ#0p.7 4J>!Hh5jsmNnrbV7oӴ%%l'28- s]Ń1I<}AXՊsg /_R"F"/|A) Iv"{%!ƠlGdq:QE=$(m ;7zwa,ld!8p]FfZ׮b5jUtRH|(B4 ۲Ppt :QMR@(8J$ Ԗy)A `93"eCk~eIowy'!&QolvT'mీ)V67ֱ6y9G??By乯|_~KHP.l6Q(cǡ ID"$x*̨\JfCmKPiSG3O`Kl-w4;9c_=\Ӵ';A%Ȑt(' JZf;xևz%Tx+X]YE!B Q^ojh`scױu3א*Ą_/Vnꇯ& MMπPZ(`Rry @&!Q#c;X89X]3`Q:51 I9 [h [FUč3#Ec'_ino80rxoBI/b{w//ՕeԪU>;EmPV5Tr"H)$a"~#&^VK/n/,Bܶ )%48%5,8V^}a4LNMaqq(K`9łGqg &vІf;z#05ȄH-ɸala~ѨNc|o[ę[0?7 X^ë^p6LS0VRmGqVp!%a})0 c0K]i'*7m~r[#zX8e#owz/>'A .?UԪUq ]וnB$Ϻ0 %%iF'5d}e$x_|״Hj]۶(Zdńfyv)EX'0p4Z‰JM8ժa`: fh9Xp GQ4"C MTK,tu8Sq'3%Qn>#_>{W eafvs_$  ]@p=vz;naֱn~knw7Jۑ&,Tkج;uH$AS J$ C@/[K'0y;f19T,-hZ j^zW\\c [(פ1 n 1}x)/}}='~ɯʿg0F;a~1ϋV k++\z tejbe:*;hj&DuPP.1Q.\Dq`ҙD&X Uii4d) C8dc9]!&ȅ{3I.QA1-&1C0&a:lKW%lreg1Q.9piA74 ӔZgY&e]J@wMSyj*a2KC7 !I<F/H?qg|D~)#>/ 2FKTn`bj 8q$ b6r2zF-4eJеT,arjssJIlۂ̽ 8#bQN 8@Xc/5ԃ% UPCM9Sa)CPCT%lBq\ 4%  łc2tx_2Mcri,VlbU\x"*D \%+۶Ii*?T-)!aYl眷6_]nJFŅ|#G}(}]Rʻ^~2YM# 8FՂi}?3<321G*ZBRBv`6lˆe80t^$@˜# "αDM DE5@$Pi: ` e0I'0ɦQd% aLX f꠺Rc!!a_X붰&Z 2)۲av64- sXH =cOaqg M)ۛy ?:4C1@nf쩬yc@d^B"RsJn݄i˴joRrΡX*4$ClԖ2֥-QCA/ 6 }Gl69 Q,ahݿ'-_$VE!0MevX 4%vk:l[繨jW5~'7C5BZzE) Pub\E ]ױta)Ԧy 3@=Fvf,Q(WdyJ1,[4K%$`S(J! x~[ PaLleǁip]k w#eohPG#'?7xy쭚 !w!hB&Ӆ(v\NT3 =41%# ") cp!N)붠iH]Xe"YI;6 jaRJkJˁtz.*mbn~PpF{\(.jE` z;[<`&Pv@a6aZe2;#\/>_3_UY~#nyS/\B KXEQR*%r3 b(O#HHQd}jdjT*1?Y؎(HW;ЂJ*3GQeˈi&G:$=F>'[*P45TU3JfwNUl4Ш+Gfv RDK2Gg D7`ۖ,0 juSq4Ot|ONL~{P(NBN_pQ`ie)`Z&LF%޷s٪h*A9#Q|`Y&J2P.AM=N4 i*ewwpyaqT,\ݙMckoZFZm6Z&ZmZZ jFv s) lHK*+lMO3eBNJW+'?[)S?>˿~ϒ Q/=TG]_R,G -Ȥ.% 0F`2q}_I& !"ŜtMX"i`mT$e@Jw:QjQ$ >"I.LoX]Y Z&ZZܶNC)1Y 0MSSS( Dc|͍u!.Cyy2˖߬*(?q o#Oʿ_? ixcewBO@"BJ%V@pD[w:\Q~h0 [ě2ەLa#Yt PS%=Z>=Zi!wwp)uj d>NXdɖmW/bMc0 Ml~|?|+Ϻ=^'#˿~_n} ѷ? )es~jwwM<95=R 0@("$N"eKkN9|߇Y1;[3ϠX*e]iٗ+۱:j*9 ERz]Zjf4U@N 60` !7cQ=z7LӼq;F6ȷ['?=W]]ӎcFP|#$%TS5+%,'lsdvv(} LK}e 5՗]p`bWvq%\zB'()S, Hiе4a:x6& H]rMAӴضbK)>/?_Ϳg?c?N~7C~_5'or!>iZnm6?iᩩi%PJeE$ nMH.yrʊRD4/MK0AM%1`:,'1S)4SDtTiUM8\. イ -M~ŲWx0\yk[-#?_oCQ*yȑ4eBX DS`D^C^GBiDR9GQX@\ØDIDATS(q (m[ a](Q|ŴZ]lmmjfXg6J%VE<ǟz~&[%S?Rq ͍{w'lybbVBLP7"=%BJa( 3G\, H@w)E:L*)lz@CՄwGQR1kiBrի;W%G??'#9{cǎzTzt~~=;7NNOKiڭTv=q%bIRP$fg03;ɉI8B5>I`Z3qvjUT+Rie̕Da΋RO8'ַ 'Jmg2eky=⻳c'ȉ!"@K:B ϠGBH|u QC@ر}س/ !tDmV4y3Jecv/ٲ٨) 3==;H7IؿǦm 525-rҠt:0”ttaЋ_N {nc,_o//-/=Ng]+) z yee5TǿcԸlf{Riƕj !M,>|߽ Ҷ I!dx*:l69:tc(M$|52ٜ])WnܷrzU2"Ϗsf);Lw8YF)JP`YTk BH]k5pԶ'RwO^yZ};StNgdis%Jz]=J+0F!c JBpI\р>|qιgPP(OqM?qŶm$tZȤiJ0 J3N< )\"& Bh PJMs a8?ɀ҄Sngo۾of\R%a0 @R L P8v8Z..|߃P g@I ;3(R0 xT!DCI%eR\^{ިRZ>Cu߽߽{_sͮW\qDuN$mhx@Iy>>z fz¹H6p]0@eZA* (uZCCnͮaB񧯿o{Awobp.K3Y@BH! 㠒J)0f\'pfnݮfB!\>;aA+ qp9t]h簓 @!  JR*:J>'av!c9V.ӟk~iǎٛ.ٜN$l8@9RIh digh44ضm 1 TU yhB( RPJ2ӲaQ&Z_N\󪥷z PO33qǷǃTRIA<׃yp=@+D"L&NytA QTc6T*%( D L6Rbr ۆR pGdff2m4 _+ܬڴeM3O<&-OY7ܰ+{v__//) vp=s <8@H@@m#/ L8;)524n݌|!Q'RB(!fB<h }8.4,B6 /<q0^'iXDY%+6Joz˧j>/N׾[nD2et]t: ^Jq_ RR0^*ceeG=nA"ĦMS+@0j(!J"9P,P,\%v2f7^OqkGRE:Z32FY`,clc__\;[6o떝lyy >JR f?^J RAkhst rAcǰZ2ccETض . GJ )ثF \E2̦i 9+xG? 4qۭkPiDCJI 0dRzB)+皭{J̫:m˶_b2Z @ % @+Q jPJQ +@VVWAA*BTD*e pJy(e D\{|G-[͸y-`Dq,^a|f gJz'no}/X,t߷vU.WH*GɀP B@/s BknzaY*2`@s=AOQ]m#_q ׾/}gWqR`BZ !=Lm!>2 ht'nX,eP#̐*" 5=`CAJ D.CPa0y D|/@pxo='|1 wس{/aQo4BƋR6 k"Jޥ~bb?%J>i앙v w9W-v !ab}a ƐJ}3]^+h@J u09QA^99h. @!c=?f;wⓟ~ p~q$,Bр:iQ)5 I$t6[z駎j7t;! oA8С' }wZt@, ~98f3(0M_uoh#շS'{]jAQoq\}5ػdYA"Fbf"ùHZVJ{?_PTUWnff3v"俔l > %~.D!-xTRjH"^8Ν;o+h݁ۯyx[vf͛n@>tJ3%*@g֦yWavɀNTff篻n_P PZCFnɨ^ rr c1@#jI ݷr)8. sڝ.PtZaf2l߾m B4`(&3hZke );el޼y=>PP]X^aAJ)^!+}cV3?c=, ۶=N>-"^Dcv–[`&R 4,baٌR:5M!\opdۅ__d 5@( ygM z7(3i&'A:R=@)'AH8̦M;?K/;w+? ػw?Vkup{WTX 2>LD2x:0 5* ۶tw{O+v8H P2@ ]{:!$\ׅbc"=򮵎jvzpr $y{x9Gqynv4;Oq<@w&'JBM(8"af&ɦ(1iDuj}[o)}_~E!u|h1P." ] D!|924+ePJyJ{RF!}Ϊ5b=~X^^ia `Z)ԛ+eoz0-j HRmn*\ӴH>K&i6RJ̽g@~ :>^٩i[R$ Vُ:CbК@k ôLLMM"@2LrS_e/P0\>RcY 0PJE WR%$li q#-,_# eV+8<Пѷa',\s._Ԧ4-2Qy]tNut{U^G:T% )R괻/ h2|e|2Q*}6;$1g=]=CiJbc FGO ].ϣ٬G/7{>}7p]' î>(hhPB` bu4{<)Zk!HRX#LH$K ؎;T /v!Gǭ Rh免ONTC{C*Wp?I) |GP6žOHgqa05 p&(%ji/4ͫ[%zb)JaPQK#,/eh!D4d(aD^ w@G_@QSOOkv]^Op&F:^ LAJZ sh5Xl3PRN$Sӹ,J֬ h}#YAf0{r@ZZe>D5)n$!Q$ XV]W­Jbqy9LBgA.P}m%,$ `F\ e $94 $(!PZ✔:éL$ @(pI92+;m'lن vEހ&EFBǓ$Vk^@ 22R^SvM f`_7V*뮻c D2RIӔF4Iخb]ǖ-e&E>f. R Nr_?>RA醟QE4\LOY/j!bZǖI)%!p`̄HX̟muh4N-qU,+AE @ϞkPJF=cccV+u0 FsD@!V۶ݞPM񨵚)WV.,Ù\DQ0ZԵ p10mYwI33SDKzOe䮈o2%,4lmpM7pf cPJPXT4t8ØF \DžeZR0zZD(E*Zgy5! Ÿ8 AX^nrr\hfoYw$x9`"џc` cF݆z`ClqJ8HLJb`'a>l;tۖz< R&466JR;PF\kQc֫[YQ q¡2J5@zI'澃IG_.9%s}_N7h^p%H {'- ۶11YE&70)#Ĩu'.`u}aH@q灅$d8iRJ$cɤ]RJqFIhuD`0' 5DD_b>TuU(HBY2P!c^Oo=I+J1xϣ982 r A(zmBHF{7RFyuhݔQH"wn9+ϫ498&,e`ff<֭ 26Gzg ҆a^0tl ͺhG St4c Jhk4)PB8NTKk&-ru7"χ3AAhJPab2Cf4P!Q3L+s)#`jjdvGbON@N*o`iR 7BmX C<5_y1ZM8NoΞ=~DqVk5ԛo[h+.b NAΈoH1n^?1ҧFU ff!o[;6tMbFTő5hF VS/u\LNT;[ӛ6w}I7꾣 'BPB^4A+F^M+Dh((!!mۺmgN5{ը; .'/~mݺ}{6͒ND3Ixndi 0MTH}?j񮿈Ug-`TD푾y0i09sNcMo8'I6qH&SwDӁA4z]Hc| pgXZmv:I<&~F?n(!-V`tI}omʍnǎYHz;"՚2q6oh܈kgՃ(:]V 0*t$3h~_K(a1_ u.YYY;s}3 to'[l=u]lF g =c#¾v>X2 CRj`ʆZ#iKd_碔4VSj?|#4[+ݞ!;2n춭|v]ò3p #7( " Mi7 JjI&!H$L_;<ښ2:|xu,! n+ \0s_(1_؟;hZ`QMzU_xV:f d@k'Nz\s}BR^@K Yx(F<4$U<Vo<8 [|q5$6tBW'OKgKe7V33E{kM&E!R`,"!ؐz 'P`DDq4!@?3W]HN ({NHX87?_Ϟ?ygoh63 @JݭVBXPDE0Џ[JKfpN[ !hX/"Nj7QJ06VǏ%?C^yPmd :IPJH)K GlIDATRRlI!!Azh4Fʍa"tuB5 $9rzX+;ymT S7S Ef 4%$c`ixkv{vB9.ԁ\&deu 9~ؿYX8`^Ѕsu!TD66V c fx;JhV[o M oIntBEGqC؉uZ@> ˀH4ٳgO>߾q:y'.ckNn7 -ρ7%3`euU$XKTO^/^a |g~s郞@ļͳǎbt:64Y'}[Tڰ,2M e}OE|/<&D0cα>翱ek b1FBAe AkCo( MZ|@hPmO XJ)8NWf>un~{v̓" }/#:>{`8udy~ό_ݳ{L2Q (KB`nnNjs Rh@ЖeFRD |e,TzZ!uӧOh|_qwQnλnlݺ O gύ&q˴^I B]MfbK24S jh4ꞝNLx!cˋKݹS-!!oWW 1`KD 9!9 nm2Jd"-Ο?oSJZ{?ŏ0>`zf–J˵*28tٜݹ\v;jخ<{޿tp|۶ \)0l\&NgiJkXU:uThb%NVֺS1}wh*q RT jzV)<̓sF.3[OW_yͿ/gJJK/`EH>>?(EpUK/IENDB`eq10q-2.2/gui/knobs/mixer_knob.xcf0000644000175000001440000017005313023240631016426 0ustar sapistausersgimp xcf fileTTBBCSin nombre #2oBwEBEBA]BA]BBBBBBSin nombre #1a BtAtBA/BAFB.BBBt]BB.B".BB".BB".BBA/BA/BA/ Sin nombre!B[@BV@xBd@Bc@Bp@Bp@B~@0B~@0B~@0BA BA BA BABABAB@AHBAXB@ABAB@AB@ABABABAB?B?B?BQ>BQ>BQ>BO@@BO@@BO@@BY@BY@BY@Bgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) gamma0.45455000000000001Mbqq Capa pegada     NqqMqq`1C+2&)!.3 >%E/:@P?N)!48OKV\Ve^^fjf_* "Wktzvun%)PVywzw#$P޽|{z"OὯ}{$Kyส~}"{Ȫ|gടɷqAlż֫>nŵǿhϿĻ֥fιݴ*Ϲ3d볱AKĹ𴱰`WŷⴶbNg¿þ7O𱰯59yﰯM󪨞¿ە؇žѹIBg}q~8x񬪫՛/oVMwĽҵO,iq%(a߬Д, L)6_㧩ĿԪ@5@Etb $~[Oi够ǐ) Z?^zᦥľL5DU{捻󹸵+&0tλ?Pt󠞘򹺷ȗ "[V?Pn¿Ƿnnƽ16Owꠟƾɻ!,Em½)Bq론¾(Co!7gƿ.Y1Yſ!8^񜛘&B`홚'8a|¾𺻼 2eǾ󽼼B2&'.3 =%D/:AP?N)!48OKV[Ve^^fjf^* !Wjtyvun%)PUxwzw##O޽|zz"Oὰ~{$Jx߹~|"yǪ|fߴȶqBlû¿֪>nôǿgνĻԥg͸ܴ*촳Ϲ2d봱GJĸ𴱰_VķbLg¿þ7O񱰯½39yﰯM󪨞¿ؓ؇ž϶HBg}o~8xԙ.nVMwĽѴN-h槦p%'`ϓ,K)6^㧩ĿҨ?4?Ds੪a "}ZNi够Ŏ( Y?]zᦥľK5ETz捻*&0rͻ?Ot󠝗󹶶Ǘ "ZV?Pn¾󸶶ǷmnŽ16Owݠžɻ!,Em½)Bp론þ(Bo!7fƿ-X/Wſ8]蜛&Ba𗑙(8a}¾𺻼 2dȾA2" *-!.6C,K5BEUEU)&#:>UR_e_ofgnqnf* %Xo{v%-TZʿ#'R¸" RȽ$M|÷"ϵ߄l迫¸{DpᶦCt˧oౢmƾ+ŭ8k¿ƴKPƽ¿fZýgSmŽ>Sʿ鿾;=ɿ񾽾ǿSĻƾ⏨üûھJIlt=Ľߠ1\S~ݼR 1o淴ľu(-f༺ڛ.L,j#9o I6(23"m:[L?0.^ؿǵ*"&.D) u 'D%!c$M#R!N O_' |2{ 8 !"'##m#1$g$5%J% .%T&j&g&n&*|& >&I&P&a'm&q&w&r&Q&-|&U%>%S% Q%A4BHE*XZdU,*oniHPZ#'zxtulljcF<%{wvx{wqohjk$|zwwywwuwfUS"}{zyyxwk^[\- ~zywwxzpda_]yvx}ukd^Uɭ~}qmy~yme[MB˩|>AtztreW_kŢZ ]vsqpffcU֊B EbowtojhedZJ)W~|xpnjhaUPEtzy~~wungd_c-ܼkGstwxrpmhfcm,r.޸wvwvqkgfdhBHې)4p่ww{void_g[^cڠ>!K仄rsuqkfdaah^JR 4ڸmqsnifb``XAq#h̻դuktsmhe_\^`I+EֿѕprtrmhbZ]\A(ºӽtwxsmfb^^WFlƹʦ~yyqgbgi`]^EкѾupnggvla_,ø꺹ҽuvp^Or̻빺ȽqWRԿ鸺ômaUź渷ǹmUOϼ¿~aV򹸸ìfHlRuR!߻|V$Q6缻bC\J軺Y<㷹aHSX?aH칸[?칸}\%{V%v[v[໽iVA4BHE*XZdU,*onhHPZ%'zxtulljbF<%{wvx{wpogil$|zwxyvwtveUT"}{zyxwwj]Z\. ~~zyvvwyoca_^~yux}sjc^Tȭ~}qmx}wkdZLC̩{?AszrpdW_jšZ ]wqooeebV֊B D`oxuojgdcZK) X}xpnjhaVPſEu{z~wungd_c.ۺjHstvwrpmhfcm-p.ݸwvwvqkgfdhBG؍(4p่ww{uoid_g[^cם=!K仄rstqkfdaag]JP 5ڸmprnifa`_XAp#h˻դultsmhe_\^`J*EԿіprtqmhbZ]\A(ºԾuwxsmfb]^WFkŹ˦~yyqgbgi_\]EϺҿtpnggvla_,ø꺹ҽuvo]Nr˻빺ǽpWRԾ鸺³laUŻƸmTNμ¾~`U«eGlR󠞜tR"߼{U#~P6罻aD빸[I軺X;㸹`GX?aH칸[?칸}\%{V%uZuZຽhUA;HNL*_`j[1*wxvoMU` '}~tspiL@%􆂂xwnqq$򐈆}m[X"𒐏sdaa0 xlieb~ske\Թ|wvmbSHֳE"I~~{m^fsΪ^  f}{ynmi[ݏE Hgx~ytqmj`O+![zxtqh[UGvxqmfi2lIȔ}~|zwrplu1t/Ñ{uqpoqHN*5rĒyspkrcfj@ !LƎ|}{uqrnlpdOT 5‹w{~yspmkh^Gt#ku~}wroiedfN,G۟z|~}xrldfbF*ǘ}wplhe]Jo׳}rlqujedGͽ|yqrvge-ɰwdTtɷy]WͿreXĨsZTɲf[̷kK¤rXȰ|Y'ȹ],W<«fFĮbNIJ_@淪hOƽ^EŲhMǾaEƵc*ȵ])}aŮ}adzq]A* +zT64)¥d!'ӠM$ %ϕF$]" 3 T z' A 5FhjN퓀 Gշc߮4bҰ7Kݬ.$l 2J[dy     o  h  G @   i  ~ý eƽ 3̾ {~½PxǾ#y½<$Z Pƽ𺹸&򸹺(wľ_ǽ񸹸5򸹸e· $= 󷸹 L 򹸹$)S/)/VWh}[D'#$+*$!;DADYYgvn~"*5! $9-,("1DAXV1IU6420P }ýdƽ 2̾ {~½OvǾ"w:"Xɿ Nƽ𺹸&¾򸹺(wľ_ƽ񸹸4ſ򸹸d $<~ 󷸸K 򹸹")Q/*/VWg}ZD'#$+*$!!;DACXXfvn}!*5! $9-+(!1DBXV 2MU7420P"'m 7ƸV©(Dz?ǿ&^ŬSDz)ȿ*{Ȭe˸:ǿ!k î(D Ƕ#'V Ǿ,!/Coİ74DAiƸO2/=m- /FrƮ)5L)JxʭzmcɼZUzĘ둔sWkûxL==QxqunjvknemTE\5.6__pdM-)*..)!#!ALGJadqw$"*6"#$B22.(8KH_]9mR7420P/$~$X$$|$O!r!"Q"#!,! I!> K5] ) A G1a%\f'Uo#fϐ!:d2#ylQ5&sp_QKB2%1:*#Qr~% ;87&4q:7:&8<ັ|]2츟yQhRxb=nF❡U=qX-坜fY🞜zK䞝\򞠠z5𜝜U򜝠o왚x6虘h6闕g"񕔕mXꓔX?2򙚜M&3mB𔕖~c3 zE }]> d2#ylR5&sp_QKB2%1:*#Uv% =:9&2q<9<&6>Ƽf9©Zᰧr\ᦪlHwM𪭫š]Ey`4婨Ėo`䬪êQ񫩧d;樧[򪫮w禥<𥤤o=飢Ún'u_ꠡ`F2򧨩S*2wJ𢣤n<𢡢O dB󣢣k8#vY;%{yh[TK8 %7A0*!Mo%& ;87&::7:&>< E # {  ; |  6 | ' R  { ' @ `   d  / @5P + ίY̷I"Ƚ|F? #΢Z3,%VUA*#%  &88TT#Copia de Q802USB_P0ALM_Top_XXL.png     FNnTTNVTTNu-].+Hd3++*)7xR):\zwjR;1,$%%$&%'&&%'&($#$$'/8Ndq}vY8',*IX-,+,.,)L{`{iP9,'%&&''%$%&%&'##""#$&%%&%%&4Kbxw[+QG**,+-**+-m|`@.&&'&%'*-057;3-%%&&(''(')%#%%)1;Rky_;(.+M]/--/-)QgpT<-(''('%&'&'($$##$&('&'&''7Pia,UK*+-,.+,,.ufB0''('&)+/268=>EKJG@8.%%#%&%$"+=[zTD+,++),F{d?+())'2ETONOPQRQuzW;-&#$'#"%9Ytp>).+,.-,)4_g>+&''&$%:`|\WWXXZZcĢfK>2&"##! D^?*,,--++*@yvF+()'&&,N̽iaYX[cipi{d\YTL8& *Zl?*-./.++-K\1&()%%5WɰpqZllqxu^c^_^[P9.oD+-,-++.WzE+()*&/Gp|aRR_`bbadihgcc`^UN,,-,+,--ao9(()&)?[cg{qllfoXfc`_``dZėseY./-,/.+-aa2()'&4Q`hpdi}tmmplmmoμnfʙt++,,-+/cX+((&&;[bfkotkojjsý³Ž-,,-*,aU,+)&'E]cfioakѶz¿-,,+*WT)((')WyWfj~䈳حnmporswy|~Ő--,)L[))'&)ebVәnononootwyz}Ň-*(?b+'(''g˥vWږ~oonmonnootwz~6+2vn.(+''b¸p^hpmnomnnpssuy}Ց9}+-_|8(*'&SƲЕheXnonnmmnoosttyz~b18GH&*(%Atph|Ʉpoonnmnnonstuyy~})a-**%/Ȗrrpspponnmnnostxy}1zڕx4)(&(fsonmsponnommkooptyy|~VO歔M)(()Emuom}npponoonoptux|~p-[i,()&8X]duthlqrppnmonnoosuxz|*[6C'((*L[`bҔcsrppnnoomnnostuy}~Bq)ej*)*&8W_cwpponommnoorsuy|~e1,[jC))'*JZbdoponnmnnpsuyy}|';Ejii,(($8TY_|opponnomnnoostxy}~6o~-hjkK%('+DJV`proonnoommnortuy|~YA'_ikm.((&1[TI^oponnomnnoottw|~u+1Ojkkn)+)&BzgU|rpoonnommkopstxz}~-e7jjkmp()''k{UILnrponoonmonptuyzJd}(ejkmmp((&/xRTWpponnmnnosstyz}i1,Yjkkpp'('EiPR{monnmnoty}&G?jhkmpps*)%f×ZQNoonmomnnosuuy|~9u߂,eiimmpsp+(%{RQSoonnonmmnootuyz}]7(^hiknpssp'&+mMNfkoonmmonnooruy||w)1Jjikppsp)%5fLJknnomoosuuy}~.}o2jiknpspp)(AYHInnmnoptuy|}PW&djimppspp)%DvVPGponmonnottxz~s1/Sjjmnppsppnn''7LQ\݂nnmnoptuy|JtS;hjkmppsppnk'(38=Nxnommnnostuy|~[e+hjjmpsspk()18@Qjoomknnotwx|}>5)^jjkmppkj((2:=Tinmkknostuy~~ԎuD'4Gjhkmppsppnmkki()1;?Vinnostxy|莊ymY'T~0hhkmmpsppmnkii''1:@Rooknoptux}}툇|nke8.dž)bhjkppnkjig'(19DWϾwonnsstxy}鈇|rnjhS*F3Yjimmpssppmkkigg)&9UVXKIBтomostyy}~ᎊzrnmkig[djjkmmpssppnmkigg'$AwvFADדoosuuy|}󊈅}xpmmkkjkkmnppspnnkkijgg($>QDGۍoptux|}~~xuomkkikkmmpsppnpnkkiigee*&5[FJr֗kstwz}셂}|xrnkkhhkmpssppmjiiggee'$*hFJ^ɭwwuy|}}}ywspkijmppsppnnkkiggece(%#rEJRwyz}}}ywsmkmnpssppkigecc('#i}KILˎ}y}}}|xuuppspnkkiigeec__)'#HYINhŠ|~񍎌}}|yxuppspmkkjggecc`)&#/iDDQ}}||ywsppnkiiggececc^''&%kpU}}|xspnkkiggecc`^^*(&$AnUxƮ}}||xuwssppnmkiiggeec`^^)&%"/KCI_̼}}||zzxxspmkkiiggecc`_^&'&#(9BJPIJ}}|}||xyxzxxusppkiigecc`^('$#5AHLa˿~}|}||yyzyxsspnkiigeecc`]^^2&&%%++))'2GVPOQRRSSw|Y<.&#$'#"$8Vpn~>*.+,.-,)4]d=+''&$%;b^YXYZ[[eȦhL?2&"##! C_?*,,--++*?vsD+()'&&-Olc[Z]ekrk}f]ZVM9& *\m>*-./.++-IY1&((%%5X˱rt\noszx`d`a`]R:/qC+-,-++.UwD+((*&/HrcT`bcddflkideb`VL,,-,+,--^l8(()&)?\di~tongrYgeb`abf\Țuf[-/-,/.+-^_1()'&4RbjqfkvoprnooqμpiΝw++,,-+/`U,((&&<\dhmpwnqmmv´-,,-*+^S,,)&'F_egjqcmѿW  -,,+*UR)((')Y|Xhl狴ػ  '--,)JY))'&)geXհ "-*(?`+'(''jϨyZܰ /+2rk.(+''dŽs`j ?=+-]x8(*'&UʵՙkgZ! 48FG&*(%Bwrj~ H~|^-**%/˙uus TXސu3)(&)iĨurq8ꯏK)(()FoxqoFD()''m}WJM =I(&/{SUX DC'('F¡lRS| H60*)%hǜ\SO ?:VO+(%~TST .F'&+pOOh H3 )%6iNK T=M)(C[JJ <H )%FyXRI CE '8MR^  V=7 ')49>O =gM ()29AS 30D (3;>W !Ch3 ()2;@XJ<@S '2;@SHEˍH')1:EXL36)&;WXZLJD'$ByxHBED($?SEHc*&5]HKsק '$*jGL`̴(%#uGKS ('#lMJM΅)'#I[KOjȫ )�lFES'&&$msWģ*(&$CqWzʲ(&%"0MEJaѿ&'&#(:CKQȵ('$#6BINd¥ 2&&%%,=ENUó=M&'%$"5AKTcjj l.'(%#*>HQVZPR[êC%%$$#5FKMQSV\aj.'&&#'C_[qWX\c 8-( q!)*,U,/0 1 2 3 4 5 5677899:::;;;<<<================<<<;;;:::99877Oy7)*+)2`E*,,.uN)**,++-RL,*,k-(**,*))HO,+l~o@)*+),,*?xR+`buwV0'*-+,,(cdgJ#&$9{ljflt*#()]+njmC!&#C~̎hkyt%&&,m$olq0#&%R·fevyC&'&9Dɦ^q_WK)%&-ZTO3$&%ZWQ:'*%'aWS@&%%lVSF(%%|RRJ.$*܌YWO2((eִu`bjt4$%.ՔDJXy<%&)ѦPVbD#'$ѹTU^N#& λTW`T#'мXYaU"& ׿ZZ_R"& ޱWW_K#(0PTd@#'_QM_9#%״ocr3#'zVWR-%' jYSF)%'1cZRB%%'ݓ]ZR="&(z\ZO6"&&ej\VK,!&(WZ^]]VD$$&$,fgc\UV^7!&')efilixi(#&$0Olkis|{Q"##$>kkm1!#%$Zqokv] #$$/qguljl}0 $$#G'cfju]!"##*dnk{1!#$$?~Ջf|H #$#&bT9)+,*4fI+-.0~R++-,+.WP.,.s/)++-++**KT,-rvC)+,+--,+BV-dh}\2(,.,.--)>Ni^`so=*()*++-+&(iggecc`جSYeF$(iggecc_`׿WXaQ$'igeecc_bkW[cW$(ggecc_bn[\dW#'geecc_``]]cU#(gcecc`^^ZYbM$)ecc``^^RVgB$(ecc`^^[SPb;$&ecc`_^^Yݻsfv4%(cc``^^_X~YZU.&(c_`^_^]kn\UH*&(c``^^Zf]TD&&(cb^^]]V`]T?#()b^^[]g}^]Q8#''^^]Zŷm_XM-#')^^[]UZ]a_`YE$%'$^^[Zjjf_XYa8"'(*^[[ZUhilqm|l)$'&2^[[VpolvS"$$%B[]Yoonp2"%&%_[ZVtsnz`!#&%1y[Vyono2!%&$KYfimy`!#$#+lrro2"$&%BݐiJ!$%$(iR}8*+,*3dG+-.0yP++-,,.UN.,.o.)++-++JS--qrB*+,+--,+A}U-egz|Y1(,.,.--)>~Mj`aqk<*()*++-+<}jea_h~xF))++*++,>}rhfe`byQ+(*+,++)A΄ijgba}[,()*.-*+LmiiWs].),+*-+)U{_.Hz]-++*.9#G{Y)(++,~!$J}R*)*++R6"##OF'**-.eRS7 $$(Xy:'+-*׋V\YX:"&%.fl1+*,䪣]`a];#'$4rY((*Øejf]0"%&B}}?4^ĊigfS'$'(Wvu҄haaI%&$.ozic8$&%Eohyw('()`Zae{E#&$=~|kaepƒ(%(*aUíiinN$'%;Аlr|+%)+a ſtpsG"'%Eҕnrz&&'-qurw2$(&Uԍlj|G'(';iͭcxd[O*&(/^XR5%'&^[U<(+'f[WC'&&rZWI)&'VUM/&+]ZS4))ۼ{dgoy6%'ۚGN\>&( جSYfG$( ׿XYbR$'X[eX$(\]eX#'<^]dV#(?Z[dN$)SXiC$(TQc;$&uhx4%(Y[V.&(o\VI*&(g]UE&&(`]U?#()_]R8#''ɺn`YN-#')Z_baaYF%%'%kkgaZZb9"'(*ijnso~m*$'&2|qpmyS"$$%@ppr2"%&%\utp|a!#&%0uypnq2!%&$J gjo{a"#$#+isp2"$&%AkK!$%$(fc    U P U   U             }A"#"" +dnRTWf'Æg,##" 8aTUWf$ 􆂁J$%$#!#N~\RVY\ ",𭅅o4#$%$"'ez[SN{e afk])#$$")rwXd 1ˇch-9u{I$$# -yahû ݫoggi((Or7#$$#"-prMUkƞ.4غdffl(()_}h0!##$#!/UPFPQ^aVyS ْdccefoy)()5k}|^,"$#"%#,@EKNQStKPOVor4  J_bbhw))(&GHKOQMROMNMLL[qżral}*('&%Dw}yR'"$%##!%9EHKFMkeWMKKIGHGïwgU?pt)(()'&Hw|xS*#$$##!#1@EAev~}p\OJGDSԥ48;<==?B9{ƮmV\uT(*('&%%Ox|yY+!"#""!(4DfwdVH[39::==ADAPoYMKMRcj4!(('&*Ox|y^1"##""! +<_}hUZgw7;=>CHP\cTAFHIIX^=$!L&''()%'Hu|{i;$$#%##" !(CA>2$!"#""#|B''&)&%'';i|{w]5!##"##$"! #&0BH;433211VtY@71'"!#""#$$|B&*&%'%&#/[z{|nJ-#$$##"#"! !#)-.//CY_^\UK>4,)$"!!""#"##"*tyB%''%&&%$*Hnxyzd7#"%$##"! !#$%%"    "!##"##$"6d=ryA&&'&&%#5fyys7##$##!#"##"!"!!"!! #"#"#"##""$$&"$#!7r呅D#$$#!,gqUWYid~}}|zyxuywxussnkigdeec_``^^[Zmΐn.$%$$!9eVWZinx}}|yzxyxxssnkigeecc`__^_^]ZN$&%#"$P_TY\_m}||yzxuuwssppmkkgedcc`]^^_Ux6$$%%#(g}]UP~ĺds~||yzyxxuspnmkkiigeecc_^^_Z]cnsc*$%%$#*uyZfƿiwyxxspmkkjjggeecc``^_]VҌfk.;}N%%$!.}bj¿zoxzxuxsspmkkjjgeecc_`]Vrjjm))Sz:$%%$# .ssNXpͣw}ytsppmnmiiggeedb_Zbgjiio))+ep3"$$%$"0WQHSTaeZ~}upmkmjjhdb^YUeggfhir}+)*7se-#%%#&$-BHNQTVyNSRZruurpbefk{+**&?z_*%%$$#"-@IKNRTOTRPQOO^u¯udo+))'&HX(#%&#$"%;GJNHOni[PNNLIJIʵߔ{jXAȪsx)**+)'LX,$$%"$2BGCizt_QLIFUܪ5:=>?>AD:̴pX_yV)+)('&&T_,"$%##!)6Gj{gYK^5:<%%$&$$#!#)>jlN=::;>Tatus|iCDGGHHE9(""$$H'()(&''&FxzO)$%$%$#"!!%4SxkC876545PtM?ED?3&"##ŗE()')(&((>pc8##$#$$%#"!$'2EK=654323Zx\B82)# "##$%$E'+(''&'$1avN.$%%$$#%#" !%*//011E\ba_XN@5-*&#""##$"$$,{F&((&('&%+Lvk:%$&&$$#"!!"$%&&#!"!  ! !##$$#$$%#9k?zE''((''(&$8n{;#$$%$%#$#$##""!##""!!$#$#%'$%%";{ٌC#$$#!,itVY[k׋k.$%$$!;gXY\l:M%&%#"$RaVZ]a8 t5$$%%#(i_WRȾְdjo`)$%%$#*x|\hû8֍gl.:yL%%$!.dl¹:9tkkn))Qv9$%%$# /uvPYrѦĈhkjjq))+bm2"$$%$"1YRJTVcf[ Cghghkt*)*6pb-#%%#&$.CIORUX{OTT[u9 89cbfgm~**&>w\*%%$$#"-AKLOTVQUSQRQPP`x¿Ʋwfq+))'&F{~U(#%&#$"&765433Zz]C93)# "##$%$D(+(''&'$0^rL.$%%$$#%#" !%+/011E]cb`YOA6.+&#!"##$"$$,w~E&((&('&%+Jr}}~g8%$&&$$#"!!"$%&&#!""  ! !#"$$#$$%#8h>v~C''((''(&$7j~~w9$$%$%#$#$##""!##""!!$#$#%'$%%"9w6 5 5 4 3 2 10/.,*'#!&- үo\ja% #$#B{vԵycbX]2!%#")c[ֺcc_X=!"##H~yegb_ZH%!##!1m~_^idd`ZL)!##'Y}jdi]LT^[N)!#%##Ext7(Jni_LUQ. "#""6p}~N&&zwvcN0 #$$#0e|}`+%((N* !##,]{|j2%)*)E# "%#")Wz|p;$(('*t8 ##'Qy|vD%&&()*+!"$&$")Pw{wH(()(')' ##!+Wv|yP%%'))&+"##"/\y{wN)$&''(()X##9g{{vH%$&'&''%J""(Hr{|oD%$%&&')&B|#6\w|{h9$$&%%('%@zHm{zxZ/$$%(&''&AxtwxxoI(#&%%&&%>vu:zyf7#%'&(&(&%?u{B(ٴs_nc&"%$$E~ۻ}feZ`3"%$#*jagfb[?!#$%$MhÇjea]J&"%$"4ubalhfb\N*"%$$)_qkl_NWa]P*"$&$$I}:)NqlbNWS/!#$$#9wR''&~zzgP1!$%%$2lf-')*Q+!#$%$.cq5'**社G$!#&%#+]y>&))+x: !#$%$)VH&'((++,"#%'%#*VL)(*)(+)!$$",]U&&(**',#$%$#1cS)%'(())*\$$%$&))+y; !#$%$)T}{G&'((++,"#%'%#*S|{J)(*)(+)!$$#,Zz}S&&(**',#$%$#1`}~{Q)%'(())*[$$%$;k{J&%'('()&M$#*KvsG&%&''*'D%7_{l;%%('')(&BKq}]1%&&)'()(C}x|}|sK)%'&&''&Azy<~~j8%&(')()''AyD)       $0**TTQ802USB_P0ALM_Top_XXL.png     $TT<TTXSڈ.+Hd3++*)7xR):\zwjR;1,$%%$&%'&&%'&($#$$'/8Ndq}vY8',*IX-,+,.,)L{`{iP9,'%&&''%$%&%&'##""#$&%%&%%&4Kbxw[+QG**,+-**+-m|`@.&&'&%'*-057;u,++*)RO('&&(VxVeh{݅ҞH0 %23s,++(HV('&%(d`V˂2 "/0v,)'<{\*&&gǠ}sV|**1ng,(*&%bƼn^g/ <*,Zt6'(&%S¬̒heX~I  $7DD&)'$Asogz/ yx[+))$.đqqo \Ӌp1((%(eqon 2ީH''&'Dktnl| 4b+&'%7W]cqrhkp 6~@&'')L[`b͒c :b d)()$8W_cv3    ?((&)KZbdi - b+''#8TY_| QB G$'%)EJV`3 . ,'&%0ZRH^   (*'%BvcSz- y6 '(&&jwTIK 7s ''%.uRTW7   &'&DgQRy 0  ($eZQNsDN *'%xSQS3 (   &%*kNNf  "  ($5dLJ~o9  ''AYIIo5|  ($E~sVPH7    &8LP\3Z3   %'39=N+  6Y   ''19@R (   ''2:=U  V)   '(2:?V  4<  %&1:@Q&  {}   &'19CUǸ,  .   (%9RTUIHB5    &#@~srEAD;       '#=PCFY      )%4YFIpІ    &#*eEI\ä&    '$#oDIQ9   &&"hyJHKb       (&"GWHMf*      ($"/gDCP2      &%%$jnTɻ$      )'%#AmUv1       '%$".KCH]ŷ%    %&%"'8@IOξ4   '&#"4@FK`Ĺ"      0%%$$*;BKR๩Q       J%&$#!3?HQ`ee6          i,&($")3-%%&&(''(')%#%%)1;Rky_;(.+M]/--/-)QgpT<-(''('%&'&'($$##$&('&'&''7Pia,UK*+-,.+,,.ufB0''('&)+/268=>EKJG@8.%%#%&%$"+=[zTD+,++),F{d?+())'2ETONOPQRQuzW;-&#$'#"%9Ytp>).+,.-,)4_g>+&''&$%:`|\WWXXZZcĢfK>2&"##! D^?*,,--++*@yvF+()'&&,N̽iaYX[cipi{d\YTL8& *Zl?*-./.++-K\1&()%%5WɰpqZllqxu^c^_^[P9.oD+-,-++.WzE+()*&/Gp|aRR_`bbadihgcc`^UN,,-,+,--ao9(()&)?[cg{qllfoXfc`_``dZėseY./-,/.+-aa2()'&4Q`hpdi}tmmplmmoμnfʙt++,,-+/cX+((&&;[bfkotkojjsý³Ž-,,-*,aU,+)&'E]cfioakѶ¿-,,+*WT)((')WyWfj~䈳حvxx̐--,)L[))'&)ebVә}qw~̇-*(?b+'(''g˥vWږqt}~>+2vn.(+''b¸p^hnv{~};+-_|8(*'&SƲЕheXwt{{n:8GH&*(%Atph|ən{{}}ꇈ)a-**%/Ȗrrpr|{{}邇1ڕx4)(&(fsonv|~}}~XV歔M)(()Emuom}su|{{~{~}}-bi,()&8X]duthlqu||}}{|~*`7C'((*L[`bҔc܋r||}{~~}}Ct)qj*)*&8W_cwq||{{~}s5,\tC))'*JZbdÛf|{}{{}}}'HEtti,(($8TY_|{y|{{~6~-strK%('+DJV`n}{{~䀅]N'itrv.((&1[TI^j|{{}}~+5Ltruw)+)&BzgU|r{{}~-f8ttusx()''k{UILm}|{{~}Jg}(ntrvsx((&/xRTWu|{{}}}|1,Ztruxxy'('EiPR{{{}|}폒&P@tprs{uw*)%f×ZQNj{{}|~};߂,qttvv{zv+(%{RQSt{{~{hE(hptuwxzz{'&+mMNfυx{{~):Jttru{|{wv)%5fLJr{{}~~.}q3tvrtuz{|xx)(AYHIm{}}ꌐM]&jtvsxx|z{ux)%DvVPGr{}~􂇋3/Sttvwu{zx{ww''7LQ\ݗv{}JW=stuvxu{zuxwx'(38=Nҏw~gh+ptwvxz}z|{xxu()18@QDŽx~~?A)]ttrsxuu{|urw((2:=TÃ}~E'@Ftsuvuuzuuwsuut()1;?V}}e'Z~0psussxz|{|vwuvs''1:@RÈ{}{n8.dž)kstxx{xuxvwwuwsu'(19DWϾɎ{zxuP*Q:]otvvxzz{|xsxusur)&9UVXKIBїxzvxvnapttrvvuzw|xwvuvrur'$AwvFADץx~||xurtrrswuuzuwwuuvtrur($>QDGۘ{|xyxutuuvvuz{{zxwuxvsost*&5[FJr֗~}~zwurssuvxzz{xuvvtvsorsq'$*hFJ^ɭ~|z{xrtwvxyz{xwwuuvurqrq(%#rEJR{~|{zzsuvwuzwx{xxuutsrqopr('#i}KIL˓}{yyvxxuwz{xxwxuvsrsqopp)'#HYINhŠ{}}{{yyuxuzz{xvuuwrrqoopp)&#/iDDQ}}x{{zwxu{||xwwuvsorqoqppo''&%kpU{}}{wzv{xwxuturqoorpoq*(&$AnUxƮ~}}ww{wyz}zuuwvxvsrrssopoq)&%"/KCI_̼~}}|y{z{zzwwyusxuvsuuoqrppo&'&#(9BJPIJ{}~}}{{zywwyw{|xxvssorslrppnpqq(('$#5AHLa˿}~}}{xxy{wwz|tuvssrsqoppkon2&&%%++))'2GVPOQRRSSw|Y<.&#$'#"$8Vpn~>*.+,.-,)4]d=+''&$%;b^YXYZ[[eȦhL?2&"##! C_?*,,--++*?vsD+()'&&-Olc[Z]ekrk}f]ZVM9& *\m>*-./.++-IY1&((%%5X˱rt\noszx`d`a`]R:/qC+-,-++.UwD+((*&/HrcnT`bcddflkideb`VL,,-,+,--^l8(()&)?\di~tongrYgeb`abf\Țuf[-/-,/.+-^_1()'&4RbjqfkvoprnooqμpiΝw++,,-+/`U,((&&<\dhmpwnqmmv´-,,-*+^S,,)&'F_egjqcmѿrswy||}-,,+*UR)((')Y|Xhl狴ػq--,)JY))'&)geXհr-*(?`+'(''jϨyZܰu爌U+2rk.(+''dŽs`jr󉋋գ`A+-]x8(*'&UʵՙkgZ㒇񇈈}I8FG&*(%Bwrj~uH~|^-**%/˙uusˀ򈋌Vnސu3)(&)iĨurqdžtDꯏK)(()Foxqoɇ򈉌FDf,()&8Y_fwwjnsҊ䆈MB^B'((+M]ad֗f悊򈋌fArJg*)*&9Yaey}񈇈󚝣GFxA*)'*L\cfꉋGHhf,(($9U[a܈\^GSI%('+FKWb}vHG{.((&1\VJ_Lj𖛗EFn)+)&C}iVyS?\()''m}WJMƇ懆lAI((&/{SUXy鈋FCv'('F¡lRS|ՆHEd*)%hǜ\SO鈋`LVO+(%~TSTqyKFz'&+pOOhHHl)%6iNKꋍT@V)(C[JJ򉌍oCH)%FyXRIq􈌌JEq''8MR^k鈉kgA`Ћ')49>OmxAgM()29ASucJDz((3;>WtԡgChIj()2;@Xt󈋌衞vJC@S܆''2;@Sp휛`EˍH}ޅ')1:EXj霛qLGOv݆)&;WXZLJDhᡞx'$ByxHBEe󞜚($?SEH܍*&5]HKsק욗'$*jGL`̴yՃ~(%#uGKSn~~('#lMJMΔЇ~{{)'#I[KOjȫ~~|)�lFESs҅~~~z'&&$msWģ~~|zz*(&$CqWzʲ~򍎋~|zz(&%"0MEJaѿ~~|{z&'&#(:CKQȵr󒓒~~|z('$#6BINd¥~~|yzz2&&%%,=ENUó􆅃~{{|{zzyM&'%$"5AKTcjja~{|zzxxl.'(%#*>HQVZPR[êg~~{||zzxC%%$$#5FKMQSV\as󎉋~~|zzxwj.'&&#'C_[qWX\cw~||yzzxxw` 8-( q!)*,U,/0 1 2 3 4 5 5677899:::;;;<<<================<<<;;;:::99877Oy7)*+)2`E*,,.uN)**,++-RL,*,k-(**,*))HO,+l~o@)*+),,*?xR+`buwV0'*-+,,(ՔDJXy<%&   8ѦPVbD#'   6ѹTU^N#&  -λTW`T#'  1мXYaU"&  6׿ZZ_R"& 9ޱWW_K#( BPTd@#' dQM_9#%   ״ocr3#'  zVWR-%' -jYSF)%'?cZRB%%' ݓ]ZR="&()z\ZO6"&&gj\VK,!&( WZ^]]VD$$&$:fgc\UV^7!&') efilixi(#&$0]lkis|{Q"##$>,kkm1!#%$Z qokv] #$$/qhuljl}0 $$#G7cfju]!"##*d0nk{1!#$$?~Ջf|H #$#&bT9)+,*4fI+-.0~R++-,+.WP.,.s/)++-++**KT,-rvC)+,+--,+BV-dh}\2(,.,.--)>Ni^`so=*()*++-+&(voursoogجSYeF$(vuusoomg׿WXaQ$'susqrupkW[cW$(ousrooph[\dW#'ossroppg]]cU#(uospupq`ZYbM$)srrppqq`RVgB$(qrppqoq[SPb;$&qpuppon`ݻsfv4%(ouppqnlu~YZU.&(ppqrnhn\UH*&(ppqnnTf]TD&&(ptqnkk\`]T?#()oqqnog}^]Q8#''qqnnZŷm_XM-#')nqnohpZ]a_`YE$%'$qqnoWjjf_XYa8"'(*nojiphilqm|l)$'&2nojRpolvS"$$%Bop`onp2"%&%_ji\tsnz`!#&%1yjRyono2!%&$KSfimy`!#$#+lro2"$&%BݐiJ!$%$(iR}8*+,*3dG+-.0yP++-,,.UN.,.o.)++-++JS--qrB*+,+--,+A}U-egz|Y1(,.,.--)>~Mj`aqk<*()*++-+<}jea_h~xF))++*++,>}rhfe`byQ+(*+,++)A΄ijgba}[,()*.-*+LmiiWs].),+*-+)U{_.Hz]-++*.9#G{Y)(++,~!$J}R*)*++R6"##OF'**-.eRS7 $$(Xy:'+-*׋V\YX:"&%.fl1+*,䪣]`a];#'$4rY((*Øejf]0"%&B}}?4^ĊigfS'$'(Wvu҄haaI%&$.oic8$&%Eonhyw('()`Ziae{E#&$=~|akaepƒ(%(*aíiinN$'%;}Аlr|+%)+apſtpsG"'%Eۮҕnrz&&'-qzurw2$(&Uԍlj|G'(';ͭcxd[O*&(/~^XR5%'&^[U<(+'f[WC'&&trZWI)&'wVUM/&+퀬]ZS4))ޚۼ{dgoy6%'~vۚGN\>&(Ā~~|fجSYfG$(~~{|d׿XYbR$'~~{}cX[eX$(~~{}^\]eX#'~~{||_^]dV#(~~~|zzaZ[dN$)~~||zzuSXiC$(~~|zzxTQc;$&~~|{zzvuhx4%(~~||zz{tY[V.&(~{|z{zyco\VI*&(~||zzwpg]UE&&(~}zzyyt`]U?#()}zzxye_]R8#''zzywɺn`YN-#')zzxysZ_baaYF%%'%zzxwtkkgaZZb9"'(*zxxwsijnso~m*$'&2zxxtqpmyS"$$%@xyvfppr2"%&%\xwtutp|a!#&%0uxtypnq2!%&$Jvegjo{a"#$#+iasp2"$&%AkK!$%$(fc    U P U   U             }A"#"" +dnRTWf      ,Æg,##" 8aTUWf+         7􆂁J$%$#!#N~\RVY\8      H𭅅o4#$%$"'ez[SN{g       #afk])#$$")rwXd8    Dˇch-9u{I$$# -yahû7    ;ݫoggi((Or7#$$#"-prMUkƞB-    'Bغdffl(()_}h0!##$#!/UPFPQ^aVy_6' ,>ْdccefoy)()5k}|^,"$#"%#,@EKNQStKPOVor@94433:=[_bbhw))(&GHKOQMROMNMLL[qżral}*('&%Dw}yR'"$%##!%9EHKFMkeWMKKIGHGïwgU?pt)(()'&Hw|xS*#$$##!#1@EAev~}p\OJGDSԥ48;<==?B9{ƮmV\uT(*('&%%Ox|yY+!"#""!(4DfwdVH[39::==ADAPoYMKMRcj4!(('&*Ox|y^1"##""! +<_}hUZgw7;=>CHP\cTAFHIIX^=$!L&''()%'Hu|{i;$$#%##" !(CA>2$!"#""#|B''&)&%'';i|{w]5!##"##$"! #&0BH;433211VtY@71'"!#""#$$|B&*&%'%&#/[z{|nJ-#$$##"#"! !#)-.//CY_^\UK>4,)$"!!""#"##"*tyB%''%&&%$*Hnxyzd7#"%$##"! !#$%%"    "!##"##$"6d=ryA&&'&&%#5fyys7##$##!#"##"!"!!"!! #"#"#"##""$$&"$#!7rؑD#$$#!,gqUWYi{}y{wy{zwyzzwtuutrpntopponqjXΐn.$%$$!9eVWZis~}}{y{{wwzwwuuvvsrssotppqrnkWN$&%#"$P_TY\_o}}}}{y{yvz{z|{vxuuspooupkoonffx6$$%%#(g}]UP~ĺs}}{y{wzwyvzwxwsuussussorppqqlZycnsc*$%%$#*uyZfƿ}rw{{wzwwzuvuutwrusqoppqj\sҌfk.;}N%%$!.}bj¿wxwvwzwzzxvuuwwunqoomkYtrjjm))Sz:$%%$# .ssNXpͣ{twuxvwvvuotqpk]f}gjiio))+ep3"$$%$"0WQHSTaeZ~rnomjifh]`sggfhir}+)*7se-#%%#&$-BHNQTVyNSRZrbefk{+**&?z_*%%$$#"-@IKNRTOTRPQOO^u¯udo+))'&HX(#%&#$"%;GJNHOni[PNNLIJIʵߔ{jXAȪsx)**+)'LX,$$%"$2BGCizt_QLIFUܪ5:=>?>AD:̴pX_yV)+)('&&T_,"$%##!)6Gj{gYK^5:<%%$&$$#!#)>jlN=::;>Tatus|iCDGGHHE9(""$$H'()(&''&FxzO)$%$%$#"!!%4SxkC876545PtM?ED?3&"##ŗE()')(&((>pc8##$#$$%#"!$'2EK=654323Zx\B82)# "##$%$E'+(''&'$1avN.$%%$$#%#" !%*//011E\ba_XN@5-*&#""##$"$$,{F&((&('&%+Lvk:%$&&$$#"!!"$%&&#!"!  ! !##$$#$$%#9k?zE''((''(&$8n{;#$$%$%#$#$##""!##""!!$#$#%'$%%";{匁C#$$#!,itVY[kp~{||zzxw]׋k.$%$$!;gXY\lcӁ~~|{{z{zyw]M%&%#"$RaVZ]a[~~|yzz{st5$$%%#(i_WRȾr~~{zz{wbdjo`)$%%$#*x|\hû[~~||z{ytt֍gl.:yL%%$!.dl¹]~~{|ys\tkkn))Qv9$%%$# /uvPYrѦxu}{wbnĈhkjjq))+bm2"$$%$"1YRJTVcf[{{}zvr]dghghkt*)*6pb-#%%#&$.CIORUX{OTT[uk\[[YYZXbfgm~**&>w\*%%$$#"-AKLOTVQUSQRQPP`x¿Ʋwfq+))'&F{~U(#%&#$"&765433Zz]C93)# "##$%$D(+(''&'$0^rL.$%%$$#%#" !%+/011E]cb`YOA6.+&#!"##$"$$,w~E&((&('&%+Jr}}~g8%$&&$$#"!!"$%&&#!""  ! !#"$$#$$%#8h>v~C''((''(&$7j~~w9$$%$%#$#$##""!##""!!$#$#%'$%%"9w6 5 5 4 3 2 10/.,*'#!&- үo\ja% #$#B{vԵycbX]2!%#")c[ֺcc_X=!"##H~yegb_ZH%!##!1m~_^idd`ZL)!##'Y}jdi]LT^[N)!#%##Ext7(Jni_LUQ. "#""6p}~N&&zwvcN0 #$$#0e|}`+%((N* !##,]{|j2%)*)E# "%#")Wz|p;$(('*t8 ##'Qy|vD%&&()*+!"$&$")Pw{wH(()(')' ##!+Wv|yP%%'))&+"##"/\y{wN)$&''(()X##9g{{vH%$&'&''%J""(Hr{|oD%$%&&')&B|#6\w|{h9$$&%%('%@zHm{zxZ/$$%(&''&AxtwxxoI(#&%%&&%>vu:zyf7#%'&(&(&%?u{B(ٴs_nc&"%$$E~ۻ}feZ`3"%$#*jagfb[?!#$%$MhÇjea]J&"%$"4ubalhfb\N*"%$$)_qkl_NWa]P*"$&$$I}:)NqlbNWS/!#$$#9wR''&~zzgP1!$%%$2lf-')*Q+!#$%$.cq5'**社G$!#&%#+]y>&))+x: !#$%$)VH&'((++,"#%'%#*VL)(*)(+)!$$",]U&&(**',#$%$#1cS)%'(())*\$$%$&))+y; !#$%$)T}{G&'((++,"#%'%#*S|{J)(*)(+)!$$#,Zz}S&&(**',#$%$#1`}~{Q)%'(())*[$$%$;k{J&%'('()&M$#*KvsG&%&''*'D%7_{l;%%('')(&BKq}]1%&&)'()(C}x|}|sK)%'&&''&Azy<~~j8%&(')()''AyD)       $0**TTCapa     +TTTT**eq10q-2.2/gui/knobs/knob2_35px.png0000644000175000001440000000614213023240631016164 0ustar sapistausersPNG  IHDR##ٳYbKGD pHYs  tIME Se IDATXÝ{pyﲻJd$_d!ٖ/ؑoK b|Oe&CͅLN:qhPRR8 6)`l/f[[wVop'vg<>缯?bҲRbkbZ {} [W; %S4~bDYje),u#D#Hp~ɖ7l;`Yǻy+M[B]HY324xj܈K[{LbE$GiuKccOo/'r XxFFhƍ*T%V4 usITTh4=&_3|㛕^.<2_`֮iS,VpUeqӭU$?k9#) mplBH %\=!#<҇SPJ|њ:;G/0o^a$N[7qְ'ʠRHG Ru0l/y8*^`8VDYT&2YSnoxfU خ}_F8!BVaKlP ׂ{'y wPTR6;Wv?r.شDy?ڼ#0je[^`)>8T)%RYHB*d]KѴ|) =>?NwB* )QjZ!c]RRa"=Β׉) R PVK-F4gCJ_K}ȘQ2@ta,_Մ͒foXɖn$O%0Ų,S918&@Z DZXv cs*1&xK :٢)e#ThfQ^w7 DZlr$IfΘIh낐@*-e!l!dvR2X鐅"( LM{(.)r|yi7gd) JаD( # 1bZd )Bk1I r2$fz ~6  E|[241?`;gNsHp#Q'|hA`lA2o0`PBVC\bh({4Ω3 Ds3'ht"H<\\\y^`NP a oho0y19 jrc0?! XQ5(==_@$yXZrB)y#}jfat1Yʆ >ZL`Ёh0$#LnuD$!3M6u7'KKƱcG`vtd2us.]DQk+LJ8Pl9MhYyGI@~ 7^!3kyyXA!2Q!=Y:6\0B*$dᢽ|t^ Fh1HCL1=6K/3)++{=ԥL_J;}h5hO0eҀՓyb  t.]td DgG{G~|,ySgX4 ah߄$&+AX12Ј .tp 1ϳm|ް+V+(@*3|ggۇu۫g*fxҴd dГҀ/?x,r蕗9s##oGe[k #CfEcWOwfgNѶ ,_DQq ^6ȉ$hW8}Sgru'n鴥KS3>>.8~o\颍K7$`\i#IENDB`eq10q-2.2/gui/guitester.h0000644000175000001440000000207713023240626014643 0ustar sapistausers#ifndef GTKMM_EXAMPLE_HELLOWORLD_H #define GTKMM_EXAMPLE_HELLOWORLD_H #include #include #include #include "widgets/eqwindow.h" #include "widgets/dynamicswindow.h" #include "widgets/bassupwindow.h" #include "widgets/midsidewindow.h" class HelloWorld : public Gtk::Window { public: HelloWorld(); virtual ~HelloWorld(); protected: EqMainWindow *m_EqWin; DynMainWindow *m_GateWin; BassUpMainWindow *m_BassUp; MidSideMainWindow *m_MidSide; Gtk::HBox m_hbox; Gtk::VScale m_TestScale; //Slots signal handlers void on_realize(); void on_BypassChanged(bool bypass); void on_InputGainChanged(float gain); void on_OutputGainChanged(float gain); void on_BandGainChanged(int band, float gain); void on_BandFreqChanged(int band, float freq); void on_BandQChanged(int band, float q); void on_BandTypeChanged(int band, int type); void on_BandEnabledChanged(int band, bool enabled); //Test slot void on_TestScale_changed(); }; #endif // GTKMM_EXAMPLE_HELLOWORLD_Heq10q-2.2/gui/eq10q_ui.cpp0000644000175000001440000001172613023240626014610 0ustar sapistausers/*************************************************************************** * Copyright (C) 2011 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ /*************************************************************************** This file contains some definitions of the EQ plugin UI This plugin is inside the Sapista Plugins Bundle ****************************************************************************/ //LV2 UI headers #include #include #include "widgets/eqwindow.h" #include #include "../plugins_uris.h" //Testing Headers TODO: comment define TESTING_EQ10Q for the final relase //#define TESTING_EQ10Q #ifdef TESTING_EQ10Q #include using namespace std; #endif static LV2UI_Handle instantiateEq10q_gui(const _LV2UI_Descriptor *descriptor, const char *plugin_uri, const char *bundle_path, LV2UI_Write_Function write_function, LV2UI_Controller controller, LV2UI_Widget *widget, const LV2_Feature *const *features) { #ifdef TESTING_EQ10Q cout<<"instantiateEq10q_gui Entring... "; cout<(instance); EqMainWindow *gui = (EqMainWindow *)instance; delete gui; #ifdef TESTING_EQ10Q cout<<" Done"< #include "guitester.h" #include int main (int argc, char *argv[]) { //Gtk::RC::add_default_file("/home/sapista/build/LV2/GtkRCTest/gtkrc"); //Gtk::RC::add_default_file("/usr/share/themes/Redmond/gtk-2.0/gtkrc"); Gtk::Main kit(argc, argv); HelloWorld helloworld; //Shows the window and returns when it is closed. Gtk::Main::run(helloworld); return 0; }eq10q-2.2/gui/dyn_ui.cpp0000644000175000001440000001141613023240626014447 0ustar sapistausers/*************************************************************************** * Copyright (C) 2011 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ /*************************************************************************** This file contains some definitions of the EQ plugin UI This plugin is inside the Sapista Plugins Bundle ****************************************************************************/ //LV2 UI headers #include #include #include "widgets/dynamicswindow.h" #include #include "../plugins_uris.h" //Testing Headers TODO: comment define TESTING_EQ10Q for the final relase //#define TESTING_EQ10Q #ifdef TESTING_EQ10Q #include using namespace std; #endif static LV2UI_Handle instantiateDyn_gui(const _LV2UI_Descriptor *descriptor, const char *plugin_uri, const char *bundle_path, LV2UI_Write_Function write_function, LV2UI_Controller controller, LV2UI_Widget *widget, const LV2_Feature *const *features) { #ifdef TESTING_EQ10Q cout<<"instantiateDyn_gui Entring... "; #endif std::string sTitle; bool bIsCompressor, bHasSideChain; bool bAllOk = false; std::string str_plugin_uri(plugin_uri); if( str_plugin_uri == GATE_MONO_URI || str_plugin_uri == GATE_STEREO_URI) { sTitle = "GT10Q ~ Noise Gate"; bIsCompressor = false; bHasSideChain = false; bAllOk = true; } if( str_plugin_uri == COMPRESSOR_MONO_URI || str_plugin_uri == COMPRESSOR_STEREO_URI) { sTitle = "CS10Q ~ Compressor"; bIsCompressor = true; bHasSideChain = false; bAllOk = true; } if( str_plugin_uri == COMPRESSOR_SC_MONO_URI || str_plugin_uri == COMPRESSOR_SC_STEREO_URI) { sTitle = "CS10Q-SC ~ Side-Chain Compressor"; bIsCompressor = true; bHasSideChain = true; bAllOk = true; } if(! bAllOk) { return NULL; } Gtk::Main::init_gtkmm_internals(); DynMainWindow* gui_data = new DynMainWindow(plugin_uri, std::string(bundle_path), sTitle, bIsCompressor, bHasSideChain); gui_data->controller = controller; gui_data->write_function = write_function; *widget = gui_data->gobj(); #ifdef TESTING_EQ10Q cout<<" Done"<(instance); DynMainWindow *gui = (DynMainWindow *)instance; delete gui; #ifdef TESTING_EQ10Q cout<<" Done"< #include #include "widgets/bassupwindow.h" //Testing Headers TODO: comment define TESTING_EQ10Q for the final relase //#define TESTING_EQ10Q #ifdef TESTING_EQ10Q #include using namespace std; #endif #define BASSUP_GUI_URI "http://eq10q.sourceforge.net/bassup/gui" static LV2UI_Handle instantiateBassUp_gui(const _LV2UI_Descriptor *descriptor, const char *plugin_uri, const char *bundle_path, LV2UI_Write_Function write_function, LV2UI_Controller controller, LV2UI_Widget *widget, const LV2_Feature *const *features) { #ifdef TESTING_EQ10Q cout<<"instantiateEq10q_gui Entring... "; #endif Gtk::Main::init_gtkmm_internals(); BassUpMainWindow* gui_data = new BassUpMainWindow(plugin_uri, std::string(bundle_path)); gui_data->controller = controller; gui_data->write_function = write_function; *widget = gui_data->gobj(); #ifdef TESTING_EQ10Q cout<<" Done"<(instance); BassUpMainWindow *gui = (BassUpMainWindow *)instance; delete gui; #ifdef TESTING_EQ10Q cout<<" Done"< #include #include //Build //g++ -g guitester.cpp eqbutton.cpp ctlbutton.cpp pixmapcombo.cpp bandctl.cpp gainctl.cpp eqparams.cpp faderwidget.cpp vuwidget.cpp ../eqwindow.cpp ../dsp/filter.c -o test `pkg-config gtkmm-2.4 slv2 --libs --cflags` void writeTestFunction(LV2UI_Controller controller, uint32_t port_index, uint32_t buffer_size, uint32_t format, const void* buffer) { float data = *(float*)buffer; std::string sPort; const int m_iNumOfChannels = 2; const int m_iNumOfBands = 10; // Updating values in GUI ======================================================== switch (port_index) { case PORT_THRESHOLD: sPort = "Threshold"; break; case EQ_BYPASS: sPort = "Bypass"; break; case EQ_INGAIN: sPort = "In Gain"; break; case EQ_OUTGAIN: sPort = "Out Gain"; break; default: //Connect BandGain ports if((int)port_index >= (PORT_OFFSET + 2*m_iNumOfChannels) && (int)port_index < (PORT_OFFSET + 2*m_iNumOfChannels + m_iNumOfBands)) { sPort = "Band Gain "; } //Connect BandFreq ports else if((int)port_index >= (PORT_OFFSET + 2*m_iNumOfChannels + m_iNumOfBands) && (int)port_index < (PORT_OFFSET + 2*m_iNumOfChannels + 2*m_iNumOfBands)) { sPort = "Band Freq "; } //Connect BandParam ports else if((int)port_index >= (PORT_OFFSET + 2*m_iNumOfChannels + 2*m_iNumOfBands) && (int)port_index < (PORT_OFFSET + 2*m_iNumOfChannels + 3*m_iNumOfBands)) { sPort = "Band Q "; } //Connect BandType ports else if((int)port_index >= (PORT_OFFSET + 2*m_iNumOfChannels + 3*m_iNumOfBands) && (int)port_index < (PORT_OFFSET + 2*m_iNumOfChannels + 4*m_iNumOfBands)) { sPort = "Band Type "; } //Connect BandEnabled ports else if((int)port_index >= (PORT_OFFSET + 2*m_iNumOfChannels + 4*m_iNumOfBands) && (int)port_index < (PORT_OFFSET + 2*m_iNumOfChannels + 5*m_iNumOfBands)) { sPort = "Band Enabled "; } //Connect VuInput ports else if((int)port_index >= (PORT_OFFSET + 2*m_iNumOfChannels + 5*m_iNumOfBands) && (int)port_index < (PORT_OFFSET + 2*m_iNumOfChannels + 5*m_iNumOfBands + m_iNumOfChannels)) { sPort = "Vu Input"; } //Connect VuOutput ports else if((int)port_index >= (PORT_OFFSET + 2*m_iNumOfChannels + 5*m_iNumOfBands + m_iNumOfChannels) && (int)port_index < (PORT_OFFSET + 2*m_iNumOfChannels + 5*m_iNumOfBands + 2*m_iNumOfChannels)) { sPort = "Vu Output"; } //Unknown port else { sPort = "UNKNOWN"; } break; } std::cout<<"LV2 Write function tester: Port = "<< sPort << " ("<< port_index <<") Data = "<signal_Bypass_Changed().connect(sigc::mem_fun(*this, &HelloWorld::on_BypassChanged)); m_EqWin->signal_InputGain_Changed().connect(sigc::mem_fun(*this, &HelloWorld::on_InputGainChanged)); m_EqWin->signal_OutputGain_Changed().connect(sigc::mem_fun(*this, &HelloWorld::on_OutputGainChanged)); m_EqWin->signal_BandGain_Changed().connect(sigc::mem_fun(*this, &HelloWorld::on_BandGainChanged)); m_EqWin->signal_BandFreq_Changed().connect(sigc::mem_fun(*this, &HelloWorld::on_BandFreqChanged)); m_EqWin->signal_BandQ_Changed().connect(sigc::mem_fun(*this, &HelloWorld::on_BandQChanged)); m_EqWin->signal_BandType_Changed().connect(sigc::mem_fun(*this, &HelloWorld::on_BandTypeChanged)); m_EqWin->signal_BandEnabled_Changed().connect(sigc::mem_fun(*this, &HelloWorld::on_BandEnabledChanged)); **********************************************************************************************************/ //Prepare writefunction m_EqWin->write_function = writeTestFunction; m_GateWin->write_function = writeTestFunction; m_BassUp->write_function = writeTestFunction; m_MidSide->write_function = writeTestFunction; //Test scale m_TestScale.set_range(0.0 , 2.0); m_TestScale.set_value(0.0); m_TestScale.set_inverted(true); m_TestScale.signal_value_changed().connect(sigc::mem_fun(*this, &HelloWorld::on_TestScale_changed)); } HelloWorld::~HelloWorld() { delete m_EqWin; } void HelloWorld::on_TestScale_changed() { float val = (float)m_TestScale.get_value(); m_GateWin->gui_port_event(NULL, 11, 4, 0, &val ); } void HelloWorld::on_realize() { Gtk::Widget::on_realize(); //Initialize all ///TODO REMOVE float data; for( int i = 0; i < 10; i++) { data = 0; m_EqWin->gui_port_event(NULL, PORT_OFFSET + 2*2 + 4*10 + i, 4, 0, &data); } } //Slots signal handlers void HelloWorld::on_BypassChanged(bool bypass) { //std::cout<<"Bypass = "< #include "../plugins_uris.h" //Testing Headers TODO: comment define TESTING_EQ10Q for the final relase //#define TESTING_EQ10Q #ifdef TESTING_EQ10Q #include using namespace std; #endif static LV2UI_Handle instantiateMidSide_gui(const _LV2UI_Descriptor *descriptor, const char *plugin_uri, const char *bundle_path, LV2UI_Write_Function write_function, LV2UI_Controller controller, LV2UI_Widget *widget, const LV2_Feature *const *features) { #ifdef TESTING_EQ10Q cout<<"instantiateEq10q_gui Entring... "; #endif bool bIsLR2MS; bool bAllOk = false; std::string str_plugin_uri(plugin_uri); if( str_plugin_uri == LR2MS_URI ) { bIsLR2MS = true; bAllOk = true; } if( str_plugin_uri == MS2LR_URI ) { bIsLR2MS = false; bAllOk = true; } if(! bAllOk) { return NULL; } Gtk::Main::init_gtkmm_internals(); MidSideMainWindow* gui_data = new MidSideMainWindow(plugin_uri, std::string(bundle_path), bIsLR2MS); gui_data->controller = controller; gui_data->write_function = write_function; *widget = gui_data->gobj(); #ifdef TESTING_EQ10Q cout<<" Done"<(instance); MidSideMainWindow *gui = (MidSideMainWindow *)instance; delete gui; #ifdef TESTING_EQ10Q cout<<" Done"< #include #ifndef VU_H #define VU_H typedef struct { float vu_value, vu_output, vu_max, m_min, m_decay; }Vu; //Initialize the VU meter Vu *VuInit(double rate); //Destroy a Vu instance void VuClean(Vu *vu); //Clear the VU static inline void resetVU(Vu *vu) { vu->vu_max = 0.0; vu->vu_value = 0.0; } //Inputs a sample to VU static inline void SetSample(Vu *vu, float sample) { vu->vu_value = fabsf(sample); vu->vu_max = vu->vu_value > vu->vu_max ? vu->vu_value : vu->vu_max; } //Compute the VU's static inline float ComputeVu(Vu *vu, uint32_t nframes) { const float fVuOut = vu->vu_max > vu->m_min ? vu->vu_max : 0; if (vu->vu_max > vu->m_min) vu->vu_max *= pow(vu->m_decay, nframes); ///TODO: estas perdent rendiment amb akest pow!!! else vu->vu_max = 0.0; return fVuOut; } #endifeq10q-2.2/dsp/midside.h0000644000175000001440000000462713023240632014250 0ustar sapistausers/*************************************************************************** * Copyright (C) 2015 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ /*************************************************************************** This file contains Mid/Side stereo signals convertion methods ****************************************************************************/ #ifndef MIDSIDE_H #define MIDSIDE_H #define MS_DUAL_CHANNEL 0 #define MS_L_MID_MODE 1 #define MS_R_SIDE_MODE 2 //Converts a LR stereo signal to a mid/side signal. M is stored in L pointer and S in R pointer inline void LR2MS(double *inL_M, double *inR_S, double enable) { double M = 0.5*(*inL_M + *inR_S); double S = 0.5*(*inL_M - *inR_S); *inL_M = enable*M + (1.0 - enable)*(*inL_M); *inR_S = enable*S + (1.0 - enable)*(*inR_S); } //Converts a M/S stereo signal to a LR signal. L is stored in M pointer and R in S pointer inline void MS2LR(double *inM_L, double *inS_R, double enable) { double L = (*inM_L + *inS_R); double R = (*inM_L - *inS_R); *inM_L = enable*L + (1.0 - enable)*(*inM_L); *inS_R = enable*R + (1.0 - enable)*(*inS_R); } #endifeq10q-2.2/dsp/filter.c0000755000175000001440000000417413023240632014112 0ustar sapistausers/*************************************************************************** * Copyright (C) 2011 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ //#include #include #include "filter.h" //Initialize filter Filter *FilterInit(double rate) { Filter *filter = (Filter *)malloc(sizeof(Filter)); filter->fs= rate; filter->gain = 1.0f; filter->freq = 100.0f; filter->q = 1.0f; filter->enable = 0.0f; filter->iType = 0; //Interpolations filter->InterK = INTERPOLATOR_CALC_K((float)rate); filter->useInterpolation = 1.0f; return filter; } //Destroy a filter instance void FilterClean(Filter *filter) { free(filter); } //Clean buffers void flushBuffers(Buffers *buf) { buf->buf_0 = 0.0; buf->buf_1 = 0.0; buf->buf_2 = 0.0; buf->buf_e0 = 0.0; buf->buf_e1 = 0.0; buf->buf_e2 = 0.0; } eq10q-2.2/dsp/param_interpolator.h0000644000175000001440000000427013023240632016526 0ustar sapistausers/*************************************************************************** * Copyright (C) 2016 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ /*************************************************************************** This file contains the parameter interpolation ****************************************************************************/ #ifndef PARAM_INTERPOLATOR_H #define PARAM_INTERPOLATOR_H #include #include #define STEP_TIME_MS 60.0f #define INTER_OF_DEADBAND 0.001f #define INTERPOLATOR_CALC_K(x) (4e3f / (x * STEP_TIME_MS)) //Where X is sample_rate static inline float computeParamInterpolation(float target, float current, float K, float enableInterpol) { float res = current + K*(target - current); res = fabs(res - target) < fabs(INTER_OF_DEADBAND*target) ? target : res; res = enableInterpol*res + (1.0f - enableInterpol)*target; return(res); } #endifeq10q-2.2/dsp/db.h0000644000175000001440000000435113023240632013211 0ustar sapistausers/*************************************************************************** * Copyright (C) 2012 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ /*************************************************************************** This file contains the dB to linear convertion base on a LUT ****************************************************************************/ #ifndef _DB_2_LINEAR #define _DB_2_LINEAR #include "dblut.h" //Converts a value from dB to Linear 1 Linear = 0 dB static inline float dB2Lin(float dbIn) { int index = (int)(DB2LIN_M*dbIn + DB2LIN_N); index = index > 0 ? index : 0; index = index > LUT_TOP_INDEX ? LUT_TOP_INDEX : index; return dB2Lin_LUT[index]; } //Converts a value from Linear to dB 1 Linear = 0 dB static inline float Lin2dB(float LinIn) { int index = (int)(LIN2DB_M*LinIn + LIN2DB_N); index = index > 0 ? index : 0; index = index > LUT_TOP_INDEX ? LUT_TOP_INDEX : index; return Lin2dB_LUT[index]; } #endifeq10q-2.2/dsp/filter.h0000755000175000001440000002477313023240632014126 0ustar sapistausers/*************************************************************************** * Copyright (C) 2011 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ /*************************************************************************** This file contains the filter definitions ****************************************************************************/ #ifndef FILTER_H #define FILTER_H #include #include "param_interpolator.h" //#include //Constants definitions #ifndef PI #define PI 3.1416 #endif #define F_NOT_SET 0 #define F_LPF_ORDER_1 1 #define F_LPF_ORDER_2 2 #define F_LPF_ORDER_3 3 #define F_LPF_ORDER_4 4 #define F_HPF_ORDER_1 5 #define F_HPF_ORDER_2 6 #define F_HPF_ORDER_3 7 #define F_HPF_ORDER_4 8 #define F_LOW_SHELF 9 #define F_HIGH_SHELF 10 #define F_PEAK 11 #define F_NOTCH 12 typedef struct { double b0, b1, b2, a1, a2; //Second Order coeficients double b1_0, b1_1, b1_2, a1_1, a1_2; //Second Order extra coeficients int filter_order; //filter order double fs; //sample rate float gain, freq, q; double enable; int iType; //Filter type //Interpolation K float InterK; float useInterpolation; }Filter; typedef struct { double buf_0; double buf_1; double buf_2; double buf_e0; double buf_e1; double buf_e2; }Buffers; //Initialize filter instance Filter *FilterInit(double rate); //Destroy a filter instance void FilterClean(Filter *f); //Clean buffers void flushBuffers(Buffers *buf); //Compute filter coeficients static inline void calcCoefs(Filter *filter, float fGain, float fFreq, float fQ, int iType, float iEnabled) //p2 = GAIN p3 = Q { double alpha, A, b0, b1, b2, a0, a1, a2, b1_0, b1_1, b1_2, a1_0, a1_1, a1_2; alpha = A = b0 = b1 = b2 = a0 = a1 = a2 = b1_0 = b1_1 = b1_2 = a1_0 = a1_1 = a1_2 = 1.0; filter->filter_order = 0; //Param Interpolation filter->freq = computeParamInterpolation(fFreq, filter->freq, filter->InterK, filter->useInterpolation); filter->gain = computeParamInterpolation(fGain, filter->gain, filter->InterK, filter->useInterpolation); filter->q = computeParamInterpolation(fQ, filter->q, filter->InterK, filter->useInterpolation); filter->enable = (double)computeParamInterpolation(iEnabled, (float)filter->enable, filter->InterK, filter->useInterpolation); double w0=2*PI*(filter->freq/filter->fs); filter->iType = iType; switch(iType){ case F_HPF_ORDER_1: { w0 = tanf(w0/2.0); b0 = 1.0; b1 = -1.0; b2 = 0.0; a0 = w0+1.0; a1 = w0-1.0; a2 = 0.0; } break; case F_HPF_ORDER_4: { filter->filter_order = 1; case F_HPF_ORDER_2: alpha = sinf(w0)/(2*filter->q); b1_0 = b0 = (1 + cosf(w0))/2; //b0 b1_1 = b1 = -(1 + cosf(w0)); //b1 b1_2 = b2 = (1 + cosf(w0))/2; //b2 a1_0 = a0 = 1 + alpha; //a0 a1_1 = a1 = -2*cosf(w0); //a1 a1_2 = a2 = 1 - alpha; //a2 } break; case F_HPF_ORDER_3: { filter->filter_order = 1; alpha = sinf(w0)/(2*filter->q); b0 = (1 + cosf(w0))/2; //b0 b1 = -(1 + cosf(w0)); //b1 b2 = (1 + cosf(w0))/2; //b2 a0 = 1 + alpha; //a0 a1 = -2*cosf(w0); //a1 a2 = 1 - alpha; //a2 w0 = tanf(w0/2.0); b1_0 = 1.0; b1_1 = -1.0; b1_2 = 0.0; a1_0 = w0+1.0; a1_1 = w0-1.0; a1_2 = 0.0; } break; case F_LPF_ORDER_1: { w0 = tanf(w0/2.0); b0 = w0; b1 = w0; b2 = 0.0; a0 = w0+1.0; a1 = w0-1.0; a2 = 0.0; } break; case F_LPF_ORDER_4: { filter->filter_order = 1; case F_LPF_ORDER_2: alpha = sinf(w0)/(2*filter->q); b1_0 = b0 = (1 - cosf(w0))/2; //b0 b1_1 = b1 = 1 - cosf(w0); //b1 b1_2 = b2 = (1 - cosf(w0))/2; //b2 a1_0 = a0 = 1 + alpha; //a0 a1_1 = a1 = -2*cosf(w0); //a1 a1_2 = a2 = 1 - alpha; //a2 } break; case F_LPF_ORDER_3: { filter->filter_order = 1; alpha = sinf(w0)/(2*filter->q); b0 = (1 - cosf(w0))/2; //b0 b1 = 1 - cosf(w0); //b1 b2 = (1 - cosf(w0))/2; //b2 a0 = 1 + alpha; //a0 a1 = -2*cosf(w0); //a1 a2 = 1 - alpha; //a2 w0 = tanf(w0/2.0); b1_0 = w0; b1_1 = w0; b1_2 = 0.0; a1_0 = w0+1.0; a1_1 = w0-1.0; a1_2 = 0.0; } break; case F_LOW_SHELF: { A = sqrtf((filter->gain)); alpha =sinf(w0)/2 * (1/filter->q); b0 = A*((A+1)-(A-1)*cosf(w0)+2*sqrtf(A)*alpha); //b0 b1 = 2*A*((A-1)-(A+1)*cosf(w0)); //b1 b2 = A*((A+1)-(A-1)*cosf(w0)-2*sqrtf(A)*alpha); //b2 a0 = (A+1) + (A-1)*cosf(w0) + 2*sqrtf(A)*alpha; //a0 a1 = -2*((A-1) + (A+1)*cosf(w0)); //a1 a2 = (A+1) + (A-1)*cosf(w0) - 2*sqrtf(A)*alpha; //a2 } break; case F_HIGH_SHELF: { A = sqrtf((filter->gain)); alpha =sinf(w0)/2 * (1/filter->q); b0 = A*( (A+1) + (A-1)*cosf(w0) + 2*sqrtf(A)*alpha ); //b0 b1 = -2*A*( (A-1) + (A+1)*cosf(w0)); //b1 b2 = A*( (A+1) + (A-1)*cosf(w0) - 2*sqrtf(A)*alpha ); //b2 a0 = (A+1) - (A-1)*cosf(w0) + 2*sqrtf(A)*alpha; //a0 a1 = 2*( (A-1) - (A+1)*cosf(w0)); //a1 a2 = (A+1) - (A-1)*cosf(w0) - 2*sqrtf(A)*alpha; //a2 } break; case F_PEAK: { A = sqrtf(filter->gain); double A2 = A*A; double PI2 = PI*PI; double Q2 = filter->q*filter->q; double w02 = w0 * w0; double w02_PI22 = (w02 - PI2)*(w02 - PI2); //Equivalent analog filter and analog gains double G1 = sqrtf((w02_PI22 + (A2*w02*PI2)/Q2)/(w02_PI22 + (w02*PI2)/(Q2*A2))); double GB = sqrt(G1*filter->gain); double GB2 = GB * GB; double G2 = filter->gain * filter->gain; double G12 = G1 * G1; //Digital filter double F = fabsf(G2 - GB2);// + 0.00000001f; ///TODO akest petit num sumat en teoria no hi va pero he detectat div by 0 double G00 = fabsf(G2 - 1.0);// + 0.00000001f; ///TODO akest petit num sumat en teoria no hi va pero he detectat div by 0 double F00 = fabsf(GB2 - 1.0);// + 0.00000001f; ///TODO akest petit num sumat en teoria no hi va pero he detectat div by 0 double G01 = fabsf(G2 - G1);// + 0.00000001f; ///TODO akest petit num sumat en teoria no hi va pero he detectat div by 0 double G11 = fabsf(G2 - G12);// + 0.00000001f; ///TODO akest petit num sumat en teoria no hi va pero he detectat div by 0 double F01 = fabsf(GB2 - G1);// + 0.00000001f; ///TODO akest petit num sumat en teoria no hi va pero he detectat div by 0 double F11 = fabsf(GB2 - G12);// + 0.00000001f; ///TODO akest petit num sumat en teoria no hi va pero he detectat div by 0 double W2 = sqrtf(G11 / G00) * tanf(w0/2.0) * tanf(w0/2.0); //Bandwidth condition double Aw = (w0/(A*filter->q))*sqrtf((GB2-A2 * A2)/(1.0 - GB2)); //Analog filter bandwidth at GB double DW = (1.0 + sqrtf(F00 / F11) * W2) * tanf(Aw/2.0); //Prewarped digital bandwidth //printf("G1=%f Aw=%f DW=%f F11=%f GB2=%f G12=%f\r\n",G1,Aw,DW,F11,GB2,G12); //Digital coefs double C = F11 * DW * DW - 2.0 * W2 * (F01 - sqrtf(F00 * F11)); double D = 2.0 * W2 * (G01 - sqrtf(G00 * G11)); double A = sqrtf((C + D) / F); double B = sqrtf((G2 * C + GB2 * D) / F); //printf("A=%f B=%f C=%f D=%f W2=%f F=%f G2=%f GB2=%f\r\n", A, B, C, D, W2, F, G2, GB2 ); if( filter->gain > 1.01 || filter->gain < 0.98 ) { b0 = G1 + W2 + B; b1 = -2.0*(G1 - W2); b2 = G1 - B + W2; a0 = 1.0 + W2 + A; a1 = -2.0*(1.0 - W2); a2 = 1.0 + W2 - A; } else { b0 = 1.0; b1 = 0.0; b2 = 0.0; a0 = 1.0; a1 = 0.0; a2 = 0.0; } } break; case F_NOTCH: { alpha = sinf(w0)/(2*filter->q); b0 = 1; //b0 b1 = -2*cosf(w0); //b1 b2 = 1; //b2 a0 = 1 + alpha; //a0 a1 = -2*cosf(w0); //a1 a2 = 1 - alpha; //a2 } break; } //End of switch //Normalice coeficients to a0=1 filter->b0 = (b0/a0); //b0 filter->b1 = (b1/a0); //b1 filter->b2 = (b2/a0); //b2 filter->a1 = (a1/a0); //a1 filter->a2 = (a2/a0); //a2 filter->b1_0 = (b1_0/a1_0); filter->b1_1 = (b1_1/a1_0); filter->b1_2 = (b1_2/a1_0); filter->a1_1 = (a1_1/a1_0); filter->a1_2 = (a1_2/a1_0); //Print coefs //printf("Coefs b0=%f b1=%f b2=%f a1=%f a2=%f\r\n",filter->b0,filter->b1,filter->b2,filter->a1,filter->a2); //printf("Gain = %f Freq = %f Q = %f\r\n", filter->gain, filter->freq, filter->q); } #define DENORMAL_TO_ZERO(x) if (fabs(x) < (1e-300)) x = 0.0; //Min float is 1.1754943e-38 (Min double is 2.23×10−308) //Compute filter static inline void computeFilter(Filter *filter, Buffers *buf, double *inputSample) { //Process 1, 2 orders //w(n)=x(n)-a1*w(n-1)-a2*w(n-2) buf->buf_0 = (*inputSample)-filter->a1*buf->buf_1-filter->a2*buf->buf_2; /* //Denomar hard TEST static unsigned int den_counter = 0; if (fabs(buf->buf_0) < (1e-30)) { den_counter++; printf("#DENORMAL# %d\r\n",den_counter); } */ DENORMAL_TO_ZERO(buf->buf_0); //y(n)=bo*w(n)+b1*w(n-1)+b2*w(n-2) *inputSample = (filter->b0*buf->buf_0 + filter->b1*buf->buf_1+ filter->b2*buf->buf_2) * filter->enable + (*inputSample)*(1.0 - filter->enable); buf->buf_2 = buf->buf_1; buf->buf_1 = buf->buf_0; //Process 3,4 orders if apply if(filter->filter_order) { //w(n)=x(n)-a1*w(n-1)-a2*w(n-2) buf->buf_e0 = (*inputSample)-filter->a1_1*buf->buf_e1-filter->a1_2*buf->buf_e2; //y(n)=bo*w(n)+b1*w(n-1)+b2*w(n-2) DENORMAL_TO_ZERO(buf->buf_e0); *inputSample = (filter->b1_0*buf->buf_e0 + filter->b1_1*buf->buf_e1+ filter->b1_2*buf->buf_e2) * filter->enable + (*inputSample)*(1.0 - filter->enable); buf->buf_e2 = buf->buf_e1; buf->buf_e1 = buf->buf_e0; } } #endifeq10q-2.2/dsp/vu.c0000755000175000001440000000411213023240632013247 0ustar sapistausers/*************************************************************************** * Copyright (C) 2011 by Pere R�fols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ /*************************************************************************** This file contains a VU meter implementation ****************************************************************************/ #include "vu.h" //#include #include //Constant to dBu conversion is sqrt(2) #define CONSTANT_VU 1.4142136 //Initialize the VU meter Vu *VuInit(double rate) { Vu *vu = (Vu *)malloc(sizeof(Vu)); vu->vu_value = 0.0; vu->vu_max = 0.0; vu->m_min = (1.0 / 256); vu->m_decay = exp( -1.0 / rate); return vu; } //Destroy a Vu instance void VuClean(Vu *vu){ free(vu); } eq10q-2.2/dsp/CMakeLists.txt0000644000175000001440000000021213023240632015203 0ustar sapistausers###DSP CMake ##Build Mono Filter lib add_library(lib_filter STATIC filter.c) ##Build the vumeter add_library( lib_vumeter STATIC vu.c) eq10q-2.2/dsp/fastmath.h0000644000175000001440000001305313023240632014432 0ustar sapistausers/*************************************************************************** * Copyright (C) 2012 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _EQ10Q_FAST_MATH #define _EQ10Q_FAST_MATH #include #include //LUT addr size #define LUT_ADDR_LENGTH 8 // Compute fast log10 using DSP Guru trick // Observa que akest metode no utilitza per res el signe, de forma que fa el valor absolut de forma intrinseca! t'estalvies el detector de pic! // x: Input value RAW BITS format IEE745 // returns: Fast log10 value static inline float fastLog10(int *x_bits, float *Log10LUT) { // log10(N) = log10(M) + E*log10(2) return (Log10LUT[(*x_bits & 0x7FFFFF) >> (23 - LUT_ADDR_LENGTH)] + (float)((0x0FF & ((*x_bits >> 23))) - 127) * 0.30102999566398119521373889472449f); } // Compute fast log using DSP Guru trick // Observa que akest metode no utilitza per res el signe, de forma que fa el valor absolut de forma intrinseca! t'estalvies el detector de pic! // x: Input value RAW BITS format IEE745 // returns: Fast log value static inline float fastLog(int *x_bits, float *LogLUT) { // log(N) = log(M) + E*log(2) return (LogLUT[(*x_bits & 0x7FFFFF) >> (23 - LUT_ADDR_LENGTH)] + (float)((0x0FF & ((*x_bits >> 23))) - 127) * 0.693147180559945f); } // Conversion of binary mantissa 2 decimal float GetBinaryFraction(int x) { float res = 0; int i; for (i = 22; i >=0; i--) { int b = x >> i; b &= 0x01; res += (float)(b) * powf(2.0f, (float)(i) - 23.0f); } return res; } // Generate LUT for mantissa log float* GenerateLogLUT() { int i; float matissa = 1.0f; int size = (int)( powf(2.0f, LUT_ADDR_LENGTH)); float *LogLUT = (float *)malloc(sizeof(float)*size); for (i = 0; i < size; i++) { int M = (int)i << (23 - LUT_ADDR_LENGTH); matissa = GetBinaryFraction(M) + 1.0f; LogLUT[i] = logf(matissa); } return LogLUT; } // Generate LUT for mantissa log10 float* GenerateLog10LUT() { int i; float matissa = 1.0f; int size = (int)( powf(2.0f, LUT_ADDR_LENGTH)); float *Log10LUT = (float *)malloc(sizeof(float)*size); for (i = 0; i < size; i++) { int M = (int)i << (23 - LUT_ADDR_LENGTH); matissa = GetBinaryFraction(M) + 1.0f; Log10LUT[i] = log10f(matissa); } return Log10LUT; } // Fast dB to Linear conversion using 8 Taylor Series members // Is aprox a 14% faster than Fast_dB2Lin10() but less acurate // Input Range at less 1 dB error: 70dB (from -52 dB to 18 dB) // Input Range at less 0,5 dB error: 63dB (from -51 dB to 12 dB) static inline float Fast_dB2Lin8(float x) { float xa = x + 30.0f; //Error = 0 centrat a -30dB //k1 k2 k3 k4 k5 //0.031622777f 0.003640707f 0.000209576f 8.04277e-6f 2.3149e-7f //k6 k7 k8 k9 //5.33025e-9f 1.02278e-10f 1.68217e-12f 2.42083e-14f if (x > -60.0f) //Clip on -60dB because the Taylor aprox starts to deviate at these point { return (0.031622777f + xa * (0.003640707f + xa * (0.000209576f + xa * (8.04277e-6f + xa * (2.3149e-7f + xa * (5.33025e-9f + xa * (1.02278e-10f + xa * (1.68217e-12f + xa * 2.42083e-14f)))))))); } else { return 0.001f; } } // Fast dB to Linear conversion using 10 Taylor Series members // Is aprox a 14% slower than Fast_dB2Lin8() but more acurate // Input Range at less 1 dB error: 89dB (from -67 dB to 22 dB) // Input Range at less 0,5 dB error: 81dB (from -65 dB to 16 dB) static inline float Fast_dB2Lin10(float x) { float xa = x + 40.0f; //Error = 0 centrat a -40dB //k1 k2 k3 k4 //0.01f 0.001151293f 6.62737e-5f 2.54335e-6f //k5 k6 k7 k8 //7.32034e-8f 1.68557e-9f 3.23431e-11f 5.31948e-13f //k9 k10 k11 //7.65535e-15f 9.79283e-17f 1.12744e-18f if (x > -67.0f) //Clip on -67dB because the Taylor aprox starts to deviate at these point { return (0.01f + xa * (0.001151293f + xa * (6.62737e-5f + xa * (2.54335e-6f + xa * (7.32034e-8f + xa * (1.68557e-9f + xa * (3.23431e-11f + xa * (5.31948e-13f + xa * (7.65535e-15f + xa * (9.79283e-17f + xa * 1.12744e-18f)))))))))); } else { return 0.0004466835921509630484560471330723885330371558666229248046875f; } } #endifeq10q-2.2/compressor_stereo.ttl0000644000175000001440000001265413023240623016174 0ustar sapistausers@prefix lv2: . @prefix foaf: . @prefix doap: . @prefix guiext: . @prefix units: . @prefix pprop: . a foaf:Person ; foaf:name "Pere Ràfols Soler" ; foaf:mbox ; foaf:homepage . a doap:Project ; doap:maintainer ; doap:name "EQ10Q plugins" . ##LV2 GUI extension a guiext:GtkUI; guiext:binary ; lv2:optionalFeature guiext:noUserResize. ##LV2 plugin binary a lv2:Plugin, lv2:CompressorPlugin, doap:Project; lv2:binary ; doap:name "CS10QS"; doap:license ; lv2:optionalFeature lv2:hardRTCapable; lv2:project ; guiext:ui ; lv2:port [ a lv2:AudioPort, lv2:OutputPort; lv2:index 0; lv2:symbol "output"; lv2:name "Output"; ], [ a lv2:AudioPort, lv2:InputPort; lv2:index 1; lv2:symbol "input"; lv2:name "Input"; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 2; lv2:symbol "keylisten"; lv2:name "Key Listen"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 3; lv2:symbol "threshold"; lv2:name "Threshold (dB)"; lv2:minimum -46; lv2:maximum 4; lv2:default -10; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 4; lv2:symbol "attack"; lv2:name "Attack (ms)"; lv2:minimum 0.01; lv2:maximum 500; lv2:default 10; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 5; lv2:symbol "compmakeup"; lv2:name "Makeup (dB)"; lv2:minimum 0; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 6; lv2:symbol "decay"; lv2:name "Decay (ms)"; lv2:minimum 5; lv2:maximum 4000; lv2:default 250; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 7; lv2:symbol "compratio"; lv2:name "Ratio (dB)"; lv2:minimum 1; lv2:maximum 100; lv2:default 6; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 8; lv2:symbol "hpf"; lv2:name "HPF Key Filter (Hz)"; lv2:minimum 20; lv2:maximum 20000; lv2:default 20; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 9; lv2:symbol "lpf"; lv2:name "LPF Key Filter (Hz)"; lv2:minimum 20; lv2:maximum 20000; lv2:default 20000; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 10; lv2:symbol "ingain"; lv2:name "Gain (dB)"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 11; lv2:symbol "out_vu_ctl"; lv2:name "Out VU CTL"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 12; lv2:symbol "gateled"; lv2:name "Gain Reduction"; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 13; lv2:symbol "knee"; lv2:name "Knee (dB)"; lv2:minimum 0; lv2:maximum 20; lv2:default 6; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 14; lv2:symbol "drywet"; lv2:name "Dry/Wet"; lv2:minimum 0; lv2:maximum 1; lv2:default 1; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 15; lv2:symbol "isfeedbackcompressor"; lv2:name "FeedBack Compressor"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 16; lv2:symbol "compressorMode"; lv2:name "Compressor Mode"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 17; lv2:symbol "punch"; lv2:name "Punch"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; ], [ a lv2:AudioPort, lv2:OutputPort; lv2:index 18; lv2:symbol "outputR"; lv2:name "OutputR"; ], [ a lv2:AudioPort, lv2:InputPort; lv2:index 19; lv2:symbol "inputR"; lv2:name "InputR"; ]. eq10q-2.2/gate.ttl0000644000175000001440000001107413023240623013332 0ustar sapistausers@prefix lv2: . @prefix foaf: . @prefix doap: . @prefix guiext: . @prefix units: . @prefix pprop: . a foaf:Person ; foaf:name "Pere Ràfols Soler" ; foaf:mbox ; foaf:homepage . a doap:Project ; doap:maintainer ; doap:name "EQ10Q plugins" . ##LV2 GUI extension a guiext:GtkUI; guiext:binary ; lv2:optionalFeature guiext:noUserResize. ##LV2 plugin binary a lv2:Plugin, lv2:GatePlugin, doap:Project; lv2:binary ; doap:name "GT10QM"; doap:license ; lv2:optionalFeature lv2:hardRTCapable; lv2:project ; guiext:ui ; lv2:port [ a lv2:AudioPort, lv2:OutputPort; lv2:index 0; lv2:symbol "output"; lv2:name "Output"; ], [ a lv2:AudioPort, lv2:InputPort; lv2:index 1; lv2:symbol "input"; lv2:name "Input"; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 2; lv2:symbol "keylisten"; lv2:name "Key Listen"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 3; lv2:symbol "threshold"; lv2:name "Threshold (dB)"; lv2:minimum -46; lv2:maximum 4; lv2:default -10; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 4; lv2:symbol "attack"; lv2:name "Attack (ms)"; lv2:minimum 0.01; lv2:maximum 500; lv2:default 5; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 5; lv2:symbol "hold"; lv2:name "Hold (ms)"; lv2:minimum 0.01; lv2:maximum 3000; lv2:default 100; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 6; lv2:symbol "decay"; lv2:name "Decay (ms)"; lv2:minimum 5; lv2:maximum 4000; lv2:default 250; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 7; lv2:symbol "compratio"; lv2:name "Ratio (dB)"; lv2:minimum 1; lv2:maximum 100; lv2:default 100; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 8; lv2:symbol "hpf"; lv2:name "HPF Key Filter (Hz)"; lv2:minimum 20; lv2:maximum 20000; lv2:default 20; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 9; lv2:symbol "lpf"; lv2:name "LPF Key Filter (Hz)"; lv2:minimum 20; lv2:maximum 20000; lv2:default 20000; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 10; lv2:symbol "ingain"; lv2:name "Gain (dB)"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 11; lv2:symbol "out_vu_ctl"; lv2:name "Out VU CTL"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 12; lv2:symbol "gateled"; lv2:name "Gain Reduction"; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 13; lv2:symbol "knee"; lv2:name "Knee (dB)"; lv2:minimum 0; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 14; lv2:symbol "drywet"; lv2:name "Dry/Wet"; lv2:minimum 0; lv2:maximum 1; lv2:default 1; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 15; lv2:symbol "gaterange"; lv2:name "Range (dB)"; lv2:minimum -90; lv2:maximum -1; lv2:default -90; units:unit units:db; ]. eq10q-2.2/midside_matrix.c0000644000175000001440000002203313023240623015030 0ustar sapistausers/*************************************************************************** * Copyright (C) 2015 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ /*************************************************************************** This file is the implementation of the MidSide Matrix plugin This plugin is inside the Sapista Plugins Bundle This file implements functionalities for lr2ms and ms2lr matrices ****************************************************************************/ #include #include #include #include "dsp/vu.h" #include "dsp/db.h" #include "dsp/midside.h" //Data from CMake #define MATRIX_URI @Matrix_Uri@ #define IS_LR2MS @Matrix_Is_LR2MS@ //If is defined to 1 is in LR2MS mode otherwise is MS2LR //Port definitions #define PORT_AUDIO_IN_1 0 #define PORT_AUDIO_IN_2 1 #define PORT_AUDIO_OUT_1 2 #define PORT_AUDIO_OUT_2 3 #define PORT_GAIN_IN_1 4 #define PORT_GAIN_IN_2 5 #define PORT_GAIN_OUT_1 6 #define PORT_GAIN_OUT_2 7 #define PORT_SOLO_IN_1 8 #define PORT_SOLO_IN_2 9 #define PORT_SOLO_OUT_1 10 #define PORT_SOLO_OUT_2 11 #define PORT_VU_IN_1 12 #define PORT_VU_IN_2 13 #define PORT_VU_OUT_1 14 #define PORT_VU_OUT_2 15 typedef struct { //Plugin ports float *fInGain1; //Its L for lr2ms and M for ms2lr float *fInGain2; //Its R for lr2ms and S for ms2lr float *fOutGain1; //Its M for lr2ms and L for ms2lr float *fOutGain2; //Its S for lr2ms and R for ms2lr float *fSoloIn1; //Its L for lr2ms and M for ms2lr float *fSoloIn2; //Its R for lr2ms and S for ms2lr float *fSoloOut1; //Its M for lr2ms and L for ms2lr float *fSoloOut2; //Its S for lr2ms and R for ms2lr const float *input[2]; float *output[2]; float *fVuIn[2]; float *fVuOut[2]; //Internal data Vu *InputVu[2]; Vu *OutputVu[2]; float sample_rate; //Matrix routing vars double RG_in1, RG_in2, RG_out11, RG_out12, RG_out21, RG_out22; } MidSideMatrix; static void cleanupMatrix(LV2_Handle instance) { MidSideMatrix *plugin = (MidSideMatrix *)instance; int i; for(i=0; i<2; i++) { VuClean(plugin->InputVu[i]); VuClean(plugin->OutputVu[i]); } free(instance); } static void connectPortMatrix(LV2_Handle instance, uint32_t port, void *data) { MidSideMatrix *plugin = (MidSideMatrix *)instance; switch (port) { case PORT_AUDIO_IN_1: plugin->input[0] = (const float*)data;; break; case PORT_AUDIO_IN_2: plugin->input[1] = (const float*)data;; break; case PORT_AUDIO_OUT_1: plugin->output[0] = (float*)data; break; case PORT_AUDIO_OUT_2: plugin->output[1] = (float*)data; break; case PORT_GAIN_IN_1: plugin->fInGain1 = (float*)data; break; case PORT_GAIN_IN_2: plugin->fInGain2 = (float*)data; break; case PORT_GAIN_OUT_1: plugin->fOutGain1 = (float*)data; break; case PORT_GAIN_OUT_2: plugin->fOutGain2 = (float*)data; break; case PORT_SOLO_IN_1: plugin->fSoloIn1 = (float*)data; break; case PORT_SOLO_IN_2: plugin->fSoloIn2 = (float*)data; break; case PORT_SOLO_OUT_1: plugin->fSoloOut1 = (float*)data; break; case PORT_SOLO_OUT_2: plugin->fSoloOut2 = (float*)data; break; case PORT_VU_IN_1: plugin->fVuIn[0]=(float*)data; break; case PORT_VU_IN_2: plugin->fVuIn[1]=(float*)data; break; case PORT_VU_OUT_1: plugin->fVuOut[0]=(float*)data; break; case PORT_VU_OUT_2: plugin->fVuOut[1]=(float*)data; break; } } static LV2_Handle instantiateMatrix(const LV2_Descriptor *descriptor, double s_rate, const char *path, const LV2_Feature *const * features) { MidSideMatrix *plugin_data = (MidSideMatrix *)malloc(sizeof(MidSideMatrix)); plugin_data->sample_rate = s_rate; plugin_data->InputVu[0] = VuInit(s_rate); plugin_data->InputVu[1] = VuInit(s_rate); plugin_data->OutputVu[0] = VuInit(s_rate); plugin_data->OutputVu[1] = VuInit(s_rate); plugin_data->RG_in1 = 0.0f; plugin_data->RG_in2 = 0.0f; plugin_data->RG_out11 = 0.0f; plugin_data->RG_out12 = 0.0f; plugin_data->RG_out21 = 0.0f; plugin_data->RG_out22 = 0.0f; return (LV2_Handle)plugin_data; } static void runMatrix(LV2_Handle instance, uint32_t sample_count) { MidSideMatrix *plugin_data = (MidSideMatrix *)instance; const double gain_in_1 = (double) dB2Lin(*(plugin_data->fInGain1)); const double gain_in_2 = (double) dB2Lin(*(plugin_data->fInGain2)); const double gain_out_1 = (double) dB2Lin(*(plugin_data->fOutGain1)); const double gain_out_2 = (double) dB2Lin(*(plugin_data->fOutGain2)); const float solo_in_1 = *(plugin_data->fSoloIn1); const float solo_in_2 = *(plugin_data->fSoloIn2); const float solo_out_1 = *(plugin_data->fSoloOut1); const float solo_out_2 = *(plugin_data->fSoloOut2); //Set RG constants acording SOLO state plugin_data-> RG_in1 = 0.0; plugin_data-> RG_in2 = 0.0; plugin_data->RG_out11 = 1.0; plugin_data->RG_out12 = 0.0; plugin_data->RG_out21 = 0.0; plugin_data->RG_out22 = 1.0; if( solo_out_1 > 0.5) { plugin_data-> RG_in1 = 0.0; plugin_data-> RG_in2 = 0.0; plugin_data->RG_out11 = 1.0; plugin_data->RG_out12 = 1.0; plugin_data->RG_out21 = 0.0; plugin_data->RG_out22 = 0.0; } if( solo_out_2 > 0.5) { plugin_data-> RG_in1 = 0.0; plugin_data-> RG_in2 = 0.0; plugin_data->RG_out11 = 0.0; plugin_data->RG_out12 = 0.0; plugin_data->RG_out21 = 1.0; plugin_data->RG_out22 = 1.0; } if( solo_in_1 > 0.5 ) { plugin_data-> RG_in1 = 1.0; plugin_data-> RG_in2 = 0.0; plugin_data->RG_out11 = 0.0; plugin_data->RG_out12 = 0.0; plugin_data->RG_out21 = 0.0; plugin_data->RG_out22 = 0.0; } if( solo_in_2 > 0.5) { plugin_data-> RG_in1 = 0.0; plugin_data-> RG_in2 = 1.0; plugin_data->RG_out11 = 0.0; plugin_data->RG_out12 = 0.0; plugin_data->RG_out21 = 0.0; plugin_data->RG_out22 = 0.0; } double sgn1_pre = 0.0, sgn2_pre = 0.0, sgn1_post = 0.0, sgn2_post = 0.0; //Internal signals for (uint32_t i = 0; i < sample_count; ++i) { //Input Gains sgn1_pre = (double) (plugin_data->input[0][i]) * gain_in_1; sgn2_pre = (double) (plugin_data->input[1][i]) * gain_in_2; sgn1_post = sgn1_pre; sgn2_post = sgn2_pre; #if IS_LR2MS == 1 LR2MS(&sgn1_post, &sgn2_post, 1.0); #else MS2LR(&sgn1_post, &sgn2_post, 1.0); #endif //Output Gains sgn1_post *= gain_out_1; sgn2_post *= gain_out_2; //Update VU's SetSample(plugin_data->InputVu[0], (float)sgn1_pre); SetSample(plugin_data->InputVu[1], (float)sgn2_pre); SetSample(plugin_data->OutputVu[0], (float)sgn1_post); SetSample(plugin_data->OutputVu[1], (float)sgn2_post); //Set outputs plugin_data->output[0][i] = plugin_data->RG_in1 * sgn1_pre + plugin_data->RG_in2 * sgn2_pre + plugin_data->RG_out11 * sgn1_post + plugin_data->RG_out21 * sgn2_post; plugin_data->output[1][i] = plugin_data->RG_in1 * sgn1_pre + plugin_data->RG_in2 * sgn2_pre + plugin_data->RG_out12 * sgn1_post + plugin_data->RG_out22 * sgn2_post; } //Refresh VU's *(plugin_data->fVuIn[0]) = ComputeVu(plugin_data->InputVu[0], sample_count); *(plugin_data->fVuIn[1]) = ComputeVu(plugin_data->InputVu[1], sample_count); *(plugin_data->fVuOut[0]) = ComputeVu(plugin_data->OutputVu[0], sample_count); *(plugin_data->fVuOut[1]) = ComputeVu(plugin_data->OutputVu[1], sample_count); } static const LV2_Descriptor msMatrixDescriptor = { MATRIX_URI, instantiateMatrix, connectPortMatrix, NULL, runMatrix, NULL, cleanupMatrix, NULL }; LV2_SYMBOL_EXPORT const LV2_Descriptor *lv2_descriptor(uint32_t index) { switch (index) { case 0: return &msMatrixDescriptor; default: return NULL; } } eq10q-2.2/compressor_sc.ttl0000644000175000001440000001251113023240623015270 0ustar sapistausers@prefix lv2: . @prefix foaf: . @prefix doap: . @prefix guiext: . @prefix units: . @prefix pprop: . a foaf:Person ; foaf:name "Pere Ràfols Soler" ; foaf:mbox ; foaf:homepage . a doap:Project ; doap:maintainer ; doap:name "EQ10Q plugins" . ##LV2 GUI extension a guiext:GtkUI; guiext:binary ; lv2:optionalFeature guiext:noUserResize. ##LV2 plugin binary a lv2:Plugin, lv2:CompressorPlugin, doap:Project; lv2:binary ; doap:name "CS10QM-SC"; doap:license ; lv2:optionalFeature lv2:hardRTCapable; lv2:project ; guiext:ui ; lv2:port [ a lv2:AudioPort, lv2:OutputPort; lv2:index 0; lv2:symbol "output"; lv2:name "Output"; ], [ a lv2:AudioPort, lv2:InputPort; lv2:index 1; lv2:symbol "input"; lv2:name "Input"; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 2; lv2:symbol "keylisten"; lv2:name "Key Listen"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 3; lv2:symbol "threshold"; lv2:name "Threshold (dB)"; lv2:minimum -46; lv2:maximum 4; lv2:default -10; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 4; lv2:symbol "attack"; lv2:name "Attack (ms)"; lv2:minimum 0.01; lv2:maximum 500; lv2:default 10; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 5; lv2:symbol "compmakeup"; lv2:name "Makeup (dB)"; lv2:minimum 0; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 6; lv2:symbol "decay"; lv2:name "Decay (ms)"; lv2:minimum 5; lv2:maximum 4000; lv2:default 250; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 7; lv2:symbol "compratio"; lv2:name "Ratio (dB)"; lv2:minimum 1; lv2:maximum 100; lv2:default 6; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 8; lv2:symbol "hpf"; lv2:name "HPF Key Filter (Hz)"; lv2:minimum 20; lv2:maximum 20000; lv2:default 20; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 9; lv2:symbol "lpf"; lv2:name "LPF Key Filter (Hz)"; lv2:minimum 20; lv2:maximum 20000; lv2:default 20000; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 10; lv2:symbol "ingain"; lv2:name "Gain (dB)"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 11; lv2:symbol "out_vu_ctl"; lv2:name "Out VU CTL"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 12; lv2:symbol "gateled"; lv2:name "Gain Reduction"; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 13; lv2:symbol "knee"; lv2:name "Knee (dB)"; lv2:minimum 0; lv2:maximum 20; lv2:default 6; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 14; lv2:symbol "drywet"; lv2:name "Dry/Wet"; lv2:minimum 0; lv2:maximum 1; lv2:default 1; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 15; lv2:symbol "isSideChainActive"; lv2:name "SideChain Active"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 16; lv2:symbol "compressorMode"; lv2:name "Compressor Mode"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 17; lv2:symbol "punch"; lv2:name "Punch"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; ], [ a lv2:AudioPort, lv2:InputPort; lv2:index 18; lv2:symbol "inputSC"; lv2:name "InputSC"; lv2:portProperty lv2:isSideChain; ]. eq10q-2.2/eq.c0000755000175000001440000005330513023240623012444 0ustar sapistausers/*************************************************************************** * Copyright (C) 2011 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ /*************************************************************************** This file is the implementation of the EQ plugin This plugin is inside the Sapista Plugins Bundle This file implements functionalities for a large numbers of equalizers ****************************************************************************/ #include #include #include #include #include #include #include #include "uris.h" #include "gui/eq_defines.h" #include "dsp/vu.h" #include "dsp/db.h" #include "dsp/filter.h" #include "dsp/midside.h" //Data from CMake #define NUM_BANDS @Eq_Bands_Count@ #define NUM_CHANNELS @Eq_Channels_Count@ #define EQ_URI @Eq_Uri@ typedef struct { //Plugin ports float *fBypass; float *fInGain; float *fOutGain; float *fBandGain[NUM_BANDS]; float *fBandFreq[NUM_BANDS]; float *fBandParam[NUM_BANDS]; float *fBandType[NUM_BANDS]; float *fBandEnabled[NUM_BANDS]; #if NUM_CHANNELS == 2 float *fMidSideEnable; int iMidSideMode[NUM_BANDS]; #endif float *fInput[NUM_CHANNELS]; float *fOutput[NUM_CHANNELS]; float *fVuIn[NUM_CHANNELS]; float *fVuOut[NUM_CHANNELS]; LV2_Atom_Sequence *notify_port; const LV2_Atom_Sequence* control_port; //Features LV2_URID_Map *map; //Forge for creating atoms LV2_Atom_Forge forge; LV2_Atom_Forge_Frame notify_frame; //Atom URID Eq10qURIs uris; double sampleRate; //Plugin DSP Filter *ProcFilter[NUM_BANDS][NUM_CHANNELS]; //Dummy pointers to Filter structures, used in processing loop. Can point to PortFilter or FlatFilter depending on the MidSide option Filter *PortFilter[NUM_BANDS]; //Filter used for reading LV2 ports and containing the actual coeficients Filter *FlatFilter; //Allways contains coeficients for a flat filter in order to be used as a bypass in MidSide processing option Buffers buf[NUM_BANDS][NUM_CHANNELS]; Vu *InputVu[NUM_CHANNELS]; Vu *OutputVu[NUM_CHANNELS]; //FFT Analysis int fft_ix, fft_ix2; //Index to follow buffers double *fft_in, *fft_out; double *fft_in2, *fft_out2; //Time shifted-seconf-fft-vectors fftw_plan fft_p, fft_p2; int fft_on; double fft_normalization; } EQ; static void cleanupEQ(LV2_Handle instance) { EQ *plugin = (EQ *)instance; int i; FilterClean(plugin->FlatFilter); for(i=0; iPortFilter[i]); } for(i=0; iInputVu[i]); VuClean(plugin->OutputVu[i]); } fftw_destroy_plan(plugin->fft_p); fftw_free(plugin->fft_in); fftw_free(plugin->fft_out); fftw_destroy_plan(plugin->fft_p2); fftw_free(plugin->fft_in2); fftw_free(plugin->fft_out2); free(instance); } static void connectPortEQ(LV2_Handle instance, uint32_t port, void *data) { EQ *plugin = (EQ *)instance; //Connect standar ports switch (port) { case EQ_BYPASS: plugin->fBypass = data; break; case EQ_INGAIN: plugin->fInGain = data; break; case EQ_OUTGAIN: plugin->fOutGain = data; break; default: //Connect audio input ports if(port >= PORT_OFFSET && port < (PORT_OFFSET + NUM_CHANNELS)) { plugin->fInput[port - PORT_OFFSET] = data; } //Connect audio output ports if(port >= (PORT_OFFSET + NUM_CHANNELS) && port < (PORT_OFFSET + 2*NUM_CHANNELS)) { plugin->fOutput[port - PORT_OFFSET - NUM_CHANNELS] = data; } //Connect BandGain ports else if(port >= (PORT_OFFSET + 2*NUM_CHANNELS) && port < (PORT_OFFSET + 2*NUM_CHANNELS + NUM_BANDS)) { plugin->fBandGain[port - PORT_OFFSET - 2*NUM_CHANNELS] = data; } //Connect BandFreq ports else if(port >= (PORT_OFFSET + 2*NUM_CHANNELS + NUM_BANDS) && port < (PORT_OFFSET + 2*NUM_CHANNELS + 2*NUM_BANDS)) { plugin->fBandFreq[port - PORT_OFFSET - 2*NUM_CHANNELS - NUM_BANDS] = data; } //Connect BandParam ports else if(port >= (PORT_OFFSET + 2*NUM_CHANNELS + 2*NUM_BANDS) && port < (PORT_OFFSET + 2*NUM_CHANNELS + 3*NUM_BANDS)) { plugin->fBandParam[port - PORT_OFFSET - 2*NUM_CHANNELS - 2*NUM_BANDS] = data; } //Connect BandType ports else if(port >= (PORT_OFFSET + 2*NUM_CHANNELS + 3*NUM_BANDS) && port < (PORT_OFFSET + 2*NUM_CHANNELS + 4*NUM_BANDS)) { plugin->fBandType[port - PORT_OFFSET - 2*NUM_CHANNELS - 3*NUM_BANDS] = data; } //Connect BandEnabled ports else if(port >= (PORT_OFFSET + 2*NUM_CHANNELS + 4*NUM_BANDS) && port < (PORT_OFFSET + 2*NUM_CHANNELS + 5*NUM_BANDS)) { plugin->fBandEnabled[port - PORT_OFFSET - 2*NUM_CHANNELS - 4*NUM_BANDS] = data; } //Connect VuInput ports else if(port >= (PORT_OFFSET + 2*NUM_CHANNELS + 5*NUM_BANDS) && port < (PORT_OFFSET + 2*NUM_CHANNELS + 5*NUM_BANDS + NUM_CHANNELS)) { plugin->fVuIn[port - PORT_OFFSET - 2*NUM_CHANNELS - 5*NUM_BANDS] = data; } //Connect VuOutput ports else if(port >= (PORT_OFFSET + 2*NUM_CHANNELS + 5*NUM_BANDS + NUM_CHANNELS) && port < (PORT_OFFSET + 2*NUM_CHANNELS + 5*NUM_BANDS + 2*NUM_CHANNELS)) { plugin->fVuOut[port - PORT_OFFSET - 2*NUM_CHANNELS - 5*NUM_BANDS - NUM_CHANNELS] = data; } //Connect Atom notify_port output port to GUI else if(port == PORT_OFFSET + 2*NUM_CHANNELS + 5*NUM_BANDS + 2*NUM_CHANNELS) { plugin->notify_port = (LV2_Atom_Sequence*)data; } //Connect Atom control_port input port from GUI else if (port == PORT_OFFSET + 2*NUM_CHANNELS + 5*NUM_BANDS + 2*NUM_CHANNELS + 1) { plugin->control_port = (const LV2_Atom_Sequence*)data; } //Connect the MidSide Mode port only for stereo versions else if (port == PORT_OFFSET + 2*NUM_CHANNELS + 5*NUM_BANDS + 2*NUM_CHANNELS + 2) { #if NUM_CHANNELS == 2 plugin->fMidSideEnable = data; #endif } break; } } static LV2_Handle instantiateEQ(const LV2_Descriptor *descriptor, double s_rate, const char *path, const LV2_Feature *const * features) { int i,ch; EQ *plugin_data = (EQ *)malloc(sizeof(EQ)); plugin_data->sampleRate = s_rate; plugin_data->FlatFilter = FilterInit(s_rate); calcCoefs(plugin_data->FlatFilter, 0.0, 20.0, 1.0, F_PEAK, 0.0); //Create a always-flat filter in FlatFilter for(i=0; iPortFilter[i] = FilterInit(s_rate); for(ch=0; chbuf[i][ch]); plugin_data->ProcFilter[i][ch] = plugin_data->PortFilter[i]; //Initially all filters points to LV2 Port controlled filters } #if NUM_CHANNELS == 2 plugin_data->iMidSideMode[i] = MS_DUAL_CHANNEL; #endif } for(ch=0; chInputVu[ch] = VuInit(s_rate); plugin_data->OutputVu[ch] = VuInit(s_rate); } // Get host features for (i = 0; features[i]; ++i) { if (!strcmp(features[i]->URI, LV2_URID__map)) { plugin_data->map = (LV2_URID_Map*)features[i]->data; } } if (!plugin_data->map) { printf("EQ10Q Error: Host does not support urid:map\n"); goto fail; } // Map URIs and initialise forge map_eq10q_uris(plugin_data->map, &plugin_data->uris); lv2_atom_forge_init(&plugin_data->forge, plugin_data->map); //Initialize FFT objects plugin_data->fft_ix = 0; plugin_data->fft_ix2 = FFT_N/2; plugin_data->fft_in = (double*) fftw_malloc(sizeof(double) * FFT_N); plugin_data->fft_in2 = (double*) fftw_malloc(sizeof(double) * FFT_N); plugin_data->fft_out = (double*) fftw_malloc(sizeof(double) * FFT_N); plugin_data->fft_out2 = (double*) fftw_malloc(sizeof(double) * FFT_N); plugin_data->fft_p = fftw_plan_r2r_1d(FFT_N, plugin_data->fft_in, plugin_data->fft_out, FFTW_R2HC, FFTW_ESTIMATE); plugin_data->fft_p2 = fftw_plan_r2r_1d(FFT_N, plugin_data->fft_in2, plugin_data->fft_out2, FFTW_R2HC, FFTW_ESTIMATE); plugin_data->fft_on = 0; //Initialy no GUI then no need to compute FFT plugin_data->fft_normalization = pow(2.0/ ((double) FFT_N), 2.0); for(i = 0; i< FFT_N; i++) { plugin_data->fft_in[i] = 0; plugin_data->fft_in2[i] = 0; plugin_data->fft_out[i] = 0; plugin_data->fft_out2[i] = 0; //First fft_out2 samples will not be calculated by FFT (first-time shift) } return (LV2_Handle)plugin_data; fail: free(plugin_data); return 0; } static void runEQ_v2(LV2_Handle instance, uint32_t sample_count) { EQ *plugin_data = (EQ *)instance; //Get values of control ports const int iBypass = *(plugin_data->fBypass) > 0.0f ? 1 : 0; const float fInGain = dB2Lin(*(plugin_data->fInGain)); const float fOutGain = dB2Lin(*(plugin_data->fOutGain)); #if NUM_CHANNELS == 2 const double dMidSideModeIdOn = (double)(*(plugin_data->fMidSideEnable)); #endif int bd, pos; //loop index //Set up forge to write directly to notify output port. const uint32_t notify_capacity = plugin_data->notify_port->atom.size; lv2_atom_forge_set_buffer(&plugin_data->forge, (uint8_t*)plugin_data->notify_port, notify_capacity); lv2_atom_forge_sequence_head(&plugin_data->forge, &plugin_data->notify_frame, 0); //printf("Notify port size %d\n", notify_capacity); //Interpolation coefs force to recompute int recalcCoefs[NUM_BANDS]; int forceRecalcCoefs = 0; double fftInSample; //Sample to push throught the FFT buffer double sampleL; //Current processing sample left signal #if NUM_CHANNELS == 2 double sampleR; //Current processing sample right signal #endif //Read EQ Ports and mark to recompute if changed for(bd = 0; bdfBandGain[bd])) != plugin_data->PortFilter[bd]->gain || *plugin_data->fBandFreq[bd] != plugin_data->PortFilter[bd]->freq || *plugin_data->fBandParam[bd] != plugin_data->PortFilter[bd]->q || ((int)(*plugin_data->fBandType[bd])) != plugin_data->PortFilter[bd]->iType || ((float)(0x01 & ((int)(*plugin_data->fBandEnabled[bd])))) != plugin_data->PortFilter[bd]->enable) { recalcCoefs[bd] = 1; forceRecalcCoefs = 1; } else { recalcCoefs[bd] = 0; } //Check mid-side ports #if NUM_CHANNELS == 2 if((((int)(*plugin_data->fBandEnabled[bd])) >> 1) != plugin_data->iMidSideMode[bd]) { plugin_data->iMidSideMode[bd] = ((int)(*plugin_data->fBandEnabled[bd])) >> 1; switch(plugin_data->iMidSideMode[bd]) { case MS_DUAL_CHANNEL: plugin_data->ProcFilter[bd][0] = plugin_data->PortFilter[bd]; plugin_data->ProcFilter[bd][1] = plugin_data->PortFilter[bd]; break; case MS_L_MID_MODE: plugin_data->ProcFilter[bd][0] = plugin_data->PortFilter[bd]; plugin_data->ProcFilter[bd][1] = plugin_data->FlatFilter; break; case MS_R_SIDE_MODE: plugin_data->ProcFilter[bd][0] = plugin_data->FlatFilter; plugin_data->ProcFilter[bd][1] = plugin_data->PortFilter[bd]; break; } } #endif } //Read input Atom control port (Data from GUI) if(plugin_data->control_port) { const LV2_Atom_Event* ev = lv2_atom_sequence_begin(&(plugin_data->control_port)->body); // For each incoming message... while (!lv2_atom_sequence_is_end(&plugin_data->control_port->body, plugin_data->control_port->atom.size, ev)) { // If the event is an atom:Object if (ev->body.type == plugin_data->uris.atom_Object) { const LV2_Atom_Object* obj = (const LV2_Atom_Object*)&ev->body; if (obj->body.otype == plugin_data->uris.atom_fft_on) { plugin_data->fft_on = 1; } else if(obj->body.otype == plugin_data->uris.atom_fft_off) { plugin_data->fft_on = 0; plugin_data->fft_ix = 0; plugin_data->fft_ix2 = FFT_N/2; } else if(obj->body.otype == plugin_data->uris.atom_sample_rate_request) { //Send sample rate LV2_Atom_Forge_Frame frameSR; lv2_atom_forge_frame_time(&plugin_data->forge, 0); lv2_atom_forge_object( &plugin_data->forge, &frameSR, 0, plugin_data->uris.atom_sample_rate_response); lv2_atom_forge_key(&plugin_data->forge, plugin_data->uris.atom_sample_rate_key); lv2_atom_forge_double(&plugin_data->forge, plugin_data->sampleRate); lv2_atom_forge_pop(&plugin_data->forge, &frameSR); // Close off sequence lv2_atom_forge_pop(&plugin_data->forge, &plugin_data->notify_frame); } } ev = lv2_atom_sequence_next(ev); } } //Compute the filter for (pos = 0; pos < sample_count; pos++) { //Get input sampleL = (double)plugin_data->fInput[0][pos]; DENORMAL_TO_ZERO(sampleL); #if NUM_CHANNELS == 2 sampleR = (double)plugin_data->fInput[1][pos]; DENORMAL_TO_ZERO(sampleR); #endif //The input amplifier sampleL *= fInGain; fftInSample = sampleL; //Update VU input sample SetSample(plugin_data->InputVu[0], sampleL); #if NUM_CHANNELS == 2 //The input amplifier sampleR *= fInGain; fftInSample = 0.5*sampleL + 0.5*sampleR; //Update VU input sample SetSample(plugin_data->InputVu[1], sampleR); #endif //Process every band if(!iBypass) { //FFT of input data after input gain if(plugin_data->fft_on) { //Hanning Windowing plugin_data->fft_in[plugin_data->fft_ix] = fftInSample* 0.5 * (1.0-cos((2.0*PI*((double)plugin_data->fft_ix))/((double)(FFT_N-1)))); plugin_data->fft_in2[plugin_data->fft_ix2] = fftInSample* 0.5 * (1.0-cos((2.0*PI*((double)plugin_data->fft_ix2))/((double)(FFT_N-1)))); plugin_data->fft_ix++; plugin_data->fft_ix2++; if(plugin_data->fft_ix == FFT_N) { //FFT inout buffer full compute fftw_execute(plugin_data->fft_p); //Compute FFT Normalized Magnitude^2 double real, img; int ffti; for(ffti = 0; ffti<= FFT_N/2; ffti++) { real = plugin_data->fft_out[ffti]; if(ffti > 0 && ffti < (FFT_N/2)) { img = plugin_data->fft_out[FFT_N -ffti]; } else { img = 0.0; } plugin_data->fft_out[ffti] = 0.5*(plugin_data->fft_normalization*(real*real + img*img) + plugin_data->fft_out2[ffti]); } plugin_data->fft_ix = 0; //Send FFT data vector LV2_Atom_Forge_Frame frameFft; lv2_atom_forge_frame_time(&plugin_data->forge, 0); lv2_atom_forge_object( &plugin_data->forge, &frameFft, 0, plugin_data->uris.atom_fft_data_event); lv2_atom_forge_key(&plugin_data->forge, plugin_data->uris.atom_fft_data_key); lv2_atom_forge_vector(&plugin_data->forge, sizeof(double), plugin_data->uris.atom_Double, ((FFT_N/2) + 1), plugin_data->fft_out); lv2_atom_forge_pop(&plugin_data->forge, &frameFft); // Close off sequence lv2_atom_forge_pop(&plugin_data->forge, &plugin_data->notify_frame); } if(plugin_data->fft_ix2 == FFT_N) { //FFT inout buffer full compute fftw_execute(plugin_data->fft_p2); //Compute FFT Normalized Magnitude^2 double real, img; int ffti; for(ffti = 0; ffti<= FFT_N/2; ffti++) { real = plugin_data->fft_out2[ffti]; if(ffti > 0 && ffti < (FFT_N/2)) { img = plugin_data->fft_out2[FFT_N -ffti]; } else { img = 0.0; } plugin_data->fft_out2[ffti] = plugin_data->fft_normalization*(real*real + img*img); } plugin_data->fft_ix2 = 0; } } //Coefs Interpolation if(forceRecalcCoefs) { for(bd = 0; bdPortFilter[bd], dB2Lin(*(plugin_data->fBandGain[bd])), *plugin_data->fBandFreq[bd], *plugin_data->fBandParam[bd], (int)(*plugin_data->fBandType[bd]), ((float)(0x01 & ((int)(*plugin_data->fBandEnabled[bd]))))); } } } //EQ PROCESSOR //Band0 #if NUM_CHANNELS == 2 LR2MS(&sampleL, &sampleR, dMidSideModeIdOn); #endif computeFilter(plugin_data->ProcFilter[0][0], &plugin_data->buf[0][0],&sampleL); #if NUM_CHANNELS == 2 computeFilter(plugin_data->ProcFilter[0][1], &plugin_data->buf[0][1],&sampleR); #endif #if NUM_BANDS >= 4 //BAND 1 computeFilter(plugin_data->ProcFilter[1][0], &plugin_data->buf[1][0],&sampleL); #if NUM_CHANNELS == 2 computeFilter(plugin_data->ProcFilter[1][1], &plugin_data->buf[1][1],&sampleR); #endif //BAND 2 computeFilter(plugin_data->ProcFilter[2][0], &plugin_data->buf[2][0],&sampleL); #if NUM_CHANNELS == 2 computeFilter(plugin_data->ProcFilter[2][1], &plugin_data->buf[2][1],&sampleR); #endif //BAND 3 computeFilter(plugin_data->ProcFilter[3][0], &plugin_data->buf[3][0],&sampleL); #if NUM_CHANNELS == 2 computeFilter(plugin_data->ProcFilter[3][1], &plugin_data->buf[3][1],&sampleR); #endif #endif #if NUM_BANDS >= 6 //BAND 4 computeFilter(plugin_data->ProcFilter[4][0], &plugin_data->buf[4][0],&sampleL); #if NUM_CHANNELS == 2 computeFilter(plugin_data->ProcFilter[4][1], &plugin_data->buf[4][1],&sampleR); #endif //BAND 5 computeFilter(plugin_data->ProcFilter[5][0], &plugin_data->buf[5][0],&sampleL); #if NUM_CHANNELS == 2 computeFilter(plugin_data->ProcFilter[5][1], &plugin_data->buf[5][1],&sampleR); #endif #endif #if NUM_BANDS ==10 //BAND 6 computeFilter(plugin_data->ProcFilter[6][0], &plugin_data->buf[6][0],&sampleL); #if NUM_CHANNELS == 2 computeFilter(plugin_data->ProcFilter[6][1], &plugin_data->buf[6][1],&sampleR); #endif //BAND 7 computeFilter(plugin_data->ProcFilter[7][0], &plugin_data->buf[7][0],&sampleL); #if NUM_CHANNELS == 2 computeFilter(plugin_data->ProcFilter[7][1], &plugin_data->buf[7][1],&sampleR); #endif //BAND 8 computeFilter(plugin_data->ProcFilter[8][0], &plugin_data->buf[8][0],&sampleL); #if NUM_CHANNELS == 2 computeFilter(plugin_data->ProcFilter[8][1], &plugin_data->buf[8][1],&sampleR); #endif //BAND 9 computeFilter(plugin_data->ProcFilter[9][0], &plugin_data->buf[9][0],&sampleL); #if NUM_CHANNELS == 2 computeFilter(plugin_data->ProcFilter[9][1], &plugin_data->buf[9][1],&sampleR); #endif #endif //The output amplifier sampleL *= fOutGain; //Update VU output sample SetSample(plugin_data->OutputVu[0], sampleL); #if NUM_CHANNELS == 2 //The output amplifier sampleR *= fOutGain; //Update VU output sample SetSample(plugin_data->OutputVu[1], sampleR); //Go back to LR signals, be aware that out gains and Vumeters Are M/S or L/R depending on MidSide selected mode MS2LR(&sampleL, &sampleR, dMidSideModeIdOn); #endif } //Write on output plugin_data->fOutput[0][pos] = (float)sampleL; #if NUM_CHANNELS == 2 plugin_data->fOutput[1][pos] = (float)sampleR; #endif } //Update VU ports *(plugin_data->fVuIn[0]) = ComputeVu(plugin_data->InputVu[0], sample_count); *(plugin_data->fVuOut[0]) = ComputeVu(plugin_data->OutputVu[0], sample_count); #if NUM_CHANNELS == 2 *(plugin_data->fVuIn[1]) = ComputeVu(plugin_data->InputVu[1], sample_count); *(plugin_data->fVuOut[1]) = ComputeVu(plugin_data->OutputVu[1], sample_count); #endif } static const LV2_Descriptor eqDescriptor = { EQ_URI, instantiateEQ, connectPortEQ, NULL, runEQ_v2, NULL, cleanupEQ, NULL }; LV2_SYMBOL_EXPORT const LV2_Descriptor *lv2_descriptor(uint32_t index) { switch (index) { case 0: return &eqDescriptor; default: return NULL; } } eq10q-2.2/compressor.ttl0000644000175000001440000001222313023240624014604 0ustar sapistausers@prefix lv2: . @prefix foaf: . @prefix doap: . @prefix guiext: . @prefix units: . @prefix pprop: . a foaf:Person ; foaf:name "Pere Ràfols Soler" ; foaf:mbox ; foaf:homepage . a doap:Project ; doap:maintainer ; doap:name "EQ10Q plugins" . ##LV2 GUI extension a guiext:GtkUI; guiext:binary ; lv2:optionalFeature guiext:noUserResize. ##LV2 plugin binary a lv2:Plugin, lv2:CompressorPlugin, doap:Project; doap:name "CS10QM"; lv2:binary ; doap:license ; lv2:optionalFeature lv2:hardRTCapable; lv2:project ; guiext:ui ; lv2:port [ a lv2:AudioPort, lv2:OutputPort; lv2:index 0; lv2:symbol "output"; lv2:name "Output"; ], [ a lv2:AudioPort, lv2:InputPort; lv2:index 1; lv2:symbol "input"; lv2:name "Input"; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 2; lv2:symbol "keylisten"; lv2:name "Key Listen"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 3; lv2:symbol "threshold"; lv2:name "Threshold (dB)"; lv2:minimum -46; lv2:maximum 4; lv2:default -10; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 4; lv2:symbol "attack"; lv2:name "Attack (ms)"; lv2:minimum 0.01; lv2:maximum 500; lv2:default 10; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 5; lv2:symbol "compmakeup"; lv2:name "Makeup (dB)"; lv2:minimum 0; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 6; lv2:symbol "decay"; lv2:name "Decay (ms)"; lv2:minimum 5; lv2:maximum 4000; lv2:default 250; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 7; lv2:symbol "compratio"; lv2:name "Ratio (dB)"; lv2:minimum 1; lv2:maximum 100; lv2:default 6; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 8; lv2:symbol "hpf"; lv2:name "HPF Key Filter (Hz)"; lv2:minimum 20; lv2:maximum 20000; lv2:default 20; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 9; lv2:symbol "lpf"; lv2:name "LPF Key Filter (Hz)"; lv2:minimum 20; lv2:maximum 20000; lv2:default 20000; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 10; lv2:symbol "ingain"; lv2:name "Gain (dB)"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 11; lv2:symbol "out_vu_ctl"; lv2:name "Out VU CTL"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 12; lv2:symbol "gateled"; lv2:name "Gain Reduction"; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 13; lv2:symbol "knee"; lv2:name "Knee (dB)"; lv2:minimum 0; lv2:maximum 20; lv2:default 6; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 14; lv2:symbol "drywet"; lv2:name "Dry/Wet"; lv2:minimum 0; lv2:maximum 1; lv2:default 1; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 15; lv2:symbol "isfeedbackcompressor"; lv2:name "FeedBack Compressor"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 16; lv2:symbol "compressorMode"; lv2:name "Compressor Mode"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 17; lv2:symbol "punch"; lv2:name "Punch"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; ]. eq10q-2.2/bassup.ttl0000644000175000001440000000314713023240624013712 0ustar sapistausers@prefix lv2: . @prefix foaf: . @prefix doap: . @prefix guiext: . a foaf:Person ; foaf:name "Pere Ràfols Soler" ; foaf:mbox ; foaf:homepage . a doap:Project ; doap:maintainer ; doap:name "EQ10Q plugins" . ##LV2 GUI extension a guiext:GtkUI; guiext:binary ; lv2:optionalFeature guiext:noUserResize. ##LV2 plugin binary a lv2:Plugin, lv2:DistortionPlugin, doap:Project; doap:name "BassUp"; doap:license ; lv2:binary ; lv2:optionalFeature lv2:hardRTCapable; lv2:project ; guiext:ui ; lv2:port [ a lv2:AudioPort, lv2:OutputPort; lv2:index 0; lv2:symbol "output"; lv2:name "Output"; ], [ a lv2:AudioPort, lv2:InputPort; lv2:index 1; lv2:symbol "input"; lv2:name "Input"; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 2; lv2:symbol "amount"; lv2:name "Amount"; lv2:minimum 0; lv2:maximum 6; lv2:default 0; ]. eq10q-2.2/ms2lr.ttl0000644000175000001440000001026613023240624013454 0ustar sapistausers@prefix lv2: . @prefix foaf: . @prefix doap: . @prefix guiext: . @prefix units: . @prefix pprop: . a foaf:Person ; foaf:name "Pere Ràfols Soler" ; foaf:mbox ; foaf:homepage . a doap:Project ; doap:maintainer ; doap:name "EQ10Q plugins" . ##LV2 GUI extension a guiext:GtkUI; guiext:binary ; lv2:optionalFeature guiext:noUserResize. ##LV2 plugin binary a lv2:Plugin, lv2:UtilityPlugin, doap:Project; lv2:binary ; doap:name "MS2LR"; doap:license ; lv2:optionalFeature lv2:hardRTCapable; lv2:project ; guiext:ui ; lv2:port [ a lv2:AudioPort, lv2:InputPort; lv2:index 0; lv2:symbol "inputm"; lv2:name "Input M"; ], [ a lv2:AudioPort, lv2:InputPort; lv2:index 1; lv2:symbol "inputs"; lv2:name "Input S"; ], [ a lv2:AudioPort, lv2:OutputPort; lv2:index 2; lv2:symbol "outputl"; lv2:name "Output L"; ], [ a lv2:AudioPort, lv2:OutputPort; lv2:index 3; lv2:symbol "outputr"; lv2:name "Output R"; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 4; lv2:symbol "ingainm"; lv2:name "Gain M (dB)"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 5; lv2:symbol "ingains"; lv2:name "Gain S (dB)"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 6; lv2:symbol "outgainl"; lv2:name "Gain L (dB)"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 7; lv2:symbol "outgainr"; lv2:name "Gain R (dB)"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 8; lv2:symbol "solom"; lv2:name "Solo M"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 9; lv2:symbol "solos"; lv2:name "Solo S"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 10; lv2:symbol "solol"; lv2:name "Solo L"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 11; lv2:symbol "solor"; lv2:name "Solo R"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 12; lv2:symbol "vu_inm"; lv2:name "In VU M"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 13; lv2:symbol "vu_ins"; lv2:name "In VU S"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 14; lv2:symbol "vu_outl"; lv2:name "Out VU L"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 15; lv2:symbol "vu_outr"; lv2:name "Out VU R"; ]. eq10q-2.2/lr2ms.ttl0000644000175000001440000001026613023240624013454 0ustar sapistausers@prefix lv2: . @prefix foaf: . @prefix doap: . @prefix guiext: . @prefix units: . @prefix pprop: . a foaf:Person ; foaf:name "Pere Ràfols Soler" ; foaf:mbox ; foaf:homepage . a doap:Project ; doap:maintainer ; doap:name "EQ10Q plugins" . ##LV2 GUI extension a guiext:GtkUI; guiext:binary ; lv2:optionalFeature guiext:noUserResize. ##LV2 plugin binary a lv2:Plugin, lv2:UtilityPlugin, doap:Project; lv2:binary ; doap:name "LR2MS"; doap:license ; lv2:optionalFeature lv2:hardRTCapable; lv2:project ; guiext:ui ; lv2:port [ a lv2:AudioPort, lv2:InputPort; lv2:index 0; lv2:symbol "inputl"; lv2:name "Input L"; ], [ a lv2:AudioPort, lv2:InputPort; lv2:index 1; lv2:symbol "inputr"; lv2:name "Input R"; ], [ a lv2:AudioPort, lv2:OutputPort; lv2:index 2; lv2:symbol "outputm"; lv2:name "Output M"; ], [ a lv2:AudioPort, lv2:OutputPort; lv2:index 3; lv2:symbol "outputs"; lv2:name "Output S"; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 4; lv2:symbol "ingainl"; lv2:name "Gain L (dB)"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 5; lv2:symbol "ingainr"; lv2:name "Gain R (dB)"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 6; lv2:symbol "outgainm"; lv2:name "Gain M (dB)"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 7; lv2:symbol "outgains"; lv2:name "Gain S (dB)"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 8; lv2:symbol "solol"; lv2:name "Solo L"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 9; lv2:symbol "solor"; lv2:name "Solo R"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 10; lv2:symbol "solom"; lv2:name "Solo M"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 11; lv2:symbol "solos"; lv2:name "Solo S"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 12; lv2:symbol "vu_inl"; lv2:name "In VU L"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 13; lv2:symbol "vu_inr"; lv2:name "In VU R"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 14; lv2:symbol "vu_outm"; lv2:name "Out VU M"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 15; lv2:symbol "vu_outs"; lv2:name "Out VU S"; ]. eq10q-2.2/compressor_stereo_sc.ttl0000644000175000001440000001314313023240624016654 0ustar sapistausers@prefix lv2: . @prefix foaf: . @prefix doap: . @prefix guiext: . @prefix units: . @prefix pprop: . a foaf:Person ; foaf:name "Pere Ràfols Soler" ; foaf:mbox ; foaf:homepage . a doap:Project ; doap:maintainer ; doap:name "EQ10Q plugins" . ##LV2 GUI extension a guiext:GtkUI; guiext:binary ; lv2:optionalFeature guiext:noUserResize. ##LV2 plugin binary a lv2:Plugin, lv2:CompressorPlugin, doap:Project; lv2:binary ; doap:name "CS10QS-SC"; doap:license ; lv2:optionalFeature lv2:hardRTCapable; lv2:project ; guiext:ui ; lv2:port [ a lv2:AudioPort, lv2:OutputPort; lv2:index 0; lv2:symbol "output"; lv2:name "Output"; ], [ a lv2:AudioPort, lv2:InputPort; lv2:index 1; lv2:symbol "input"; lv2:name "Input"; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 2; lv2:symbol "keylisten"; lv2:name "Key Listen"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 3; lv2:symbol "threshold"; lv2:name "Threshold (dB)"; lv2:minimum -46; lv2:maximum 4; lv2:default -10; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 4; lv2:symbol "attack"; lv2:name "Attack (ms)"; lv2:minimum 0.01; lv2:maximum 500; lv2:default 10; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 5; lv2:symbol "compmakeup"; lv2:name "Makeup (dB)"; lv2:minimum 0; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 6; lv2:symbol "decay"; lv2:name "Decay (ms)"; lv2:minimum 5; lv2:maximum 4000; lv2:default 250; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 7; lv2:symbol "compratio"; lv2:name "Ratio (dB)"; lv2:minimum 1; lv2:maximum 100; lv2:default 6; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 8; lv2:symbol "hpf"; lv2:name "HPF Key Filter (Hz)"; lv2:minimum 20; lv2:maximum 20000; lv2:default 20; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 9; lv2:symbol "lpf"; lv2:name "LPF Key Filter (Hz)"; lv2:minimum 20; lv2:maximum 20000; lv2:default 20000; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 10; lv2:symbol "ingain"; lv2:name "Gain (dB)"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 11; lv2:symbol "out_vu_ctl"; lv2:name "Out VU CTL"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 12; lv2:symbol "gateled"; lv2:name "Gain Reduction"; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 13; lv2:symbol "knee"; lv2:name "Knee (dB)"; lv2:minimum 0; lv2:maximum 20; lv2:default 6; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 14; lv2:symbol "drywet"; lv2:name "Dry/Wet"; lv2:minimum 0; lv2:maximum 1; lv2:default 1; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 15; lv2:symbol "isSideChainActive"; lv2:name "SideChain Active"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 16; lv2:symbol "compressorMode"; lv2:name "Compressor Mode"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 17; lv2:symbol "punch"; lv2:name "Punch"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; ], [ a lv2:AudioPort, lv2:OutputPort; lv2:index 18; lv2:symbol "outputR"; lv2:name "OutputR"; ], [ a lv2:AudioPort, lv2:InputPort; lv2:index 19; lv2:symbol "inputR"; lv2:name "InputR"; ], [ a lv2:AudioPort, lv2:InputPort; lv2:index 20; lv2:symbol "inputSC"; lv2:name "InputSC"; lv2:portProperty lv2:isSideChain; ]. eq10q-2.2/manifest.ttl0000644000175000001440000000315413023240624014221 0ustar sapistausers@prefix lv2: . @prefix rdfs: . a lv2:Plugin; rdfs:seeAlso . a lv2:Plugin; rdfs:seeAlso . a lv2:Plugin; rdfs:seeAlso . a lv2:Plugin; rdfs:seeAlso . a lv2:Plugin; rdfs:seeAlso . a lv2:Plugin; rdfs:seeAlso . a lv2:Plugin; rdfs:seeAlso . a lv2:Plugin; rdfs:seeAlso . a lv2:Plugin; rdfs:seeAlso . a lv2:Plugin; rdfs:seeAlso . a lv2:Plugin; rdfs:seeAlso . a lv2:Plugin; rdfs:seeAlso . a lv2:Plugin; rdfs:seeAlso . a lv2:Plugin; rdfs:seeAlso . a lv2:Plugin; rdfs:seeAlso . a lv2:Plugin; rdfs:seeAlso . a lv2:Plugin; rdfs:seeAlso . eq10q-2.2/COPYING0000644000175000001440000010451313023240624012722 0ustar sapistausers GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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 3 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. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . eq10q-2.2/uris.h0000644000175000001440000000644213023240624013024 0ustar sapistausers/*************************************************************************** * Copyright (C) 2011 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef EQ10Q_URIS_H #define EQ10Q_URIS_H #define EQ_ATOM_URI "http://eq10q.sourceforge.net/atom" #define EQ_SAMPLE_RATE_KEY EQ_ATOM_URI "#sampleratekey" #define EQ_SAMPLE_RATE_RESPONSE EQ_ATOM_URI "#samplerate" #define EQ_FFT_DATA_KEY EQ_ATOM_URI "#fftdatakey" #define EQ_FFT_DATA_EVENT EQ_ATOM_URI "#fftdataevent" #define EQ_FFT_ON EQ_ATOM_URI "#ffton" #define EQ_FFT_OFF EQ_ATOM_URI "#fftoff" #define EQ_SAMPLE_RATE_REQUEST EQ_ATOM_URI "#sampleraterequest" typedef struct { LV2_URID atom_Object; LV2_URID atom_Double; LV2_URID atom_Sequence; LV2_URID atom_Vector; LV2_URID atom_URID; LV2_URID atom_eventTransfer; LV2_URID atom_sample_rate_key; LV2_URID atom_sample_rate_response; LV2_URID atom_fft_data_key; LV2_URID atom_fft_data_event; LV2_URID atom_fft_on; LV2_URID atom_fft_off; LV2_URID atom_sample_rate_request; } Eq10qURIs; static inline void map_eq10q_uris(LV2_URID_Map* map, Eq10qURIs* uris) { uris->atom_Object = map->map(map->handle, LV2_ATOM__Object); uris->atom_Double = map->map(map->handle, LV2_ATOM__Double); uris->atom_Sequence = map->map(map->handle, LV2_ATOM__Sequence); uris->atom_Vector = map->map(map->handle, LV2_ATOM__Vector); uris->atom_URID = map->map(map->handle, LV2_ATOM__URID); uris->atom_eventTransfer = map->map(map->handle, LV2_ATOM__eventTransfer); uris->atom_sample_rate_key = map->map(map->handle, EQ_SAMPLE_RATE_KEY); uris->atom_sample_rate_response = map->map(map->handle, EQ_SAMPLE_RATE_RESPONSE); uris->atom_fft_data_key = map->map(map->handle, EQ_FFT_DATA_KEY); uris->atom_fft_data_event = map->map(map->handle, EQ_FFT_DATA_EVENT); uris->atom_fft_on = map->map(map->handle, EQ_FFT_ON); uris->atom_fft_off = map->map(map->handle, EQ_FFT_OFF); uris->atom_sample_rate_request = map->map(map->handle, EQ_SAMPLE_RATE_REQUEST); } #endif eq10q-2.2/plugins_uris.h0000644000175000001440000000534513023240624014566 0ustar sapistausers/*************************************************************************** * Copyright (C) 2016 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef PLUGINS_URIS_H #define PLUGINS_URIS_H //Plugin uris #define EQ1QM_URI "http://eq10q.sourceforge.net/eq/eq1qm" #define EQ1QS_URI "http://eq10q.sourceforge.net/eq/eq1qs" #define EQ4QM_URI "http://eq10q.sourceforge.net/eq/eq4qm" #define EQ4QS_URI "http://eq10q.sourceforge.net/eq/eq4qs" #define EQ6QM_URI "http://eq10q.sourceforge.net/eq/eq6qm" #define EQ6QS_URI "http://eq10q.sourceforge.net/eq/eq6qs" #define EQ10QM_URI "http://eq10q.sourceforge.net/eq/eq10qm" #define EQ10QS_URI "http://eq10q.sourceforge.net/eq/eq10qs" #define GATE_MONO_URI "http://eq10q.sourceforge.net/gate" #define GATE_STEREO_URI "http://eq10q.sourceforge.net/gate_stereo" #define COMPRESSOR_MONO_URI "http://eq10q.sourceforge.net/compressor" #define COMPRESSOR_SC_MONO_URI "http://eq10q.sourceforge.net/compressor_sc" #define COMPRESSOR_STEREO_URI "http://eq10q.sourceforge.net/compressor_stereo" #define COMPRESSOR_SC_STEREO_URI "http://eq10q.sourceforge.net/compressor_stereo_sc" #define LR2MS_URI "http://eq10q.sourceforge.net/matrix_lr2ms" #define MS2LR_URI "http://eq10q.sourceforge.net/matrix_ms2lr" //Plugins GUI uris #define EQ10Q_GUI_URI "http://eq10q.sourceforge.net/eq/eq10q/gui" #define DYNAMICS_GUI_URI "http://eq10q.sourceforge.net/dynamics/gui" #define MIDSIDEMAT_GUI_URI "http://eq10q.sourceforge.net/matrix_ms/gui" #endif eq10q-2.2/CMakeLists.txt0000644000175000001440000002015513023240624014426 0ustar sapistausers##EQ10Q TopLevel CMake cmake_minimum_required(VERSION 2.8) PROJECT(eq10q) ##ADD_DEFINITIONS(-Wall -O3 -fPIC -finline-functions -finline-functions-called-once -msse -mfpmath=sse -std=c99) set(CMAKE_C_FLAGS "-Wall -O3 -fPIC -finline-functions -finline-functions-called-once -msse -mfpmath=sse -std=c99") #set(CMAKE_C_FLAGS "-Wall -O0 -g -fPIC -finline-functions -finline-functions-called-once -msse -mfpmath=sse -std=c99") set(CMAKE_CXX_FLAGS "-Wall -fPIC -std=c++11") #set(CMAKE_CXX_FLAGS "-Wall -O0 -g -fPIC -DPIC -std=c++11") ##Debuging GUI ##ADD_DEFINITIONS(-Wall -O0 -g -fPIC -DPIC) ###USED FOR DEBUG #Set Install prefix set (CMAKE_INSTALL_PREFIX "/usr/local/lib/lv2") #Install prefix #set (CMAKE_INSTALL_PREFIX "$ENV{HOME}/.lv2") #Install prefix set (LV2_BUNDLE "sapistaEQv2.lv2") #LV2 Bundel dir set(EXECUTABLE_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/bin") set(LIBRARY_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/bin") add_subdirectory(gui) add_subdirectory(dsp) #===========================BUILD EQ10Q ALL DSP FILES============================================= #Build EQ1QM DSP set( Eq_Bands_Count 1) set( Eq_Channels_Count 1) set( Eq_Uri "\"http://eq10q.sourceforge.net/eq/eq1qm\"") configure_file("${PROJECT_SOURCE_DIR}/eq.c" "${PROJECT_SOURCE_DIR}/eq1qm.c") add_library(eq1qm SHARED eq1qm.c) target_link_libraries( eq1qm lib_filter lib_vumeter m fftw3) #Build EQ1QS DSP set( Eq_Bands_Count 1) set( Eq_Channels_Count 2) set( Eq_Uri "\"http://eq10q.sourceforge.net/eq/eq1qs\"") configure_file("${PROJECT_SOURCE_DIR}/eq.c" "${PROJECT_SOURCE_DIR}/eq1qs.c") add_library(eq1qs SHARED eq1qs.c) target_link_libraries( eq1qs lib_filter lib_vumeter m fftw3) #Build EQ4QM DSP set( Eq_Bands_Count 4) set( Eq_Channels_Count 1) set( Eq_Uri "\"http://eq10q.sourceforge.net/eq/eq4qm\"") configure_file("${PROJECT_SOURCE_DIR}/eq.c" "${PROJECT_SOURCE_DIR}/eq4qm.c") add_library(eq4qm SHARED eq4qm.c) target_link_libraries( eq4qm lib_filter lib_vumeter m fftw3) #Build EQ4QS DSP set( Eq_Bands_Count 4) set( Eq_Channels_Count 2) set( Eq_Uri "\"http://eq10q.sourceforge.net/eq/eq4qs\"") configure_file("${PROJECT_SOURCE_DIR}/eq.c" "${PROJECT_SOURCE_DIR}/eq4qs.c") add_library(eq4qs SHARED eq4qs.c) target_link_libraries( eq4qs lib_filter lib_vumeter m fftw3) #Build EQ6QM DSP set( Eq_Bands_Count 6) set( Eq_Channels_Count 1) set( Eq_Uri "\"http://eq10q.sourceforge.net/eq/eq6qm\"") configure_file("${PROJECT_SOURCE_DIR}/eq.c" "${PROJECT_SOURCE_DIR}/eq6qm.c") add_library(eq6qm SHARED eq6qm.c) target_link_libraries( eq6qm lib_filter lib_vumeter m fftw3) #Build EQ6QS DSP set( Eq_Bands_Count 6) set( Eq_Channels_Count 2) set( Eq_Uri "\"http://eq10q.sourceforge.net/eq/eq6qs\"") configure_file("${PROJECT_SOURCE_DIR}/eq.c" "${PROJECT_SOURCE_DIR}/eq6qs.c") add_library(eq6qs SHARED eq6qs.c) target_link_libraries( eq6qs lib_filter lib_vumeter m fftw3) #Build EQ10QM DSP set( Eq_Bands_Count 10) set( Eq_Channels_Count 1) set( Eq_Uri "\"http://eq10q.sourceforge.net/eq/eq10qm\"") configure_file("${PROJECT_SOURCE_DIR}/eq.c" "${PROJECT_SOURCE_DIR}/eq10qm.c") add_library(eq10qm SHARED eq10qm.c) target_link_libraries( eq10qm lib_filter lib_vumeter m fftw3) #Build EQ10QS DSP set( Eq_Bands_Count 10) set( Eq_Channels_Count 2) set( Eq_Uri "\"http://eq10q.sourceforge.net/eq/eq10qs\"") configure_file("${PROJECT_SOURCE_DIR}/eq.c" "${PROJECT_SOURCE_DIR}/eq10qs.c") add_library(eq10qs SHARED eq10qs.c) target_link_libraries( eq10qs lib_filter lib_vumeter m fftw3) #Build GATE DSP Mono set( Plugin_Is_Dynamics_Compressor "PLUGIN_IS_GATE") set( Dyn_Uri "\"http://eq10q.sourceforge.net/gate\"") set( Dyn_Channels_Count 1) configure_file("${PROJECT_SOURCE_DIR}/dynamics.c" "${PROJECT_SOURCE_DIR}/gate_mono.c") add_library(gate SHARED gate_mono.c) target_link_libraries( gate lib_vumeter lib_filter m) #Build Compressor DSP Mono set( Plugin_Is_Dynamics_Compressor "PLUGIN_IS_COMPRESSOR") set( Dyn_Uri "\"http://eq10q.sourceforge.net/compressor\"") set( Dyn_Channels_Count 1) configure_file("${PROJECT_SOURCE_DIR}/dynamics.c" "${PROJECT_SOURCE_DIR}/compressor_mono.c") add_library(compressor SHARED compressor_mono.c) target_link_libraries( compressor lib_vumeter lib_filter m) #Build Compressor Side-Chain DSP Mono set( Plugin_Is_Dynamics_Compressor "PLUGIN_IS_COMPRESSOR_WITH_SC") set( Dyn_Uri "\"http://eq10q.sourceforge.net/compressor_sc\"") set( Dyn_Channels_Count 1) configure_file("${PROJECT_SOURCE_DIR}/dynamics.c" "${PROJECT_SOURCE_DIR}/compressor_mono_sc.c") add_library(compressor_sc SHARED compressor_mono_sc.c) target_link_libraries( compressor_sc lib_vumeter lib_filter m) #Build GATE DSP Stereo set( Plugin_Is_Dynamics_Compressor "PLUGIN_IS_GATE") set( Dyn_Uri "\"http://eq10q.sourceforge.net/gate_stereo\"") set( Dyn_Channels_Count 2) configure_file("${PROJECT_SOURCE_DIR}/dynamics.c" "${PROJECT_SOURCE_DIR}/gate_stereo.c") add_library(gate_stereo SHARED gate_stereo.c) target_link_libraries( gate_stereo lib_vumeter lib_filter m) #Build Compressor DSP Stereo set( Plugin_Is_Dynamics_Compressor "PLUGIN_IS_COMPRESSOR") set( Dyn_Uri "\"http://eq10q.sourceforge.net/compressor_stereo\"") set( Dyn_Channels_Count 2) configure_file("${PROJECT_SOURCE_DIR}/dynamics.c" "${PROJECT_SOURCE_DIR}/compressor_stereo.c") add_library(compressor_stereo SHARED compressor_stereo.c) target_link_libraries( compressor_stereo lib_vumeter lib_filter m) #Build Compressor Side-Chain DSP Mono set( Plugin_Is_Dynamics_Compressor "PLUGIN_IS_COMPRESSOR_WITH_SC") set( Dyn_Uri "\"http://eq10q.sourceforge.net/compressor_stereo_sc\"") set( Dyn_Channels_Count 2) configure_file("${PROJECT_SOURCE_DIR}/dynamics.c" "${PROJECT_SOURCE_DIR}/compressor_stereo_sc.c") add_library(compressor_stereo_sc SHARED compressor_stereo_sc.c) target_link_libraries( compressor_stereo_sc lib_vumeter lib_filter m) #Build BassUp DSP add_library(bassup SHARED bassup.c) target_link_libraries( bassup lib_filter m) #Build LR2MS DSP Stereo set( Matrix_Is_LR2MS 1) set( Matrix_Uri "\"http://eq10q.sourceforge.net/matrix_lr2ms\"") configure_file("${PROJECT_SOURCE_DIR}/midside_matrix.c" "${PROJECT_SOURCE_DIR}/matrix_lr2ms.c") add_library(matrix_lr2ms SHARED matrix_lr2ms.c) target_link_libraries( matrix_lr2ms lib_vumeter lib_filter m) #Build MS2LR DSP Stereo set( Matrix_Is_LR2MS 0) set( Matrix_Uri "\"http://eq10q.sourceforge.net/matrix_ms2lr\"") configure_file("${PROJECT_SOURCE_DIR}/midside_matrix.c" "${PROJECT_SOURCE_DIR}/matrix_ms2lr.c") add_library(matrix_ms2lr SHARED matrix_ms2lr.c) target_link_libraries( matrix_ms2lr lib_vumeter lib_filter m) #remove the lib prefix to all generated .so files set_target_properties(eq1qm eq1qs eq4qm eq4qs eq6qm eq6qs eq10qm eq10qs gate compressor compressor_sc gate_stereo compressor_stereo compressor_stereo_sc bassup matrix_lr2ms matrix_ms2lr PROPERTIES PREFIX "") #CLEAN generated .c files on run 'make clean' SET(generatedEqConfigFiles ${PROJECT_SOURCE_DIR}/eq1qm.c;${PROJECT_SOURCE_DIR}/eq1qs.c ${PROJECT_SOURCE_DIR}/eq4qm.c;${PROJECT_SOURCE_DIR}/eq4qs.c ${PROJECT_SOURCE_DIR}/eq6qm.c;${PROJECT_SOURCE_DIR}/eq6qs.c ${PROJECT_SOURCE_DIR}/eq10qm.c;${PROJECT_SOURCE_DIR}/eq10qs.c ${PROJECT_SOURCE_DIR}/gate_mono.c;${PROJECT_SOURCE_DIR}/compressor_mono.c;${PROJECT_SOURCE_DIR}/compressor_mono_sc.c ${PROJECT_SOURCE_DIR}/gate_stereo.c;${PROJECT_SOURCE_DIR}/compressor_stereo.c;${PROJECT_SOURCE_DIR}/compressor_stereo_sc.c ${PROJECT_SOURCE_DIR}/matrix_lr2ms.c;${PROJECT_SOURCE_DIR}/matrix_ms2lr.c ) SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${generatedEqConfigFiles}") ##===========================THE LV2 INSTALLER================================================ #INSTALL( DIRECTORY "${PROJECT_SOURCE_DIR}/${LV2_BUNDLE}" DESTINATION "${LV2_BUNDLE}") INSTALL( FILES "manifest.ttl" "eq1qm.ttl" "eq1qs.ttl" "eq4qm.ttl" "eq4qs.ttl" "eq6qm.ttl" "eq6qs.ttl" "eq10qm.ttl" "eq10qs.ttl" "gate.ttl" "compressor.ttl" "compressor_sc.ttl" "gate_stereo.ttl" "compressor_stereo.ttl" "compressor_stereo_sc.ttl" "bassup.ttl" "lr2ms.ttl" "ms2lr.ttl" DESTINATION "${LV2_BUNDLE}") INSTALL( TARGETS eq1qm eq1qs eq4qm eq4qs eq6qm eq6qs eq10qm eq10qs gate compressor compressor_sc gate_stereo compressor_stereo compressor_stereo_sc bassup matrix_lr2ms matrix_ms2lr DESTINATION "${LV2_BUNDLE}") INCLUDE(CPack) # cpack -G TGZ eq10q-2.2/bassup.c0000644000175000001440000001104713023240624013327 0ustar sapistausers/*************************************************************************** * Copyright (C) 2011 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ /*************************************************************************** This file is the implementation of the BassUp plugin This plugin is inside the Sapista Plugins Bundle ****************************************************************************/ #include #include #include #include #include "dsp/filter.h" #define BASSUP_URI "http://eq10q.sourceforge.net/bassup" #define PORT_OUTPUT 0 #define PORT_INPUT 1 #define PORT_AMOUNT 2 #define NUM_OF_HPF_STAGES 4 #define HPF_FREQ 50.0f #define LPF_FREQ 200.0f typedef struct { //Plugin ports float *amount; float *output; const float *input; //Plugin Internal data float sample_rate; Filter *LPF_fil, *HPF_fil[4]; Buffers LPF_buf, HPF_buf[4]; } BassUp; static void cleanupBassUp(LV2_Handle instance) { BassUp *plugin = (BassUp *)instance; int i; for(i=0; iHPF_fil[i]); } FilterClean(plugin->LPF_fil); free(instance); } static void connectPortBassUp(LV2_Handle instance, uint32_t port, void *data) { BassUp *plugin = (BassUp *)instance; switch (port) { case PORT_AMOUNT: plugin->amount = (float*)data; break; case PORT_INPUT: plugin->input = (const float*)data; break; case PORT_OUTPUT: plugin->output = (float*)data; break; } } static LV2_Handle instantiateBassUp(const LV2_Descriptor *descriptor, double s_rate, const char *path, const LV2_Feature *const * features) { BassUp *plugin_data = (BassUp *)malloc(sizeof(BassUp)); plugin_data->sample_rate = s_rate; int i; for(i =0; iHPF_fil[i] = FilterInit(s_rate); flushBuffers(&plugin_data->HPF_buf[i]); calcCoefs(plugin_data->HPF_fil[i], 0.0, HPF_FREQ, 0.75, F_HPF_ORDER_2, 1.0); } plugin_data->LPF_fil = FilterInit(s_rate); flushBuffers(&plugin_data->LPF_buf); calcCoefs(plugin_data->LPF_fil, 0.0, LPF_FREQ, 0.75, F_LPF_ORDER_2, 1.0); return (LV2_Handle)plugin_data; } #define DENORMAL_TO_ZERO_FLOAT(x) if (fabs(x) < (1e-30)) x = 0.f; //Min float is 1.1754943e-38 static void runBassUp(LV2_Handle instance, uint32_t sample_count) { BassUp *plugin_data = (BassUp *)instance; const float amount = *(plugin_data->amount); double bassSignal; for (uint32_t i = 0; i < sample_count; ++i) { //bassSignal bassSignal = (double)fabs(plugin_data->input[i]); //Apply Filters int j; for(j=0; jHPF_fil[j], &plugin_data->HPF_buf[j], &bassSignal); } computeFilter(plugin_data->LPF_fil, &plugin_data->LPF_buf, &bassSignal); //Output plugin_data->output[i] = (float)bassSignal*amount + plugin_data->input[i]; } } static const LV2_Descriptor bassupDescriptor = { BASSUP_URI, instantiateBassUp, connectPortBassUp, NULL, runBassUp, NULL, cleanupBassUp, NULL }; LV2_SYMBOL_EXPORT const LV2_Descriptor *lv2_descriptor(uint32_t index) { switch (index) { case 0: return &bassupDescriptor; default: return NULL; } } eq10q-2.2/eq1qm.ttl0000644000175000001440000000760513023240632013443 0ustar sapistausers@prefix lv2: . @prefix foaf: . @prefix doap: . @prefix guiext: . @prefix atom: . @prefix urid: . @prefix rsz: . @prefix units: . @prefix pprop: . a foaf:Person ; foaf:name "Pere Ràfols Soler" ; foaf:mbox ; foaf:homepage . a doap:Project ; doap:maintainer ; doap:name "EQ10Q plugins" . ##LV2 GUI extension a guiext:GtkUI; guiext:binary ; lv2:requiredFeature urid:map; lv2:optionalFeature guiext:noUserResize. ##LV2 plugin binary a lv2:Plugin, lv2:EQPlugin, doap:Project; lv2:binary ; doap:name "EQ1Q Mono"; doap:license ; lv2:requiredFeature urid:map; lv2:optionalFeature lv2:hardRTCapable; lv2:project ; guiext:ui ; lv2:port [ a lv2:ControlPort, lv2:InputPort; lv2:index 0; lv2:symbol "bypass"; lv2:name "Bypass"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 1; lv2:symbol "input_gain"; lv2:name "Input Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 2; lv2:symbol "output_gain"; lv2:name "Output Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:AudioPort, lv2:InputPort; lv2:index 3; lv2:symbol "input"; lv2:name "Input"; ], [ a lv2:AudioPort, lv2:OutputPort; lv2:index 4; lv2:symbol "output"; lv2:name "Output"; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 5; lv2:symbol "filter1_gain"; lv2:name "Filter 1 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 6; lv2:symbol "filter1_freq"; lv2:name "Filter 1 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 1000; units:unit units:hz ; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 7; lv2:symbol "filter1_q"; lv2:name "Filter 1 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 8; lv2:symbol "filter1_type"; lv2:name "Filter 1 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 11; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 9; lv2:symbol "filter1_enable"; lv2:name "Filter 1 Enable"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 10; lv2:symbol "in_vu_ctl"; lv2:name "In Vu CTL"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 11; lv2:symbol "out_vu_ctl"; lv2:name "Out VU CTL"; ], [ a lv2:OutputPort , atom:AtomPort ; atom:bufferType atom:Sequence ; lv2:index 12 ; lv2:symbol "notify" ; lv2:name "Notify" ; rsz:minimumSize 73000; ], [ a atom:AtomPort , lv2:InputPort ; atom:bufferType atom:Sequence ; lv2:designation lv2:control ; lv2:index 13 ; lv2:symbol "control" ; lv2:name "Control" ]. eq10q-2.2/dynamics.c0000644000175000001440000004207413023240632013644 0ustar sapistausers/*************************************************************************** * Copyright (C) 2011 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ /*************************************************************************** This file is the implementation of the DYN plugin This plugin is inside the Sapista Plugins Bundle This file implements functionalities for diferent dynamic plugins ****************************************************************************/ #include #include #include #include #include "dsp/db.h" #include "dsp/fastmath.h" #include "dsp/vu.h" #include "dsp/filter.h" #define @Plugin_Is_Dynamics_Compressor@ #define USE_EQ10Q_FAST_MATH #define NUM_CHANNELS @Dyn_Channels_Count@ #define DYN_URI @Dyn_Uri@ #define PORT_OUTPUT_L 0 #define PORT_INPUT_L 1 #define PORT_KEY_LISTEN 2 #define PORT_THRESHOLD 3 #define PORT_ATACK 4 #define PORT_HOLD_MAKEUP 5 #define PORT_DECAY 6 #define PORT_RATIO 7 #define PORT_HPFFREQ 8 #define PORT_LPFFREQ 9 #define PORT_GAIN 10 #define PORT_INVU 11 #define PORT_GAINREDUCTION 12 #define PORT_KNEE 13 #define PORT_DRY_WET 14 #ifdef PLUGIN_IS_COMPRESSOR #define PORT_FEEDBACK 15 #define PORT_COMP_MODE 16 #define PORT_PUNCH 17 #define PORT_OUTPUT_R 18 #define PORT_INPUT_R 19 #else #ifdef PLUGIN_IS_COMPRESSOR_WITH_SC #define PORT_SC_ACTIVE 15 #define PORT_COMP_MODE 16 #define PORT_PUNCH 17 #if NUM_CHANNELS==1 #define PORT_SC_AUDIO_IN 18 #else #define PORT_OUTPUT_R 18 #define PORT_INPUT_R 19 #define PORT_SC_AUDIO_IN 20 #endif #else #define PORT_RANGE 15 #define PORT_OUTPUT_R 16 #define PORT_INPUT_R 17 #endif #endif #define K_BIAS_GAIN 0.0891250938133745507219174442070652730762958526611328125f //A trick to change the dinamic range of the fast_db2lin10 method for gate plugin typedef struct { //Plugin ports float *key_listen; float *threshold; float *attack; float *hold_makeup; //Hold for gate makeup for compressor/expander float *decay; float *ratio; float *output[NUM_CHANNELS]; float *gainreduction; const float *input[NUM_CHANNELS]; float *hpffreq; float *lpffreq; float *ingain; float *fVuIn; float *drywet; float *knee; #ifdef PLUGIN_IS_COMPRESSOR float *feedback; float *compressor_mode; #else #ifdef PLUGIN_IS_COMPRESSOR_WITH_SC float *sidechain_active; float *compressor_mode; const float *input_sidechain; #else float *range; #endif #endif #if defined(PLUGIN_IS_COMPRESSOR) || defined(PLUGIN_IS_COMPRESSOR_WITH_SC) float *punch; float g_error0; #endif //Plugin Internal data float sample_rate; float g; int hold_count; Vu *InputVu[1]; float detector_vu; float noise; Filter *LPF_fil, *HPF_fil; Buffers LPF_buf, HPF_buf; float *LutLog10; double PGAOut_L; #if NUM_CHANNELS == 2 double PGAOut_R; #endif } Dynamics; static void cleanupDyn(LV2_Handle instance) { Dynamics *plugin = (Dynamics *)instance; free(plugin->LutLog10); VuClean(plugin->InputVu[0]); FilterClean(plugin->HPF_fil); FilterClean(plugin->LPF_fil); free(instance); } static void connectPortDyn(LV2_Handle instance, uint32_t port, void *data) { Dynamics *plugin = (Dynamics *)instance; switch (port) { case PORT_KEY_LISTEN: plugin->key_listen = (float*)data; break; case PORT_THRESHOLD: plugin->threshold = (float*)data; break; case PORT_ATACK: plugin->attack = (float*)data; break; case PORT_HOLD_MAKEUP: plugin->hold_makeup = (float*)data; break; case PORT_DECAY: plugin->decay = (float*)data; break; case PORT_RATIO: plugin->ratio = (float*)data; break; case PORT_INPUT_L: plugin->input[0] = (const float*)data; break; case PORT_OUTPUT_L: plugin->output[0] = (float*)data; break; case PORT_GAINREDUCTION: plugin->gainreduction = (float*)data; break; case PORT_HPFFREQ: plugin->hpffreq = (float*)data; break; case PORT_LPFFREQ: plugin->lpffreq = (float*)data; break; case PORT_GAIN: plugin->ingain = (float*)data; break; case PORT_INVU: plugin->fVuIn=(float*)data; break; case PORT_DRY_WET: plugin->drywet = (float*)data; break; case PORT_KNEE: plugin->knee = (float*)data; break; #ifdef PLUGIN_IS_COMPRESSOR case PORT_FEEDBACK: plugin->feedback = (float*)data; break; case PORT_COMP_MODE: plugin->compressor_mode = (float*)data; break; case PORT_PUNCH: plugin->punch = (float*)data; break; #else #ifdef PLUGIN_IS_COMPRESSOR_WITH_SC case PORT_SC_ACTIVE: plugin->sidechain_active = (float*)data; break; case PORT_COMP_MODE: plugin->compressor_mode = (float*)data; break; case PORT_SC_AUDIO_IN: plugin->input_sidechain = (const float*)data; break; case PORT_PUNCH: plugin->punch = (float*)data; break; #else case PORT_RANGE: plugin->range = (float*)data; break; #endif #endif #if NUM_CHANNELS == 2 case PORT_INPUT_R: plugin->input[1] = (const float*)data; break; case PORT_OUTPUT_R: plugin->output[1] = (float*)data; break; #endif } } static LV2_Handle instantiateDyn(const LV2_Descriptor *descriptor, double s_rate, const char *path, const LV2_Feature *const * features) { Dynamics *plugin_data = (Dynamics *)malloc(sizeof(Dynamics)); plugin_data->LutLog10 = GenerateLog10LUT(); plugin_data->sample_rate = s_rate; plugin_data->hold_count = 1000000; #ifdef PLUGIN_IS_GATE plugin_data->g = 0.0f; #endif #if defined(PLUGIN_IS_COMPRESSOR) || defined(PLUGIN_IS_COMPRESSOR_WITH_SC) plugin_data->g = 1.0f; plugin_data->g_error0 = 0.0f; #endif plugin_data->InputVu[0] = VuInit(s_rate); plugin_data->detector_vu = 0.0f; plugin_data->noise = 0.0001; //the noise to get the GR VU workin in GUI plugin_data->HPF_fil = FilterInit(s_rate); plugin_data->LPF_fil = FilterInit(s_rate); plugin_data->PGAOut_L = 0.0; #if NUM_CHANNELS == 2 plugin_data->PGAOut_R = 0.0; #endif flushBuffers(&plugin_data->LPF_buf); flushBuffers(&plugin_data->HPF_buf); return (LV2_Handle)plugin_data; } #define DENORMAL_TO_ZERO_FLOAT(x) if (fabs(x) < (1e-30)) x = 0.f; //Min float is 1.1754943e-38 static void runDyn(LV2_Handle instance, uint32_t sample_count) { Dynamics *plugin_data = (Dynamics *)instance; const float attack = *(plugin_data->attack); const float decay = *(plugin_data->decay); const float hpffreq = *(plugin_data->hpffreq); const float lpffreq = *(plugin_data->lpffreq); const float KeyListen = *(plugin_data->key_listen); const float InputGain = dB2Lin(*(plugin_data->ingain)); const float DryWet = *(plugin_data->drywet); float gr_meter = 1.0f; const float ratio = *(plugin_data->ratio); const float threshold = *(plugin_data->threshold); const float knee = *(plugin_data->knee); //Read ports (gate) #ifdef PLUGIN_IS_GATE const float range = *(plugin_data->range); const float hold = *(plugin_data->hold_makeup); const float threshold_lin = Fast_dB2Lin10(*(plugin_data->threshold)); #endif //Read ports (compressor/expander) #if defined(PLUGIN_IS_COMPRESSOR) || defined(PLUGIN_IS_COMPRESSOR_WITH_SC) const float makeup = dB2Lin(*(plugin_data->hold_makeup)); const float punch = *(plugin_data->punch); #else const float makeup = 1.0f; #endif #ifdef PLUGIN_IS_COMPRESSOR const double FeedBack = (double)*(plugin_data->feedback); const int bIsOptoCompressor = *(plugin_data->compressor_mode) > 0.5 ? 1 : 0; const double SideChainActive = 0.0; #endif #ifdef PLUGIN_IS_COMPRESSOR_WITH_SC const double SideChainActive = (double)*(plugin_data->sidechain_active); const double FeedBack = 0.0; const int bIsOptoCompressor = *(plugin_data->compressor_mode) > 0.5 ? 1 : 0; #endif //Plguin data float input_detector; float sample_rate = plugin_data->sample_rate; float g = plugin_data->g; int hold_count = plugin_data->hold_count; float x_dB, y_dB; float knee_range; //Processor vars (only for gate) #ifdef PLUGIN_IS_GATE const float range_lin = pow(10, range * 0.05); const int hold_max = (int)round(hold * sample_rate * 0.001f); const float Kac = pow((range_lin/(1.0f-range_lin))*((1.0f-0.9f)/0.9f), 1.0f/(attack*0.001f*sample_rate)); //Attack constant for S curve in gate #endif //Processor vars (only COMPRESSOR) #if defined(PLUGIN_IS_COMPRESSOR) || defined(PLUGIN_IS_COMPRESSOR_WITH_SC) float g_error = 0.0f; float scl = 0.0f; const float range_lin = pow(10, -12 * 0.05); //By various tests -12 dB is the optimal setting for the release time of a opto-compressor const float Kdc = pow((range_lin/(1.0f-range_lin))*((1.0f-0.6f)/0.6f), 1.0f/(decay*0.001f*sample_rate)); //Decay constant for S curve in compressor #endif //Processor vars common const float ac = exp(-6.0f/(attack * sample_rate * 0.001f)); //Attack constant in compressor const float dc = exp(-2.0f/(decay * sample_rate * 0.001f)); //Decay constant float detector_vu = plugin_data->detector_vu; float gain_reduction = 0.0f; float input_filtered = 0.0f; double dToFiltersChain = 0.0; float input_preL; #if defined(PLUGIN_IS_COMPRESSOR) || defined(PLUGIN_IS_COMPRESSOR_WITH_SC) float input_sc = 0.0; #endif #if NUM_CHANNELS == 2 float input_preR; #endif for (uint32_t i = 0; i < sample_count; ++i) { //Compute filter coeficients if(hpffreq != plugin_data->HPF_fil->freq) { calcCoefs(plugin_data->HPF_fil, 0.0, hpffreq, 0.75, F_HPF_ORDER_2, 1.0); } if(lpffreq != plugin_data->LPF_fil->freq) { calcCoefs(plugin_data->LPF_fil, 0.0, lpffreq, 0.75, F_LPF_ORDER_2, 1.0); } //Input gain input_preL = plugin_data->input[0][i] * InputGain; #ifdef PLUGIN_IS_COMPRESSOR_WITH_SC input_sc = plugin_data->input_sidechain[i]; #endif #if defined(PLUGIN_IS_COMPRESSOR) || defined(PLUGIN_IS_COMPRESSOR_WITH_SC) dToFiltersChain = ((double)input_preL * (1.0 - FeedBack) + plugin_data->PGAOut_L*FeedBack)*(1.0 - SideChainActive) + (double)input_sc * SideChainActive; #else dToFiltersChain = (double)input_preL; #endif #if NUM_CHANNELS == 2 input_preR = plugin_data->input[1][i] * InputGain; #if defined(PLUGIN_IS_COMPRESSOR) || defined(PLUGIN_IS_COMPRESSOR_WITH_SC) dToFiltersChain = (((double)(input_preL + input_preR)*(1.0 - FeedBack) + (plugin_data->PGAOut_L + plugin_data->PGAOut_R)*FeedBack )*0.5)*(1.0 - SideChainActive) + (double)input_sc * SideChainActive; #else dToFiltersChain = (double)(input_preL + input_preR)*0.5; #endif #endif //Apply Filters computeFilter(plugin_data->LPF_fil, &plugin_data->LPF_buf, &dToFiltersChain); computeFilter(plugin_data->HPF_fil, &plugin_data->HPF_buf, &dToFiltersChain); input_filtered = (float)dToFiltersChain; //Detector signal used for Threshold VU-meter in both gate and compressor, also used in expander hold input_detector = fabs(input_filtered); //This is the detector signal filtered //Thresholding and gain computer #ifdef USE_EQ10Q_FAST_MATH x_dB = 20.0f * fastLog10((int*)(&input_filtered), plugin_data->LutLog10); #else x_dB = 20.0f*log10(fabs(input_filtered) + 0.00001f); //Add -100dB constant to avoid zero crozing #endif knee_range = 2.0f*(x_dB - threshold); //Sample to Input TH-Vumeter if(input_detector >= detector_vu) { detector_vu = input_detector - (input_detector - detector_vu)*ac; } else { detector_vu = input_detector - (input_detector - detector_vu)*dc; } SetSample(plugin_data->InputVu[0], detector_vu); //===================== GATE CODE ================================ #ifdef PLUGIN_IS_GATE if (knee_range < -knee) { //Under Threshold y_dB = threshold + (x_dB - threshold)*ratio; } else if(knee_range >= knee ) { //Over Threshold y_dB = x_dB; } else { //On Knee y_dB = x_dB + ((1.0 - ratio)*(x_dB - threshold - knee/2)*(x_dB - threshold - knee/2))/(2*knee); } if( y_dB < x_dB + range ) { y_dB = x_dB + range; } //Linear gain computing #ifdef USE_EQ10Q_FAST_MATH gain_reduction = K_BIAS_GAIN*Fast_dB2Lin10(y_dB - x_dB + 22); //22dB bias compensated with K_BIAS_GAIN linear multiplication. This allows a good response of Fast_dB2Lin10 at -90 dB range #else gain_reduction = pow(10.0f, 0.05f*(y_dB - x_dB)); #endif //Ballistics and peak detector hold_count = input_detector > threshold_lin ? 0 : hold_count; if(gain_reduction > g) { //Gate/Expander OFF (Opening) g = 1.0f/(1.0f + Kac*((1.0f - g)/(g + 1e-8f))); gain_reduction = g > gain_reduction ? gain_reduction : g; } else { //Gate/Expander ON (Closeing) if(hold_count > hold_max) { gain_reduction = gain_reduction - (gain_reduction - g)*dc; //Log-Curve release } else { //Holding... gain_reduction = g; } } hold_count++; //----------------------------------------------------------- #endif //===================== END OF GATE CODE ========================= //=================== COMPRESSOR CODE ============================ #if defined(PLUGIN_IS_COMPRESSOR) || defined(PLUGIN_IS_COMPRESSOR_WITH_SC) if (knee_range < -knee) { //Under Threshold y_dB = x_dB; } else if(knee_range >= knee ) { //Over Threshold y_dB = threshold + (x_dB - threshold)/ratio; } else { //On Knee y_dB = x_dB + ((1.0f/ratio -1.0f)*(x_dB - threshold + knee/2.0f)*(x_dB - threshold + knee/2.0f))/(2.0f*knee); } //Linear gain computing #ifdef USE_EQ10Q_FAST_MATH gain_reduction = Fast_dB2Lin8(y_dB - x_dB); #else gain_reduction = pow(10.0f, 0.05f*(y_dB - x_dB)); #endif //Ballistics and peak detector if(gain_reduction > g) { //Compressor OFF if(bIsOptoCompressor) { gain_reduction = 1.0f/(1.0f + Kdc*((1.0f - g)/(g + 1e-8f))); //S-Curve release } else { gain_reduction = 1.0f - (1.0f - g)*dc; //Log-Curve release } } else { //Compressor ON g_error = gain_reduction - g; scl = punch*(g_error*plugin_data->g_error0)/((1.0f-gain_reduction + 1e-8f)*(1.0f-gain_reduction + 1e-8f)); gain_reduction = (gain_reduction - (g_error*ac))*(1.0f- scl) + scl*g; plugin_data->g_error0 = g_error; } #endif //=================== END OF COMPRESSOR CODE ====================== DENORMAL_TO_ZERO_FLOAT(gain_reduction); g = gain_reduction; gr_meter = gain_reduction < gr_meter ? gain_reduction : gr_meter; plugin_data->PGAOut_L = (double)input_preL * gain_reduction; plugin_data->output[0][i] = input_filtered*(KeyListen) + (input_preL*(1.0f - DryWet) + makeup*(float)plugin_data->PGAOut_L*DryWet)*(1-KeyListen); #if NUM_CHANNELS == 2 plugin_data->PGAOut_R = (double)input_preR * gain_reduction; plugin_data->output[1][i] = input_filtered*(KeyListen) + (input_preR*(1.0f - DryWet) + makeup*(float)plugin_data->PGAOut_R*DryWet)*(1-KeyListen); #endif } plugin_data->g = g; plugin_data->hold_count = hold_count; plugin_data->noise *= -1.0; plugin_data->detector_vu = detector_vu; *(plugin_data->gainreduction) = 1.0/gr_meter + plugin_data->noise; // + ((float)(rand() % 100)/100.0);; //OK esta en lineal *(plugin_data->fVuIn) = ComputeVu(plugin_data->InputVu[0], sample_count); } static const LV2_Descriptor dynDescriptor = { DYN_URI, instantiateDyn, connectPortDyn, NULL, runDyn, NULL, cleanupDyn, NULL }; LV2_SYMBOL_EXPORT const LV2_Descriptor *lv2_descriptor(uint32_t index) { switch (index) { case 0: return &dynDescriptor; default: return NULL; } } eq10q-2.2/eq4qm.ttl0000644000175000001440000001656013023240632013446 0ustar sapistausers@prefix lv2: . @prefix foaf: . @prefix doap: . @prefix guiext: . @prefix atom: . @prefix urid: . @prefix rsz: . @prefix units: . @prefix pprop: . a foaf:Person ; foaf:name "Pere Ràfols Soler" ; foaf:mbox ; foaf:homepage . a doap:Project ; doap:maintainer ; doap:name "EQ10Q plugins" . ##LV2 GUI extension a guiext:GtkUI; guiext:binary ; lv2:requiredFeature urid:map; lv2:optionalFeature guiext:noUserResize. ##LV2 plugin binary a lv2:Plugin, lv2:EQPlugin, doap:Project; lv2:binary ; doap:name "EQ4Q Mono"; doap:license ; lv2:requiredFeature urid:map; lv2:optionalFeature lv2:hardRTCapable; lv2:project ; guiext:ui ; lv2:port [ a lv2:ControlPort, lv2:InputPort; lv2:index 0; lv2:symbol "bypass"; lv2:name "Bypass"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 1; lv2:symbol "input_gain"; lv2:name "Input Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 2; lv2:symbol "output_gain"; lv2:name "Output Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:AudioPort, lv2:InputPort; lv2:index 3; lv2:symbol "input"; lv2:name "Input"; ], [ a lv2:AudioPort, lv2:OutputPort; lv2:index 4; lv2:symbol "output"; lv2:name "Output"; ], ##############GAIN PORTS######################### [ a lv2:ControlPort, lv2:InputPort; lv2:index 5; lv2:symbol "filter1_gain"; lv2:name "Filter 1 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 6; lv2:symbol "filter2_gain"; lv2:name "Filter 2 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 7; lv2:symbol "filter3_gain"; lv2:name "Filter 3 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 8; lv2:symbol "filter4_gain"; lv2:name "Filter 4 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], ###########FREQ PORTS######################## [ a lv2:ControlPort, lv2:InputPort; lv2:index 9; lv2:symbol "filter1_freq"; lv2:name "Filter 1 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 30; units:unit units:hz ; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 10; lv2:symbol "filter2_freq"; lv2:name "Filter 2 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 150; units:unit units:hz ; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 11; lv2:symbol "filter3_freq"; lv2:name "Filter 3 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 750; units:unit units:hz ; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 12; lv2:symbol "filter4_freq"; lv2:name "Filter 4 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 3750; units:unit units:hz ; lv2:portProperty pprop:logarithmic; ], ################## Q PORTS ##################### [ a lv2:ControlPort, lv2:InputPort; lv2:index 13; lv2:symbol "filter1_q"; lv2:name "Filter 1 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 0.7; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 14; lv2:symbol "filter2_q"; lv2:name "Filter 2 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 0.7; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 15; lv2:symbol "filter3_q"; lv2:name "Filter 3 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 16; lv2:symbol "filter4_q"; lv2:name "Filter 4 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 0.7; ], ######### TYPE PORTS #################### [ a lv2:ControlPort, lv2:InputPort; lv2:index 17; lv2:symbol "filter1_type"; lv2:name "Filter 1 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 6; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 18; lv2:symbol "filter2_type"; lv2:name "Filter 2 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 9; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 19; lv2:symbol "filter3_type"; lv2:name "Filter 3 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 11; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 20; lv2:symbol "filter4_type"; lv2:name "Filter 4 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 10; lv2:portProperty lv2:integer; ], ################# ENABLE PORTS ################### [ a lv2:ControlPort, lv2:InputPort; lv2:index 21; lv2:symbol "filter1_enable"; lv2:name "Filter 1 Enable"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 22; lv2:symbol "filter2_enable"; lv2:name "Filter 2 Enable"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 23; lv2:symbol "filter3_enable"; lv2:name "Filter 3 Enable"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 24; lv2:symbol "filter4_enable"; lv2:name "Filter 4 Enable"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], ############## VU PORTS ############################ [ a lv2:ControlPort, lv2:OutputPort; lv2:index 25; lv2:symbol "in_vu_ctl"; lv2:name "In Vu CTL"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 26; lv2:symbol "out_vu_ctl"; lv2:name "Out VU CTL"; ], [ a lv2:OutputPort , atom:AtomPort ; atom:bufferType atom:Sequence ; lv2:index 27 ; lv2:symbol "notify" ; lv2:name "Notify" ; rsz:minimumSize 73000; ], [ a atom:AtomPort , lv2:InputPort ; atom:bufferType atom:Sequence ; lv2:designation lv2:control ; lv2:index 28 ; lv2:symbol "control" ; lv2:name "Control" ]. eq10q-2.2/eq6qm.ttl0000644000175000001440000002276013023240632013447 0ustar sapistausers@prefix lv2: . @prefix foaf: . @prefix doap: . @prefix guiext: . @prefix atom: . @prefix urid: . @prefix rsz: . @prefix units: . @prefix pprop: . a foaf:Person ; foaf:name "Pere Ràfols Soler" ; foaf:mbox ; foaf:homepage . a doap:Project ; doap:maintainer ; doap:name "EQ10Q plugins" . ##LV2 GUI extension a guiext:GtkUI; guiext:binary ; lv2:requiredFeature urid:map; lv2:optionalFeature guiext:noUserResize. ##LV2 plugin binary a lv2:Plugin, lv2:EQPlugin, doap:Project; lv2:binary ; doap:name "EQ6Q Mono"; doap:license ; lv2:requiredFeature urid:map; lv2:optionalFeature lv2:hardRTCapable; lv2:project ; guiext:ui ; lv2:port [ a lv2:ControlPort, lv2:InputPort; lv2:index 0; lv2:symbol "bypass"; lv2:name "Bypass"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 1; lv2:symbol "input_gain"; lv2:name "Input Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 2; lv2:symbol "output_gain"; lv2:name "Output Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:AudioPort, lv2:InputPort; lv2:index 3; lv2:symbol "input"; lv2:name "Input"; ], [ a lv2:AudioPort, lv2:OutputPort; lv2:index 4; lv2:symbol "output"; lv2:name "Output"; ], ##############GAIN PORTS######################### [ a lv2:ControlPort, lv2:InputPort; lv2:index 5; lv2:symbol "filter1_gain"; lv2:name "Filter 1 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 6; lv2:symbol "filter2_gain"; lv2:name "Filter 2 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 7; lv2:symbol "filter3_gain"; lv2:name "Filter 3 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 8; lv2:symbol "filter4_gain"; lv2:name "Filter 4 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 9; lv2:symbol "filter5_gain"; lv2:name "Filter 5 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 10; lv2:symbol "filter6_gain"; lv2:name "Filter 6 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], ###########FREQ PORTS######################## [ a lv2:ControlPort, lv2:InputPort; lv2:index 11; lv2:symbol "filter1_freq"; lv2:name "Filter 1 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 30; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 12; lv2:symbol "filter2_freq"; lv2:name "Filter 2 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 90; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 13; lv2:symbol "filter3_freq"; lv2:name "Filter 3 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 270; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 14; lv2:symbol "filter4_freq"; lv2:name "Filter 4 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 810; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 15; lv2:symbol "filter5_freq"; lv2:name "Filter 5 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 2430; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 16; lv2:symbol "filter6_freq"; lv2:name "Filter 6 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 7290; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], ################## Q PORTS ##################### [ a lv2:ControlPort, lv2:InputPort; lv2:index 17; lv2:symbol "filter1_q"; lv2:name "Filter 1 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 0.7; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 18; lv2:symbol "filter2_q"; lv2:name "Filter 2 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 0.7; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 19; lv2:symbol "filter3_q"; lv2:name "Filter 3 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 20; lv2:symbol "filter4_q"; lv2:name "Filter 4 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 21; lv2:symbol "filter5_q"; lv2:name "Filter 5 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 22; lv2:symbol "filter6_q"; lv2:name "Filter 6 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 0.7; ], ######### TYPE PORTS #################### [ a lv2:ControlPort, lv2:InputPort; lv2:index 23; lv2:symbol "filter1_type"; lv2:name "Filter 1 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 6; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 24; lv2:symbol "filter2_type"; lv2:name "Filter 2 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 9; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 25; lv2:symbol "filter3_type"; lv2:name "Filter 3 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 11; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 26; lv2:symbol "filter4_type"; lv2:name "Filter 4 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 11; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 27; lv2:symbol "filter5_type"; lv2:name "Filter 5 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 11; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 28; lv2:symbol "filter6_type"; lv2:name "Filter 6 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 10; lv2:portProperty lv2:integer; ], ################# ENABLE PORTS ################### [ a lv2:ControlPort, lv2:InputPort; lv2:index 29; lv2:symbol "filter1_enable"; lv2:name "Filter 1 Enable"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 30; lv2:symbol "filter2_enable"; lv2:name "Filter 2 Enable"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 31; lv2:symbol "filter3_enable"; lv2:name "Filter 3 Enable"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 32; lv2:symbol "filter4_enable"; lv2:name "Filter 4 Enable"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 33; lv2:symbol "filter5_enable"; lv2:name "Filter 5 Enable"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 34; lv2:symbol "filter6_enable"; lv2:name "Filter 6 Enable"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], ############## VU PORTS ############################ [ a lv2:ControlPort, lv2:OutputPort; lv2:index 35; lv2:symbol "in_vu_ctl"; lv2:name "In Vu CTL"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 36; lv2:symbol "out_vu_ctl"; lv2:name "Out VU CTL"; ], [ a lv2:OutputPort , atom:AtomPort ; atom:bufferType atom:Sequence ; lv2:index 37 ; lv2:symbol "notify" ; lv2:name "Notify" ; rsz:minimumSize 73000; ], [ a atom:AtomPort , lv2:InputPort ; atom:bufferType atom:Sequence ; lv2:designation lv2:control ; lv2:index 38 ; lv2:symbol "control" ; lv2:name "Control" ]. eq10q-2.2/eq1qs.ttl0000644000175000001440000001111413023240632013437 0ustar sapistausers@prefix lv2: . @prefix foaf: . @prefix doap: . @prefix guiext: . @prefix atom: . @prefix urid: . @prefix rsz: . @prefix units: . @prefix pprop: . a foaf:Person ; foaf:name "Pere Ràfols Soler" ; foaf:mbox ; foaf:homepage . a doap:Project ; doap:maintainer ; doap:name "EQ10Q plugins" . ##LV2 GUI extension a guiext:GtkUI; guiext:binary ; lv2:requiredFeature urid:map; lv2:optionalFeature guiext:noUserResize. ##LV2 plugin binary a lv2:Plugin, lv2:EQPlugin, doap:Project; lv2:binary ; doap:name "EQ1Q Stereo"; doap:license ; lv2:requiredFeature urid:map; lv2:optionalFeature lv2:hardRTCapable; lv2:project ; guiext:ui ; lv2:port [ a lv2:ControlPort, lv2:InputPort; lv2:index 0; lv2:symbol "bypass"; lv2:name "Bypass"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 1; lv2:symbol "input_gain"; lv2:name "Input Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 2; lv2:symbol "output_gain"; lv2:name "Output Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:AudioPort, lv2:InputPort; lv2:index 3; lv2:symbol "input1"; lv2:name "Input1"; ], [ a lv2:AudioPort, lv2:InputPort; lv2:index 4; lv2:symbol "input2"; lv2:name "Input2"; ], [ a lv2:AudioPort, lv2:OutputPort; lv2:index 5; lv2:symbol "output1"; lv2:name "Output1"; ], [ a lv2:AudioPort, lv2:OutputPort; lv2:index 6; lv2:symbol "output2"; lv2:name "Output2"; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 7; lv2:symbol "filter1_gain"; lv2:name "Filter 1 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 8; lv2:symbol "filter1_freq"; lv2:name "Filter 1 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 1000; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 9; lv2:symbol "filter1_q"; lv2:name "Filter 1 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 10; lv2:symbol "filter1_type"; lv2:name "Filter 1 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 11; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 11; lv2:symbol "filter1_enable"; lv2:name "Filter 1 Enable"; lv2:minimum 0; lv2:maximum 5; lv2:default 0; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 12; lv2:symbol "in_1_vu_ctl"; lv2:name "In 1 Vu CTL"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 13; lv2:symbol "in_2_vu_ctl"; lv2:name "In 2 Vu CTL"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 14; lv2:symbol "out_2_vu_ctl"; lv2:name "Out 1 VU CTL"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 15; lv2:symbol "out_2_vu_ctl"; lv2:name "Out 2 VU CTL"; ], [ a lv2:OutputPort , atom:AtomPort ; atom:bufferType atom:Sequence ; lv2:index 16 ; lv2:symbol "notify" ; lv2:name "Notify" ; rsz:minimumSize 73000; ], [ a atom:AtomPort , lv2:InputPort ; atom:bufferType atom:Sequence ; lv2:designation lv2:control ; lv2:index 17 ; lv2:symbol "control" ; lv2:name "Control" ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 18; lv2:symbol "midsidemode"; lv2:name "Mid Side Mode"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ]. eq10q-2.2/README0000644000175000001440000000471713023240632012553 0ustar sapistausersEQ10Q LV2 Plugin ----------------- EQ10Q is an audio plugin over the LV2 standard (http://lv2plug.in) implementing a powerfull and flexible parametric equalizer. Eq10q equalizer plugin includes a parametric equalization with diferent filter types like peaking, HPF, LPF, Shelving and Notch with IIR algorithms and a nice GUI displaying the equalization curve. At the moment we have implemented second order biquadratic filters (Peaking, Low Shelving, High Shelving and Notch), and configurable order (1, 2, 3, 4) HPF and LPF filters. All with IIR algorithms. And a GUI writed with Gtkmm (http://www.gtkmm.org) to control all the parameters and display the curve using plotmm (http://plotmm.sourceforge.net). The plugin is over LV2 standard and writed in C for the audio DSP and C++ for the GUI. EQ10Q is hosted at http://eq10q.sourceforge.net/ Main developer: Pere Ràfols Soler (sapista2@gmail.com) Installation ------------ EQ10Q plugin will be installed into /usr/local/lib/lv2 as default. Before install EQ10Q you must resolve all required libraries: - G++ compiler - cmake - pkg-config - LV2 Headers - Gtkmm >= 2.4 - FFTW3 To install EQ10Q in your system open a terminal, go to EQ10Q top level folder and just type: cmake ./ If cmake configures successfully the build enviorment then type: make If make finish successfully type the following as root make install To run EQ10Q you need a LV2 host. I recomend Ardour (<= 2.8.3) http://ardour.org Uninstallation -------------- Remove the EQ10Q directory, as default /usr/local/lib/lv2/sapistaEQv2.lv2 Copyright --------- * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * 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. eq10q-2.2/CodingStandar.txt0000644000175000001440000000101013023240632015133 0ustar sapistausersCoding standrd ============================================ Object declaration: ObjectClassType FooObject; Method declaration: void thisIsMethod(); Data members of an object int m_iDataMember; float m_fDataNumber; Pointer to standard type int *ptr_iPointerToInterger; float *ptr_fFoo; Pointer to object ObjectClassType *ptr_MyFooObjectPointer; Pointer to data member int *m_ptr_iIntegerPointer; ObjectClassType *m_ptr_MyFooPointer; TODO declaration: ///TODO: Description eq10q-2.2/eq4qs.ttl0000644000175000001440000002006513023240632013447 0ustar sapistausers@prefix lv2: . @prefix foaf: . @prefix doap: . @prefix guiext: . @prefix atom: . @prefix urid: . @prefix rsz: . @prefix units: . @prefix pprop: . a foaf:Person ; foaf:name "Pere Ràfols Soler" ; foaf:mbox ; foaf:homepage . a doap:Project ; doap:maintainer ; doap:name "EQ10Q plugins" . ##LV2 GUI extension a guiext:GtkUI; guiext:binary ; lv2:requiredFeature urid:map; lv2:optionalFeature guiext:noUserResize. ##LV2 plugin binary a lv2:Plugin, lv2:EQPlugin, doap:Project; lv2:binary ; doap:name "EQ4Q Stereo"; doap:license ; lv2:requiredFeature urid:map; lv2:optionalFeature lv2:hardRTCapable; lv2:project ; guiext:ui ; lv2:port [ a lv2:ControlPort, lv2:InputPort; lv2:index 0; lv2:symbol "bypass"; lv2:name "Bypass"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 1; lv2:symbol "input_gain"; lv2:name "Input Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 2; lv2:symbol "output_gain"; lv2:name "Output Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:AudioPort, lv2:InputPort; lv2:index 3; lv2:symbol "input1"; lv2:name "Input1"; ], [ a lv2:AudioPort, lv2:InputPort; lv2:index 4; lv2:symbol "input2"; lv2:name "Input2"; ], [ a lv2:AudioPort, lv2:OutputPort; lv2:index 5; lv2:symbol "output1"; lv2:name "Output1"; ], [ a lv2:AudioPort, lv2:OutputPort; lv2:index 6; lv2:symbol "output2"; lv2:name "Output2"; ], ##############GAIN PORTS######################### [ a lv2:ControlPort, lv2:InputPort; lv2:index 7; lv2:symbol "filter1_gain"; lv2:name "Filter 1 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 8; lv2:symbol "filter2_gain"; lv2:name "Filter 2 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 9; lv2:symbol "filter3_gain"; lv2:name "Filter 3 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 10; lv2:symbol "filter4_gain"; lv2:name "Filter 4 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], ###########FREQ PORTS######################## [ a lv2:ControlPort, lv2:InputPort; lv2:index 11; lv2:symbol "filter1_freq"; lv2:name "Filter 1 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 30; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 12; lv2:symbol "filter2_freq"; lv2:name "Filter 2 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 150; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 13; lv2:symbol "filter3_freq"; lv2:name "Filter 3 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 750; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 14; lv2:symbol "filter4_freq"; lv2:name "Filter 4 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 3750; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], ################## Q PORTS ##################### [ a lv2:ControlPort, lv2:InputPort; lv2:index 15; lv2:symbol "filter1_q"; lv2:name "Filter 1 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 0.7; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 16; lv2:symbol "filter2_q"; lv2:name "Filter 2 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 0.7; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 17; lv2:symbol "filter3_q"; lv2:name "Filter 3 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 18; lv2:symbol "filter4_q"; lv2:name "Filter 4 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 0.7; ], ######### TYPE PORTS #################### [ a lv2:ControlPort, lv2:InputPort; lv2:index 19; lv2:symbol "filter1_type"; lv2:name "Filter 1 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 6; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 20; lv2:symbol "filter2_type"; lv2:name "Filter 2 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 9; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 21; lv2:symbol "filter3_type"; lv2:name "Filter 3 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 11; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 22; lv2:symbol "filter4_type"; lv2:name "Filter 4 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 10; lv2:portProperty lv2:integer; ], ################# ENABLE PORTS ################### [ a lv2:ControlPort, lv2:InputPort; lv2:index 23; lv2:symbol "filter1_enable"; lv2:name "Filter 1 Enable"; lv2:minimum 0; lv2:maximum 5; lv2:default 0; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 24; lv2:symbol "filter2_enable"; lv2:name "Filter 2 Enable"; lv2:minimum 0; lv2:maximum 5; lv2:default 0; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 25; lv2:symbol "filter3_enable"; lv2:name "Filter 3 Enable"; lv2:minimum 0; lv2:maximum 5; lv2:default 0; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 26; lv2:symbol "filter4_enable"; lv2:name "Filter 4 Enable"; lv2:minimum 0; lv2:maximum 5; lv2:default 0; lv2:portProperty lv2:integer; ], ############## VU PORTS ############################ [ a lv2:ControlPort, lv2:OutputPort; lv2:index 27; lv2:symbol "in_1_vu_ctl"; lv2:name "In 1 Vu CTL"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 28; lv2:symbol "in_2_vu_ctl"; lv2:name "In 2 Vu CTL"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 29; lv2:symbol "out_2_vu_ctl"; lv2:name "Out 1 VU CTL"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 30; lv2:symbol "out_2_vu_ctl"; lv2:name "Out 2 VU CTL"; ], [ a lv2:OutputPort , atom:AtomPort ; atom:bufferType atom:Sequence ; lv2:index 31 ; lv2:symbol "notify" ; lv2:name "Notify" ; rsz:minimumSize 73000; ], [ a atom:AtomPort , lv2:InputPort ; atom:bufferType atom:Sequence ; lv2:designation lv2:control ; lv2:index 32 ; lv2:symbol "control" ; lv2:name "Control" ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 33; lv2:symbol "midsidemode"; lv2:name "Mid Side Mode"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ]. eq10q-2.2/eq6qs.ttl0000644000175000001440000002427313023240632013456 0ustar sapistausers@prefix lv2: . @prefix foaf: . @prefix doap: . @prefix guiext: . @prefix atom: . @prefix urid: . @prefix rsz: . @prefix units: . @prefix pprop: . a foaf:Person ; foaf:name "Pere Ràfols Soler" ; foaf:mbox ; foaf:homepage . a doap:Project ; doap:maintainer ; doap:name "EQ10Q plugins" . ##LV2 GUI extension a guiext:GtkUI; guiext:binary ; lv2:requiredFeature urid:map; lv2:optionalFeature guiext:noUserResize. ##LV2 plugin binary a lv2:Plugin, lv2:EQPlugin, doap:Project; lv2:binary ; doap:name "EQ6Q Stereo"; doap:license ; lv2:requiredFeature urid:map; lv2:optionalFeature lv2:hardRTCapable; lv2:project ; guiext:ui ; lv2:port [ a lv2:ControlPort, lv2:InputPort; lv2:index 0; lv2:symbol "bypass"; lv2:name "Bypass"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 1; lv2:symbol "input_gain"; lv2:name "Input Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 2; lv2:symbol "output_gain"; lv2:name "Output Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:AudioPort, lv2:InputPort; lv2:index 3; lv2:symbol "input1"; lv2:name "Input1"; ], [ a lv2:AudioPort, lv2:InputPort; lv2:index 4; lv2:symbol "input2"; lv2:name "Input2"; ], [ a lv2:AudioPort, lv2:OutputPort; lv2:index 5; lv2:symbol "output1"; lv2:name "Output1"; ], [ a lv2:AudioPort, lv2:OutputPort; lv2:index 6; lv2:symbol "output2"; lv2:name "Output2"; ], ##############GAIN PORTS######################### [ a lv2:ControlPort, lv2:InputPort; lv2:index 7; lv2:symbol "filter1_gain"; lv2:name "Filter 1 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 8; lv2:symbol "filter2_gain"; lv2:name "Filter 2 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 9; lv2:symbol "filter3_gain"; lv2:name "Filter 3 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 10; lv2:symbol "filter4_gain"; lv2:name "Filter 4 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 11; lv2:symbol "filter5_gain"; lv2:name "Filter 5 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 12; lv2:symbol "filter6_gain"; lv2:name "Filter 6 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], ###########FREQ PORTS######################## [ a lv2:ControlPort, lv2:InputPort; lv2:index 13; lv2:symbol "filter1_freq"; lv2:name "Filter 1 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 30; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 14; lv2:symbol "filter2_freq"; lv2:name "Filter 2 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 90; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 15; lv2:symbol "filter3_freq"; lv2:name "Filter 3 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 270; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 16; lv2:symbol "filter4_freq"; lv2:name "Filter 4 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 810; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 17; lv2:symbol "filter5_freq"; lv2:name "Filter 5 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 2430; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 18; lv2:symbol "filter6_freq"; lv2:name "Filter 6 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 7290; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], ################## Q PORTS ##################### [ a lv2:ControlPort, lv2:InputPort; lv2:index 19; lv2:symbol "filter1_q"; lv2:name "Filter 1 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 0.7; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 20; lv2:symbol "filter2_q"; lv2:name "Filter 2 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 0.7; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 21; lv2:symbol "filter3_q"; lv2:name "Filter 3 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 22; lv2:symbol "filter4_q"; lv2:name "Filter 4 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 23; lv2:symbol "filter5_q"; lv2:name "Filter 5 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 24; lv2:symbol "filter6_q"; lv2:name "Filter 6 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 0.7; ], ######### TYPE PORTS #################### [ a lv2:ControlPort, lv2:InputPort; lv2:index 25; lv2:symbol "filter1_type"; lv2:name "Filter 1 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 6; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 26; lv2:symbol "filter2_type"; lv2:name "Filter 2 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 9; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 27; lv2:symbol "filter3_type"; lv2:name "Filter 3 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 11; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 28; lv2:symbol "filter4_type"; lv2:name "Filter 4 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 11; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 29; lv2:symbol "filter5_type"; lv2:name "Filter 5 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 11; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 30; lv2:symbol "filter6_type"; lv2:name "Filter 6 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 10; lv2:portProperty lv2:integer; ], ################# ENABLE PORTS ################### [ a lv2:ControlPort, lv2:InputPort; lv2:index 31; lv2:symbol "filter1_enable"; lv2:name "Filter 1 Enable"; lv2:minimum 0; lv2:maximum 5; lv2:default 0; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 32; lv2:symbol "filter2_enable"; lv2:name "Filter 2 Enable"; lv2:minimum 0; lv2:maximum 5; lv2:default 0; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 33; lv2:symbol "filter3_enable"; lv2:name "Filter 3 Enable"; lv2:minimum 0; lv2:maximum 5; lv2:default 0; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 34; lv2:symbol "filter4_enable"; lv2:name "Filter 4 Enable"; lv2:minimum 0; lv2:maximum 5; lv2:default 0; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 35; lv2:symbol "filter5_enable"; lv2:name "Filter 5 Enable"; lv2:minimum 0; lv2:maximum 5; lv2:default 0; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 36; lv2:symbol "filter6_enable"; lv2:name "Filter 6 Enable"; lv2:minimum 0; lv2:maximum 5; lv2:default 0; lv2:portProperty lv2:integer; ], ############## VU PORTS ############################ [ a lv2:ControlPort, lv2:OutputPort; lv2:index 37; lv2:symbol "in_1_vu_ctl"; lv2:name "In 1 Vu CTL"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 38; lv2:symbol "in_2_vu_ctl"; lv2:name "In 2 Vu CTL"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 39; lv2:symbol "out_2_vu_ctl"; lv2:name "Out 1 VU CTL"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 40; lv2:symbol "out_2_vu_ctl"; lv2:name "Out 2 VU CTL"; ], [ a lv2:OutputPort , atom:AtomPort ; atom:bufferType atom:Sequence ; lv2:index 41 ; lv2:symbol "notify" ; lv2:name "Notify" ; rsz:minimumSize 73000; ], [ a atom:AtomPort , lv2:InputPort ; atom:bufferType atom:Sequence ; lv2:designation lv2:control ; lv2:index 42 ; lv2:symbol "control" ; lv2:name "Control" ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 43; lv2:symbol "midsidemode"; lv2:name "Mid Side Mode"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ]. eq10q-2.2/gate_stereo.ttl0000644000175000001440000001153413023240632014714 0ustar sapistausers@prefix lv2: . @prefix foaf: . @prefix doap: . @prefix guiext: . @prefix units: . @prefix pprop: . a foaf:Person ; foaf:name "Pere Ràfols Soler" ; foaf:mbox ; foaf:homepage . a doap:Project ; doap:maintainer ; doap:name "EQ10Q plugins" . ##LV2 GUI extension a guiext:GtkUI; guiext:binary ; lv2:optionalFeature guiext:noUserResize. ##LV2 plugin binary a lv2:Plugin, lv2:GatePlugin, doap:Project; lv2:binary ; doap:name "GT10QS"; doap:license ; lv2:optionalFeature lv2:hardRTCapable; lv2:project ; guiext:ui ; lv2:port [ a lv2:AudioPort, lv2:OutputPort; lv2:index 0; lv2:symbol "output"; lv2:name "Output"; ], [ a lv2:AudioPort, lv2:InputPort; lv2:index 1; lv2:symbol "input"; lv2:name "Input"; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 2; lv2:symbol "keylisten"; lv2:name "Key Listen"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 3; lv2:symbol "threshold"; lv2:name "Threshold (dB)"; lv2:minimum -46; lv2:maximum 4; lv2:default -10; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 4; lv2:symbol "attack"; lv2:name "Attack (ms)"; lv2:minimum 0.01; lv2:maximum 500; lv2:default 5; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 5; lv2:symbol "hold"; lv2:name "Hold (ms)"; lv2:minimum 0.01; lv2:maximum 3000; lv2:default 100; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 6; lv2:symbol "decay"; lv2:name "Decay (ms)"; lv2:minimum 5; lv2:maximum 4000; lv2:default 250; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 7; lv2:symbol "compratio"; lv2:name "Ratio (dB)"; lv2:minimum 1; lv2:maximum 100; lv2:default 100; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 8; lv2:symbol "hpf"; lv2:name "HPF Key Filter (Hz)"; lv2:minimum 20; lv2:maximum 20000; lv2:default 20; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 9; lv2:symbol "lpf"; lv2:name "LPF Key Filter (Hz)"; lv2:minimum 20; lv2:maximum 20000; lv2:default 20000; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 10; lv2:symbol "ingain"; lv2:name "Gain (dB)"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 11; lv2:symbol "out_vu_ctl"; lv2:name "Out VU CTL"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 12; lv2:symbol "gateled"; lv2:name "Gain Reduction"; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 13; lv2:symbol "knee"; lv2:name "Knee (dB)"; lv2:minimum 0; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 14; lv2:symbol "drywet"; lv2:name "Dry/Wet"; lv2:minimum 0; lv2:maximum 1; lv2:default 1; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 15; lv2:symbol "gaterange"; lv2:name "Range (dB)"; lv2:minimum -90; lv2:maximum -1; lv2:default -90; units:unit units:db; ], [ a lv2:AudioPort, lv2:OutputPort; lv2:index 16; lv2:symbol "outputR"; lv2:name "OutputR"; ], [ a lv2:AudioPort, lv2:InputPort; lv2:index 17; lv2:symbol "inputR"; lv2:name "InputR"; ]. eq10q-2.2/eq10qm.ttl0000644000175000001440000003340613023240632013521 0ustar sapistausers@prefix lv2: . @prefix foaf: . @prefix doap: . @prefix guiext: . @prefix atom: . @prefix urid: . @prefix rsz: . @prefix units: . @prefix pprop: . a foaf:Person ; foaf:name "Pere Ràfols Soler" ; foaf:mbox ; foaf:homepage . a doap:Project ; doap:maintainer ; doap:name "EQ10Q plugins" . ##LV2 GUI extension a guiext:GtkUI; guiext:binary ; lv2:requiredFeature urid:map; lv2:optionalFeature guiext:noUserResize. ##LV2 plugin binary a lv2:Plugin, lv2:EQPlugin, doap:Project; lv2:binary ; doap:name "EQ10Q Mono"; doap:license ; lv2:requiredFeature urid:map; lv2:optionalFeature lv2:hardRTCapable; lv2:project ; guiext:ui ; lv2:port [ a lv2:ControlPort, lv2:InputPort; lv2:index 0; lv2:symbol "bypass"; lv2:name "Bypass"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 1; lv2:symbol "input_gain"; lv2:name "Input Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 2; lv2:symbol "output_gain"; lv2:name "Output Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:AudioPort, lv2:InputPort; lv2:index 3; lv2:symbol "input"; lv2:name "Input"; ], [ a lv2:AudioPort, lv2:OutputPort; lv2:index 4; lv2:symbol "output"; lv2:name "Output"; ], ##############GAIN PORTS######################### [ a lv2:ControlPort, lv2:InputPort; lv2:index 5; lv2:symbol "filter1_gain"; lv2:name "Filter 1 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 6; lv2:symbol "filter2_gain"; lv2:name "Filter 2 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 7; lv2:symbol "filter3_gain"; lv2:name "Filter 3 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 8; lv2:symbol "filter4_gain"; lv2:name "Filter 4 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 9; lv2:symbol "filter5_gain"; lv2:name "Filter 5 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 10; lv2:symbol "filter6_gain"; lv2:name "Filter 6 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 11; lv2:symbol "filter7_gain"; lv2:name "Filter 7 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 12; lv2:symbol "filter8_gain"; lv2:name "Filter 8 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 13; lv2:symbol "filter9_gain"; lv2:name "Filter 9 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 14; lv2:symbol "filter10_gain"; lv2:name "Filter 10 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], ###########FREQ PORTS######################## [ a lv2:ControlPort, lv2:InputPort; lv2:index 15; lv2:symbol "filter1_freq"; lv2:name "Filter 1 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 30; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 16; lv2:symbol "filter2_freq"; lv2:name "Filter 2 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 60; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 17; lv2:symbol "filter3_freq"; lv2:name "Filter 3 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 120; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 18; lv2:symbol "filter4_freq"; lv2:name "Filter 4 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 240; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 19; lv2:symbol "filter5_freq"; lv2:name "Filter 5 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 480; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 20; lv2:symbol "filter6_freq"; lv2:name "Filter 6 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 960; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 21; lv2:symbol "filter7_freq"; lv2:name "Filter 7 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 1920; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 22; lv2:symbol "filter8_freq"; lv2:name "Filter 8 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 3840; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 23; lv2:symbol "filter9_freq"; lv2:name "Filter 9 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 7680; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 24; lv2:symbol "filter10_freq"; lv2:name "Filter 10 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 15360; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], ################## Q PORTS ##################### [ a lv2:ControlPort, lv2:InputPort; lv2:index 25; lv2:symbol "filter1_q"; lv2:name "Filter 1 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 0.7; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 26; lv2:symbol "filter2_q"; lv2:name "Filter 2 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 0.7; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 27; lv2:symbol "filter3_q"; lv2:name "Filter 3 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 28; lv2:symbol "filter4_q"; lv2:name "Filter 4 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 29; lv2:symbol "filter5_q"; lv2:name "Filter 5 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 30; lv2:symbol "filter6_q"; lv2:name "Filter 6 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 31; lv2:symbol "filter7_q"; lv2:name "Filter 7 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 32; lv2:symbol "filter8_q"; lv2:name "Filter 8 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 33; lv2:symbol "filter9_q"; lv2:name "Filter 9 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 0.7; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 34; lv2:symbol "filter10_q"; lv2:name "Filter 10 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 0.7; ], ######### TYPE PORTS #################### [ a lv2:ControlPort, lv2:InputPort; lv2:index 35; lv2:symbol "filter1_type"; lv2:name "Filter 1 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 6; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 36; lv2:symbol "filter2_type"; lv2:name "Filter 2 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 9; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 37; lv2:symbol "filter3_type"; lv2:name "Filter 3 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 11; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 38; lv2:symbol "filter4_type"; lv2:name "Filter 4 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 11; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 39; lv2:symbol "filter5_type"; lv2:name "Filter 5 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 11; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 40; lv2:symbol "filter6_type"; lv2:name "Filter 6 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 11; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 41; lv2:symbol "filter7_type"; lv2:name "Filter 7 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 11; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 42; lv2:symbol "filter8_type"; lv2:name "Filter 8 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 11; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 43; lv2:symbol "filter9_type"; lv2:name "Filter 9 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 10; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 44; lv2:symbol "filter10_type"; lv2:name "Filter 10 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 2; lv2:portProperty lv2:integer; ], ################# ENABLE PORTS ################### [ a lv2:ControlPort, lv2:InputPort; lv2:index 45; lv2:symbol "filter1_enable"; lv2:name "Filter 1 Enable"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 46; lv2:symbol "filter2_enable"; lv2:name "Filter 2 Enable"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 47; lv2:symbol "filter3_enable"; lv2:name "Filter 3 Enable"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 48; lv2:symbol "filter4_enable"; lv2:name "Filter 4 Enable"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 49; lv2:symbol "filter5_enable"; lv2:name "Filter 5 Enable"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 50; lv2:symbol "filter6_enable"; lv2:name "Filter 6 Enable"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 51; lv2:symbol "filter7_enable"; lv2:name "Filter 7 Enable"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 52; lv2:symbol "filter8_enable"; lv2:name "Filter 8 Enable"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 53; lv2:symbol "filter9_enable"; lv2:name "Filter 9 Enable"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 54; lv2:symbol "filter10_enable"; lv2:name "Filter 10 Enable"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], ############## VU PORTS ############################ [ a lv2:ControlPort, lv2:OutputPort; lv2:index 55; lv2:symbol "in_vu_ctl"; lv2:name "In Vu CTL"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 56; lv2:symbol "out_vu_ctl"; lv2:name "Out VU CTL"; ], [ a lv2:OutputPort , atom:AtomPort ; atom:bufferType atom:Sequence ; lv2:index 57 ; lv2:symbol "notify" ; lv2:name "Notify" ; rsz:minimumSize 73000; ], [ a atom:AtomPort , lv2:InputPort ; atom:bufferType atom:Sequence ; lv2:designation lv2:control ; lv2:index 58 ; lv2:symbol "control" ; lv2:name "Control" ]. eq10q-2.2/eq10qs.ttl0000644000175000001440000003471413023240632013532 0ustar sapistausers@prefix lv2: . @prefix foaf: . @prefix doap: . @prefix guiext: . @prefix atom: . @prefix urid: . @prefix rsz: . @prefix units: . @prefix pprop: . a foaf:Person ; foaf:name "Pere Ràfols Soler" ; foaf:mbox ; foaf:homepage . a doap:Project ; doap:maintainer ; doap:name "EQ10Q plugins" . ##LV2 GUI extension a guiext:GtkUI; guiext:binary ; lv2:requiredFeature urid:map; lv2:optionalFeature guiext:noUserResize. ##LV2 plugin binary a lv2:Plugin, lv2:EQPlugin, doap:Project; lv2:binary ; doap:name "EQ10Q Stereo"; doap:license ; lv2:requiredFeature urid:map; lv2:optionalFeature lv2:hardRTCapable; lv2:project ; guiext:ui ; lv2:port [ a lv2:ControlPort, lv2:InputPort; lv2:index 0; lv2:symbol "bypass"; lv2:name "Bypass"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 1; lv2:symbol "input_gain"; lv2:name "Input Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 2; lv2:symbol "output_gain"; lv2:name "Output Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:AudioPort, lv2:InputPort; lv2:index 3; lv2:symbol "input1"; lv2:name "Input1"; ], [ a lv2:AudioPort, lv2:InputPort; lv2:index 4; lv2:symbol "input2"; lv2:name "Input2"; ], [ a lv2:AudioPort, lv2:OutputPort; lv2:index 5; lv2:symbol "output1"; lv2:name "Output1"; ], [ a lv2:AudioPort, lv2:OutputPort; lv2:index 6; lv2:symbol "output2"; lv2:name "Output2"; ], ##############GAIN PORTS######################### [ a lv2:ControlPort, lv2:InputPort; lv2:index 7; lv2:symbol "filter1_gain"; lv2:name "Filter 1 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 8; lv2:symbol "filter2_gain"; lv2:name "Filter 2 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 9; lv2:symbol "filter3_gain"; lv2:name "Filter 3 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 10; lv2:symbol "filter4_gain"; lv2:name "Filter 4 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 11; lv2:symbol "filter5_gain"; lv2:name "Filter 5 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 12; lv2:symbol "filter6_gain"; lv2:name "Filter 6 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 13; lv2:symbol "filter7_gain"; lv2:name "Filter 7 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 14; lv2:symbol "filter8_gain"; lv2:name "Filter 8 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 15; lv2:symbol "filter9_gain"; lv2:name "Filter 9 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 16; lv2:symbol "filter10_gain"; lv2:name "Filter 10 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; units:unit units:db; ], ###########FREQ PORTS######################## [ a lv2:ControlPort, lv2:InputPort; lv2:index 17; lv2:symbol "filter1_freq"; lv2:name "Filter 1 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 30; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 18; lv2:symbol "filter2_freq"; lv2:name "Filter 2 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 60; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 19; lv2:symbol "filter3_freq"; lv2:name "Filter 3 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 120; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 20; lv2:symbol "filter4_freq"; lv2:name "Filter 4 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 240; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 21; lv2:symbol "filter5_freq"; lv2:name "Filter 5 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 480; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 22; lv2:symbol "filter6_freq"; lv2:name "Filter 6 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 960; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 23; lv2:symbol "filter7_freq"; lv2:name "Filter 7 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 1920; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 24; lv2:symbol "filter8_freq"; lv2:name "Filter 8 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 3840; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 25; lv2:symbol "filter9_freq"; lv2:name "Filter 9 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 7680; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 26; lv2:symbol "filter10_freq"; lv2:name "Filter 10 Freq"; lv2:minimum 20; lv2:maximum 20000; lv2:default 15360; units:unit units:hz; lv2:portProperty pprop:logarithmic; ], ################## Q PORTS ##################### [ a lv2:ControlPort, lv2:InputPort; lv2:index 27; lv2:symbol "filter1_q"; lv2:name "Filter 1 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 0.7; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 28; lv2:symbol "filter2_q"; lv2:name "Filter 2 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 0.7; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 29; lv2:symbol "filter3_q"; lv2:name "Filter 3 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 30; lv2:symbol "filter4_q"; lv2:name "Filter 4 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 31; lv2:symbol "filter5_q"; lv2:name "Filter 5 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 32; lv2:symbol "filter6_q"; lv2:name "Filter 6 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 33; lv2:symbol "filter7_q"; lv2:name "Filter 7 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 34; lv2:symbol "filter8_q"; lv2:name "Filter 8 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 35; lv2:symbol "filter9_q"; lv2:name "Filter 9 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 0.7; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 36; lv2:symbol "filter10_q"; lv2:name "Filter 10 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 0.7; ], ######### TYPE PORTS #################### [ a lv2:ControlPort, lv2:InputPort; lv2:index 37; lv2:symbol "filter1_type"; lv2:name "Filter 1 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 6; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 38; lv2:symbol "filter2_type"; lv2:name "Filter 2 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 9; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 39; lv2:symbol "filter3_type"; lv2:name "Filter 3 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 11; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 40; lv2:symbol "filter4_type"; lv2:name "Filter 4 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 11; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 41; lv2:symbol "filter5_type"; lv2:name "Filter 5 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 11; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 42; lv2:symbol "filter6_type"; lv2:name "Filter 6 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 11; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 43; lv2:symbol "filter7_type"; lv2:name "Filter 7 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 11; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 44; lv2:symbol "filter8_type"; lv2:name "Filter 8 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 11; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 45; lv2:symbol "filter9_type"; lv2:name "Filter 9 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 10; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 46; lv2:symbol "filter10_type"; lv2:name "Filter 10 Type"; lv2:minimum 1; lv2:maximum 12; lv2:default 2; lv2:portProperty lv2:integer; ], ################# ENABLE PORTS ################### [ a lv2:ControlPort, lv2:InputPort; lv2:index 47; lv2:symbol "filter1_enable"; lv2:name "Filter 1 Enable"; lv2:minimum 0; lv2:maximum 5; lv2:default 0; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 48; lv2:symbol "filter2_enable"; lv2:name "Filter 2 Enable"; lv2:minimum 0; lv2:maximum 5; lv2:default 0; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 49; lv2:symbol "filter3_enable"; lv2:name "Filter 3 Enable"; lv2:minimum 0; lv2:maximum 5; lv2:default 0; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 50; lv2:symbol "filter4_enable"; lv2:name "Filter 4 Enable"; lv2:minimum 0; lv2:maximum 5; lv2:default 0; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 51; lv2:symbol "filter5_enable"; lv2:name "Filter 5 Enable"; lv2:minimum 0; lv2:maximum 5; lv2:default 0; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 52; lv2:symbol "filter6_enable"; lv2:name "Filter 6 Enable"; lv2:minimum 0; lv2:maximum 5; lv2:default 0; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 53; lv2:symbol "filter7_enable"; lv2:name "Filter 7 Enable"; lv2:minimum 0; lv2:maximum 5; lv2:default 0; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 54; lv2:symbol "filter8_enable"; lv2:name "Filter 8 Enable"; lv2:minimum 0; lv2:maximum 5; lv2:default 0; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 55; lv2:symbol "filter9_enable"; lv2:name "Filter 9 Enable"; lv2:minimum 0; lv2:maximum 5; lv2:default 0; lv2:portProperty lv2:integer; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 56; lv2:symbol "filter10_enable"; lv2:name "Filter 10 Enable"; lv2:minimum 0; lv2:maximum 5; lv2:default 0; lv2:portProperty lv2:integer; ], ############## VU PORTS ############################ [ a lv2:ControlPort, lv2:OutputPort; lv2:index 57; lv2:symbol "in_1_vu_ctl"; lv2:name "In 1 Vu CTL"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 58; lv2:symbol "in_2_vu_ctl"; lv2:name "In 2 Vu CTL"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 59; lv2:symbol "out_2_vu_ctl"; lv2:name "Out 1 VU CTL"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 60; lv2:symbol "out_2_vu_ctl"; lv2:name "Out 2 VU CTL"; ], [ a lv2:OutputPort , atom:AtomPort ; atom:bufferType atom:Sequence ; lv2:index 61 ; lv2:symbol "notify" ; lv2:name "Notify" ; rsz:minimumSize 73000; ], [ a atom:AtomPort , lv2:InputPort ; atom:bufferType atom:Sequence ; lv2:designation lv2:control ; lv2:index 62 ; lv2:symbol "control" ; lv2:name "Control" ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 63; lv2:symbol "midsidemode"; lv2:name "Mid Side Mode"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; lv2:portProperty lv2:toggled; ]. eq10q-2.2/gui/combopix/0000755000175000001440000000000013023240624014267 5ustar sapistauserseq10q-2.2/gui/widgets/0000755000175000001440000000000013023240626014117 5ustar sapistauserseq10q-2.2/gui/icons/0000755000175000001440000000000013023241217013561 5ustar sapistauserseq10q-2.2/gui/knobs/0000755000175000001440000000000013023240631013561 5ustar sapistauserseq10q-2.2/gui/0000755000175000001440000000000013023240631012445 5ustar sapistauserseq10q-2.2/dsp/0000755000175000001440000000000013023240632012450 5ustar sapistauserseq10q-2.2/0000755000175000001440000000000013023241177011667 5ustar sapistausers