@@ -12,6 +12,7 @@ libs: | |||
$(MAKE) -C dpf/dgl | |||
plugins: libs | |||
$(MAKE) all -C plugins/openav-rommy | |||
$(MAKE) all -C plugins/Parameters | |||
$(MAKE) all -C plugins/States | |||
@@ -26,6 +27,7 @@ dpf/utils/lv2_ttl_generator: | |||
clean: | |||
$(MAKE) clean -C dpf/dgl | |||
$(MAKE) clean -C dpf/utils/lv2-ttl-generator | |||
$(MAKE) clean -C plugins/openav-rommy | |||
$(MAKE) clean -C plugins/Parameters | |||
$(MAKE) clean -C plugins/States | |||
@@ -0,0 +1,7 @@ | |||
AVTK : | |||
These files are AVTK widgets. | |||
They're included in this repo for convinience. | |||
Details on www.openavproductions.com/avtk |
@@ -0,0 +1,349 @@ | |||
/* | |||
* Author: Harry van Haaren 2013 | |||
* harryhaaren@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., 51 Franklin Street, Fifth Floor, Boston, | |||
* MA 02110-1301, USA. | |||
* | |||
*/ | |||
#ifndef AVTK_DELAY_GRAPH_H | |||
#define AVTK_DELAY_GRAPH_H | |||
#include <FL/Fl_Widget.H> | |||
#include <FL/Fl_Slider.H> | |||
#include <FL/Fl_Menu_Item.H> | |||
#include <valarray> | |||
#include <string> | |||
namespace Avtk | |||
{ | |||
class Delaygraph : public Fl_Slider | |||
{ | |||
public: | |||
Delaygraph(int _x, int _y, int _w, int _h, const char *_label = 0): | |||
Fl_Slider(_x, _y, _w, _h, _label) | |||
{ | |||
x = _x; | |||
y = _y; | |||
w = _w; | |||
h = _h; | |||
label = _label; | |||
mouseClickedX = 0; | |||
mouseClickedY = 0; | |||
mouseClicked = false; | |||
active = true; | |||
highlight = false; | |||
volume = 0.5; | |||
waveshapeType = 0.f; | |||
feedback = 0.0; | |||
} | |||
/// holds the preset: used from callback() to write value | |||
float waveshapeType; | |||
void type(float t) {waveshapeType = t; redraw();} | |||
bool active; | |||
bool highlight; | |||
int x, y, w, h; | |||
const char* label; | |||
int mouseClickedX; | |||
int mouseClickedY; | |||
bool mouseClicked; | |||
bool mouseRightClicked; | |||
float feedback; | |||
float volume; | |||
void setFeedback(float f) | |||
{ | |||
feedback = f; | |||
redraw(); | |||
} | |||
void setVolume(float e) | |||
{ | |||
volume = e; | |||
redraw(); | |||
} | |||
float getVolume() | |||
{ | |||
return volume; | |||
} | |||
void setActive(bool a) | |||
{ | |||
active = a; | |||
redraw(); | |||
} | |||
bool getActive() | |||
{ | |||
return active; | |||
} | |||
void draw() | |||
{ | |||
if (damage() & FL_DAMAGE_ALL) | |||
{ | |||
cairo_t *cr = Fl::cairo_cc(); | |||
cairo_save( cr ); | |||
cairo_set_line_width(cr, 1.5); | |||
// fill background | |||
cairo_rectangle( cr, x, y, w, h); | |||
cairo_set_source_rgb( cr, 28 / 255.f, 28 / 255.f , 28 / 255.f ); | |||
cairo_fill_preserve( cr ); | |||
cairo_clip( cr ); | |||
// set up dashed lines, 1 px off, 1 px on | |||
double dashes[1]; | |||
dashes[0] = 2.0; | |||
cairo_set_dash ( cr, dashes, 1, 0.0); | |||
cairo_set_line_width( cr, 1.0); | |||
// loop over each 2nd line, drawing dots | |||
cairo_set_line_width(cr, 1.0); | |||
cairo_set_source_rgb(cr, 0.4,0.4,0.4); | |||
for ( int i = 0; i < 4; i++ ) | |||
{ | |||
cairo_move_to( cr, x + ((w / 4.f)*i), y ); | |||
cairo_line_to( cr, x + ((w / 4.f)*i), y + h ); | |||
} | |||
for ( int i = 0; i < 4; i++ ) | |||
{ | |||
cairo_move_to( cr, x , y + ((h / 4.f)*i) ); | |||
cairo_line_to( cr, x + w, y + ((h / 4.f)*i) ); | |||
} | |||
cairo_set_source_rgba( cr, 66 / 255.f, 66 / 255.f , 66 / 255.f , 0.5 ); | |||
cairo_stroke(cr); | |||
cairo_set_dash ( cr, dashes, 0, 0.0); | |||
// curved waveshape | |||
/* | |||
float distort = value(); | |||
cairo_move_to( cr, x , y + h ); | |||
cairo_curve_to( cr, x + w * distort, y+h, // control point 1 | |||
x + w - (w * distort), y, // control point 2 | |||
x + w, y ); // end of curve 1, start curve 2 | |||
cairo_line_to ( cr, x + w, y + h ); | |||
cairo_close_path(cr); | |||
cairo_set_source_rgba( cr, 0 / 255.f, 153 / 255.f , 255 / 255.f , 0.21 ); | |||
cairo_fill_preserve(cr); | |||
cairo_set_line_width(cr, 2.0); | |||
cairo_set_source_rgba( cr, 0 / 255.f, 153 / 255.f , 255 / 255.f , 1 ); | |||
cairo_stroke(cr); | |||
*/ | |||
float delay = 0; | |||
int delTimeQuantized = int(value() * 3.99f); | |||
switch( delTimeQuantized ) | |||
{ | |||
case 0: | |||
delay = 0.125; | |||
break; | |||
case 1: | |||
delay = 0.25; | |||
break; | |||
case 2: | |||
delay = 0.5; | |||
break; | |||
case 3: | |||
delay = 1; | |||
break; | |||
} | |||
// Actual audio bar | |||
cairo_move_to( cr, x + w/4, y + h - 2 ); | |||
cairo_line_to( cr, x + w/4, y + h - h * 0.75 ); | |||
cairo_set_line_width(cr, 18); | |||
cairo_set_line_cap( cr, CAIRO_LINE_CAP_ROUND ); | |||
cairo_set_source_rgba( cr, 0 / 255.f, 153 / 255.f , 255 / 255.f , 0.21 ); | |||
//cairo_set_source_rgba( cr, 0 / 255.f, 153 / 255.f , 255 / 255.f , 1 ); | |||
cairo_stroke(cr); | |||
// feedback pointer | |||
cairo_move_to( cr, x + w/4 + w/2*delay, y + h * 3.5 / 4 ); | |||
cairo_line_to( cr, x + w*3.5/4 , y + h * 3.5 / 4 ); | |||
cairo_line_to( cr, x + w*3.5/4 , y + h * 1.0 / 4 ); | |||
cairo_line_to( cr, x + w*3.5/4 - ((w/2.)*feedback), y + h * 1.0 / 4 ); | |||
cairo_set_source_rgba( cr, 255 / 255.f, 0 / 255.f , 0 / 255.f , 1 ); | |||
cairo_set_line_width(cr, 1.5); | |||
cairo_stroke( cr ); | |||
cairo_line_to( cr, x + w*3.5/4 - ((w/2)*feedback)-10, y + h * 1.0 / 4 ); | |||
cairo_line_to( cr, x + w*3.5/4 - ((w/2)*feedback)-2 , (y + h * 1.0 / 4)+8 ); | |||
cairo_line_to( cr, x + w*3.5/4 - ((w/2)*feedback)-2 , (y + h * 1.0 / 4)-8 ); | |||
cairo_close_path( cr ); | |||
cairo_fill( cr ); | |||
// changing delay bar | |||
cairo_move_to( cr, x + w/4 + w/2*delay, y + h - 2 ); | |||
cairo_line_to( cr, x + w/4 + w/2*delay, y + h*7/8 - (h*1.5/3.0 * volume) ); | |||
cairo_set_line_cap( cr, CAIRO_LINE_CAP_ROUND ); | |||
cairo_set_source_rgba( cr, 0 / 255.f, 153 / 255.f , 255 / 255.f , 0.21 ); | |||
cairo_fill_preserve(cr); | |||
cairo_set_line_width(cr, 18); | |||
cairo_set_source_rgba( cr, 0 / 255.f, 153 / 255.f , 255 / 255.f , 1 ); | |||
cairo_stroke(cr); | |||
// stroke outline | |||
cairo_rectangle(cr, x+1, y+1, w-2, h-2); | |||
cairo_set_source_rgba( cr, 126 / 255.f, 126 / 255.f , 126 / 255.f , 0.8 ); | |||
cairo_set_line_width(cr, 1.0); | |||
cairo_stroke( cr ); | |||
if ( !active ) | |||
{ | |||
// big grey X | |||
cairo_set_line_width(cr, 20.0); | |||
cairo_set_source_rgba(cr, 0.4,0.4,0.4, 0.7); | |||
cairo_move_to( cr, x + (3 * w / 4.f), y + ( h / 4.f ) ); | |||
cairo_line_to( cr, x + (w / 4.f), y + ( 3 *h / 4.f ) ); | |||
cairo_move_to( cr, x + (w / 4.f), y + ( h / 4.f ) ); | |||
cairo_line_to( cr, x + (3 * w / 4.f), y + ( 3 *h / 4.f ) ); | |||
cairo_set_line_cap ( cr, CAIRO_LINE_CAP_BUTT); | |||
cairo_stroke( cr ); | |||
} | |||
cairo_restore( cr ); | |||
} | |||
} | |||
void resize(int X, int Y, int W, int H) | |||
{ | |||
Fl_Widget::resize(X,Y,W,H); | |||
x = X; | |||
y = Y; | |||
w = W; | |||
h = H; | |||
redraw(); | |||
} | |||
int handle(int event) | |||
{ | |||
switch(event) | |||
{ | |||
case FL_PUSH: | |||
highlight = 0; | |||
mouseRightClicked = false; | |||
mouseClickedX = Fl::event_x(); | |||
mouseClickedY = Fl::event_y(); | |||
if ( Fl::event_button() == FL_RIGHT_MOUSE ) | |||
{ | |||
active = !active; | |||
redraw(); | |||
mouseRightClicked = true; | |||
do_callback(); | |||
} | |||
return 1; | |||
case FL_DRAG: | |||
{ | |||
if ( Fl::event_state(FL_BUTTON1) ) | |||
{ | |||
if ( mouseClicked == false ) // catch the "click" event | |||
{ | |||
mouseClickedX = Fl::event_x(); | |||
mouseClickedY = Fl::event_y(); | |||
mouseClicked = true; | |||
} | |||
float deltaX = mouseClickedX - Fl::event_x(); | |||
float deltaY = mouseClickedY - Fl::event_y(); | |||
float valX = value() ; | |||
valX -= deltaX / 100.f; | |||
float valY = volume; | |||
valY += deltaY / 100.f; | |||
if ( valX > 1.0 ) valX = 1.0; | |||
if ( valX < 0.0 ) valX = 0.0; | |||
if ( valY > 1.0 ) valY = 1.0; | |||
if ( valY < 0.0 ) valY = 0.0; | |||
//handle_drag( value + deltaY ); | |||
set_value( valX ); | |||
volume = valY; | |||
mouseClickedX = Fl::event_x(); | |||
mouseClickedY = Fl::event_y(); | |||
redraw(); | |||
do_callback(); | |||
} | |||
} | |||
return 1; | |||
case FL_RELEASE: | |||
mouseRightClicked = false; | |||
if (highlight) { | |||
highlight = 0; | |||
redraw(); | |||
do_callback(); | |||
} | |||
mouseClicked = false; | |||
return 1; | |||
case FL_SHORTCUT: | |||
if ( test_shortcut() ) | |||
{ | |||
do_callback(); | |||
return 1; | |||
} | |||
return 0; | |||
default: | |||
return Fl_Widget::handle(event); | |||
} | |||
return 0; | |||
} | |||
private: | |||
}; | |||
} // Avtk | |||
#endif // AVTK_DELAY_GRAPH_H |
@@ -0,0 +1,183 @@ | |||
/* | |||
* Author: Harry van Haaren 2013 | |||
* harryhaaren@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., 51 Franklin Street, Fifth Floor, Boston, | |||
* MA 02110-1301, USA. | |||
* | |||
*/ | |||
#ifndef AVTK_DIAL_H | |||
#define AVTK_DIAL_H | |||
#include <FL/Fl_Dial.H> | |||
#include <FL/Fl_Slider.H> | |||
namespace Avtk | |||
{ | |||
class Dial : public Fl_Slider | |||
{ | |||
public: | |||
Dial(int _x, int _y, int _w, int _h, const char* _label=0): | |||
Fl_Slider(_x, _y, _w, _h, _label) | |||
{ | |||
x = _x; | |||
y = _y; | |||
w = _w; | |||
h = _h; | |||
// * 0.9 for line width to remain inside redraw area | |||
if ( w > h ) | |||
radius = (h / 2.f)*0.9; | |||
else | |||
radius = (w / 2.f)*0.9; | |||
lineWidth = 1.4 + radius / 12.f; | |||
mouseClickedY = 0; | |||
mouseClicked = false; | |||
highlight = false; | |||
label = _label; | |||
} | |||
bool highlight; | |||
int x, y, w, h; | |||
const char* label; | |||
bool drawLab; | |||
void drawLabel(bool b){drawLab = b; redraw();} | |||
float radius; | |||
float lineWidth; | |||
int mouseClickedY; | |||
bool mouseClicked; | |||
void draw() | |||
{ | |||
if (damage() & FL_DAMAGE_ALL) | |||
{ | |||
cairo_t *cr = Fl::cairo_cc(); | |||
cairo_save( cr ); | |||
// label behind value | |||
draw_label(); | |||
cairo_set_line_join(cr, CAIRO_LINE_JOIN_ROUND); | |||
cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND); | |||
cairo_set_line_width(cr, lineWidth-0.2); | |||
cairo_move_to( cr, x+w/2,y+h/2); | |||
cairo_line_to( cr, x+w/2,y+h/2); | |||
cairo_set_source_rgba(cr, 0.5, 0.5, 0.5, 0.4 ); | |||
// draw dash guide | |||
double dashes[2]; | |||
cairo_set_line_width(cr, 1.7); | |||
dashes[0] = 3.0; | |||
dashes[1] = 3.0; | |||
cairo_set_dash ( cr, dashes, 2, 0.0); | |||
cairo_stroke(cr); | |||
cairo_arc(cr, x+w/2,y+h/2, radius, 2.46, 0.75 ); | |||
//cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 0.4 ); | |||
cairo_stroke(cr); | |||
cairo_set_dash ( cr, dashes, 0, 0.0); | |||
float angle = 2.46 + ( 4.54 * value() ); | |||
cairo_set_line_width(cr, lineWidth); | |||
cairo_arc(cr, x+w/2,y+h/2, radius, 2.46, angle ); | |||
cairo_line_to(cr, x+w/2,y+h/2); | |||
cairo_set_source_rgba(cr, 1.0, 0.48, 0, 1.0); | |||
cairo_stroke(cr); | |||
cairo_restore( cr ); | |||
if ( drawLab ) | |||
{ | |||
//draw_label(); | |||
} | |||
} | |||
} | |||
void resize(int X, int Y, int W, int H) | |||
{ | |||
Fl_Slider::resize(X,Y,W,H); | |||
x = X; | |||
y = Y; | |||
w = W; | |||
h = H; | |||
redraw(); | |||
} | |||
int handle(int event) | |||
{ | |||
//cout << "handle event type = " << event << " value = " << value() << endl; | |||
//Fl_Slider::handle( event ); | |||
switch(event) { | |||
case FL_PUSH: | |||
highlight = 1; | |||
redraw(); | |||
return 1; | |||
case FL_DRAG: | |||
{ | |||
if ( Fl::event_state(FL_BUTTON1) ) | |||
{ | |||
if ( mouseClicked == false ) // catch the "click" event | |||
{ | |||
mouseClickedY = Fl::event_y(); | |||
mouseClicked = true; | |||
} | |||
float deltaY = mouseClickedY - Fl::event_y(); | |||
float val = value(); | |||
val += deltaY / 100.f; | |||
if ( val > 1.0 ) val = 1.0; | |||
if ( val < 0.0 ) val = 0.0; | |||
set_value( val ); | |||
mouseClickedY = Fl::event_y(); | |||
redraw(); | |||
do_callback(); // makes FLTK call "extra" code entered in FLUID | |||
} | |||
} | |||
return 1; | |||
case FL_RELEASE: | |||
if (highlight) { | |||
highlight = 0; | |||
redraw(); | |||
// never do anything after a callback, as the callback | |||
// may delete the widget! | |||
} | |||
mouseClicked = false; | |||
return 1; | |||
default: | |||
return Fl_Widget::handle(event); | |||
} | |||
} | |||
}; | |||
} // Avtk | |||
#endif // AVTK_DIAL_H |
@@ -0,0 +1,356 @@ | |||
/* | |||
* Author: Harry van Haaren 2013 | |||
* harryhaaren@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., 51 Franklin Street, Fifth Floor, Boston, | |||
* MA 02110-1301, USA. | |||
* | |||
*/ | |||
#ifndef AVTK_FILTERGRAPH_H | |||
#define AVTK_FILTERGRAPH_H | |||
#include <FL/Fl_Widget.H> | |||
#include <FL/Fl_Slider.H> | |||
#include <valarray> | |||
#include <string> | |||
namespace Avtk | |||
{ | |||
class Filtergraph : public Fl_Slider | |||
{ | |||
public: | |||
enum Type { | |||
FILTER_LOWPASS = 0, | |||
FILTER_HIGHPASS, | |||
FILTER_FLAT, | |||
}; | |||
Filtergraph(int _x, int _y, int _w, int _h, const char *_label = 0, Type _type = FILTER_LOWPASS): | |||
Fl_Slider(_x, _y, _w, _h, _label) | |||
{ | |||
graphType = _type; | |||
x = _x; | |||
y = _y; | |||
w = _w; | |||
h = _h; | |||
label = _label; | |||
mouseClickedX = 0; | |||
mouseClickedY = 0; | |||
mouseClicked = false; | |||
active = true; | |||
highlight = false; | |||
value( 0.5 ); | |||
freq = value(); | |||
gain = 0; | |||
bandwidth = 0; | |||
} | |||
void setGain(float g) {gain = g; redraw();} | |||
void setBandwidth(float b) {bandwidth = b; redraw();} | |||
float getGain() {return gain;} | |||
float getBandwidth() {return bandwidth;} | |||
void setType(Type t) | |||
{ | |||
graphType = t; | |||
redraw(); | |||
} | |||
void setActive(bool a) | |||
{ | |||
active = a; | |||
redraw(); | |||
} | |||
bool getActive() | |||
{ | |||
return active; | |||
} | |||
Type graphType; | |||
bool active; | |||
bool highlight; | |||
int x, y, w, h; | |||
const char* label; | |||
int mouseClickedX; | |||
int mouseClickedY; | |||
bool mouseClicked; | |||
float freq; | |||
float gain; | |||
float bandwidth; | |||
void draw() | |||
{ | |||
if (damage() & FL_DAMAGE_ALL) | |||
{ | |||
cairo_t *cr = Fl::cairo_cc(); | |||
cairo_save( cr ); | |||
cairo_set_line_width(cr, 1.5); | |||
// fill background | |||
cairo_rectangle( cr, x, y, w, h); | |||
cairo_set_source_rgb( cr, 28 / 255.f, 28 / 255.f , 28 / 255.f ); | |||
cairo_fill( cr ); | |||
// set up dashed lines, 1 px off, 1 px on | |||
double dashes[1]; | |||
dashes[0] = 2.0; | |||
cairo_set_dash ( cr, dashes, 1, 0.0); | |||
cairo_set_line_width( cr, 1.0); | |||
// loop over each 2nd line, drawing dots | |||
cairo_set_line_width(cr, 1.0); | |||
cairo_set_source_rgb(cr, 0.4,0.4,0.4); | |||
for ( int i = 0; i < 4; i++ ) | |||
{ | |||
cairo_move_to( cr, x + ((w / 4.f)*i), y ); | |||
cairo_line_to( cr, x + ((w / 4.f)*i), y + h ); | |||
} | |||
for ( int i = 0; i < 4; i++ ) | |||
{ | |||
cairo_move_to( cr, x , y + ((h / 4.f)*i) ); | |||
cairo_line_to( cr, x + w, y + ((h / 4.f)*i) ); | |||
} | |||
cairo_set_source_rgba( cr, 66 / 255.f, 66 / 255.f , 66 / 255.f , 0.5 ); | |||
cairo_stroke(cr); | |||
cairo_set_dash ( cr, dashes, 0, 0.0); | |||
// change filter type (low|high) based on value: | |||
// 0 to < 0.5 = lowpass | |||
// 0.5 == no change | |||
// 0.5 < 1.0 == highpass | |||
if ( value() < 0.45 ) | |||
{ | |||
graphType = FILTER_LOWPASS; | |||
freq = value()*2.f; | |||
} | |||
else if ( value() > 0.55 ) | |||
{ | |||
graphType = FILTER_HIGHPASS; | |||
freq = (value()-0.5)*2.f; | |||
} | |||
else | |||
{ | |||
graphType = FILTER_FLAT; | |||
} | |||
switch( graphType ) | |||
{ | |||
case FILTER_LOWPASS : drawLowpass(cr); break; | |||
case FILTER_HIGHPASS: drawHighpass(cr); break; | |||
case FILTER_FLAT : drawFlat(cr); break; | |||
default: | |||
cout << "Filtergraph: unknown filter type selected!" << endl; | |||
} | |||
// stroke outline | |||
cairo_rectangle(cr, x, y, w, h); | |||
cairo_set_source_rgba( cr, 126 / 255.f, 126 / 255.f , 126 / 255.f , 0.8 ); | |||
cairo_set_line_width(cr, 1.9); | |||
cairo_stroke( cr ); | |||
if ( !active ) | |||
{ | |||
// big grey X | |||
cairo_set_line_width(cr, 20.0); | |||
cairo_set_source_rgba(cr, 0.4,0.4,0.4, 0.7); | |||
cairo_move_to( cr, x + (3 * w / 4.f), y + ( h / 4.f ) ); | |||
cairo_line_to( cr, x + (w / 4.f), y + ( 3 *h / 4.f ) ); | |||
cairo_move_to( cr, x + (w / 4.f), y + ( h / 4.f ) ); | |||
cairo_line_to( cr, x + (3 * w / 4.f), y + ( 3 *h / 4.f ) ); | |||
cairo_set_line_cap ( cr, CAIRO_LINE_CAP_BUTT); | |||
cairo_stroke( cr ); | |||
} | |||
cairo_restore( cr ); | |||
} | |||
} | |||
void resize(int X, int Y, int W, int H) | |||
{ | |||
Fl_Widget::resize(X,Y,W,H); | |||
x = X; | |||
y = Y; | |||
w = W; | |||
h = H; | |||
redraw(); | |||
} | |||
int handle(int event) | |||
{ | |||
switch(event) | |||
{ | |||
case FL_PUSH: | |||
highlight = 0; | |||
if ( Fl::event_button() == FL_RIGHT_MOUSE ) | |||
{ | |||
active = !active; | |||
redraw(); | |||
do_callback(); | |||
} | |||
redraw(); | |||
return 1; | |||
case FL_DRAG: | |||
{ | |||
if ( Fl::event_state(FL_BUTTON1) ) | |||
{ | |||
if ( mouseClicked == false ) // catch the "click" event | |||
{ | |||
mouseClickedX = Fl::event_x(); | |||
mouseClickedY = Fl::event_y(); | |||
mouseClicked = true; | |||
} | |||
float deltaX = mouseClickedX - Fl::event_x(); | |||
float deltaY = mouseClickedY - Fl::event_y(); | |||
float valX = value(); | |||
valX -= deltaX / 100.f; | |||
float valY = gain; | |||
valY += deltaY / 100.f; | |||
if ( valX > 1.0 ) valX = 1.0; | |||
if ( valX < 0.0 ) valX = 0.0; | |||
if ( valY > 1.0 ) valY = 1.0; | |||
if ( valY < 0.0 ) valY = 0.0; | |||
//handle_drag( value + deltaY ); | |||
set_value( valX ); | |||
gain = valY; | |||
mouseClickedX = Fl::event_x(); | |||
mouseClickedY = Fl::event_y(); | |||
redraw(); | |||
do_callback(); | |||
} | |||
} | |||
return 1; | |||
case FL_RELEASE: | |||
if (highlight) { | |||
highlight = 0; | |||
redraw(); | |||
do_callback(); | |||
} | |||
mouseClicked = false; | |||
return 1; | |||
case FL_SHORTCUT: | |||
if ( test_shortcut() ) | |||
{ | |||
do_callback(); | |||
return 1; | |||
} | |||
return 0; | |||
default: | |||
return Fl_Widget::handle(event); | |||
} | |||
} | |||
private: | |||
void drawLowpass(cairo_t* cr) | |||
{ | |||
// draw the cutoff line: | |||
// move to bottom left, draw line to middle left | |||
cairo_move_to( cr, x , y + h ); | |||
cairo_line_to( cr, x , y + (h*0.47)); | |||
float cutoff = 0.1 + freq * 0.85; | |||
// Curve | |||
cairo_curve_to( cr, x + w * cutoff , y+(h*0.5) , // control point 1 | |||
x + w * cutoff , y+(h * 0.3), // control point 2 | |||
x + w * cutoff + 5, y+ h ); // end of curve 1 | |||
cairo_close_path(cr); | |||
cairo_set_source_rgba( cr, 0 / 255.f, 153 / 255.f , 255 / 255.f , 0.21 ); | |||
cairo_fill_preserve(cr); | |||
cairo_set_source_rgba( cr, 0 / 255.f, 153 / 255.f , 255 / 255.f , 1 ); | |||
cairo_set_line_width(cr, 1.5); | |||
cairo_set_line_join( cr, CAIRO_LINE_JOIN_ROUND); | |||
cairo_set_line_cap ( cr, CAIRO_LINE_CAP_ROUND); | |||
cairo_stroke( cr ); | |||
} | |||
void drawHighpass(cairo_t* cr) | |||
{ | |||
// draw the cutoff line: | |||
float cutoff = 0.95 - (freq*0.8); | |||
// move to bottom right | |||
cairo_move_to( cr, x + w, y + h ); | |||
cairo_line_to( cr, x + w, y + (h*0.47)); | |||
// Curve | |||
cairo_curve_to( cr, x + w - (w*cutoff) , y+(h*0.5) , // control point 1 | |||
x + w - (w*cutoff) , y+(h * 0.3), // control point 2 | |||
x + w - (w*cutoff) - 5, y+ h ); // end of curve 1 | |||
cairo_close_path(cr); | |||
// stroke | |||
cairo_set_source_rgba( cr, 0 / 255.f, 153 / 255.f , 255 / 255.f , 0.21 ); | |||
cairo_fill_preserve(cr); | |||
cairo_set_source_rgba( cr, 0 / 255.f, 153 / 255.f , 255 / 255.f , 1 ); | |||
cairo_set_line_width(cr, 1.5); | |||
cairo_set_line_join( cr, CAIRO_LINE_JOIN_ROUND); | |||
cairo_set_line_cap ( cr, CAIRO_LINE_CAP_ROUND); | |||
cairo_stroke( cr ); | |||
} | |||
void drawFlat(cairo_t* cr) | |||
{ | |||
// move to bottom right | |||
cairo_move_to( cr, x + w, y + h ); | |||
cairo_line_to( cr, x + w, y + (h*0.47)); | |||
cairo_line_to( cr, x , y + (h*0.47)); | |||
cairo_line_to( cr, x , y + h ); | |||
cairo_close_path(cr); | |||
// stroke | |||
cairo_set_source_rgba( cr, 0 / 255.f, 153 / 255.f , 255 / 255.f , 0.21 ); | |||
cairo_fill_preserve(cr); | |||
cairo_set_source_rgba( cr, 0 / 255.f, 153 / 255.f , 255 / 255.f , 1 ); | |||
cairo_set_line_width(cr, 1.5); | |||
cairo_set_line_join( cr, CAIRO_LINE_JOIN_ROUND); | |||
cairo_set_line_cap ( cr, CAIRO_LINE_CAP_ROUND); | |||
cairo_stroke( cr ); | |||
} | |||
}; | |||
} // Avtk | |||
#endif // AVTK_FILTERGRAPH_H |
@@ -0,0 +1,113 @@ | |||
/* | |||
* Author: Harry van Haaren 2013 | |||
* harryhaaren@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., 51 Franklin Street, Fifth Floor, Boston, | |||
* MA 02110-1301, USA. | |||
* | |||
*/ | |||
#ifndef AVTK_IMAGE_H | |||
#define AVTK_IMAGE_H | |||
#include <FL/Fl_Widget.H> | |||
#include <vector> | |||
#include <string> | |||
#include <iostream> | |||
#include <stdio.h> | |||
#include <FL/fl_draw.H> | |||
using namespace std; | |||
namespace Avtk | |||
{ | |||
class Image : public Fl_Widget | |||
{ | |||
public: | |||
Image(int _x, int _y, int _w, int _h, const char *_label=0 ): | |||
Fl_Widget(_x, _y, _w, _h, _label) | |||
{ | |||
x = _x; | |||
y = _y; | |||
w = _w; | |||
h = _h; | |||
label = _label; | |||
bits = -1; | |||
imageDataPtr = 0; | |||
} | |||
void setPixbuf(const unsigned char* data, int b ) | |||
{ | |||
bits = b; | |||
imageDataPtr = data; | |||
} | |||
int x, y, w, h; | |||
const char* label; | |||
int bits; | |||
const unsigned char* imageDataPtr; | |||
void draw() | |||
{ | |||
if ( damage() & FL_DAMAGE_ALL && imageDataPtr != 0 ) | |||
{ | |||
fl_draw_image((const uchar*)imageDataPtr, x, y, w, h, bits, w*bits); | |||
} | |||
} | |||
void resize(int X, int Y, int W, int H) | |||
{ | |||
Fl_Widget::resize(X,Y,W,H); | |||
x = X; | |||
y = Y; | |||
w = W; | |||
h = H; | |||
redraw(); | |||
} | |||
int handle(int event) | |||
{ | |||
switch(event) | |||
{ | |||
case FL_PUSH: | |||
do_callback(); | |||
return 1; | |||
case FL_DRAG: | |||
return 1; | |||
case FL_RELEASE: | |||
return 1; | |||
case FL_SHORTCUT: | |||
if ( test_shortcut() ) | |||
{ | |||
do_callback(); | |||
return 1; | |||
} | |||
return 0; | |||
default: | |||
return Fl_Widget::handle(event); | |||
} | |||
} | |||
}; | |||
} // Avtk | |||
#endif | |||
@@ -0,0 +1,253 @@ | |||
/* | |||
* Author: Harry van Haaren 2013 | |||
* harryhaaren@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., 51 Franklin Street, Fifth Floor, Boston, | |||
* MA 02110-1301, USA. | |||
* | |||
*/ | |||
#ifndef AVTK_MASHER_H | |||
#define AVTK_MASHER_H | |||
#include <FL/Fl_Slider.H> | |||
namespace Avtk | |||
{ | |||
class Masher : public Fl_Slider | |||
{ | |||
public: | |||
Masher(int _x, int _y, int _w, int _h, const char *_label =0): | |||
Fl_Slider(_x, _y, _w, _h, _label) | |||
{ | |||
x = _x; | |||
y = _y; | |||
w = _w; | |||
h = _h; | |||
_duration = 0.5; | |||
_volume = 1.0; | |||
_replace = 1.0; | |||
active = true; | |||
label = _label; | |||
highlight = false; | |||
mouseOver = false; | |||
} | |||
void volume(float v){ _volume = v; redraw(); } | |||
void replace(float r){ _replace = r; redraw(); } | |||
void duration(float d){ _duration = d; redraw(); } | |||
bool getActive(){return active;} | |||
void setActive(bool a){active = a; redraw();} | |||
float _volume; | |||
float _duration; | |||
float _replace; | |||
bool active; | |||
bool mouseOver; | |||
bool highlight; | |||
int x, y, w, h; | |||
const char* label; | |||
void draw() | |||
{ | |||
if (damage() & FL_DAMAGE_ALL) | |||
{ | |||
cairo_t *cr = Fl::cairo_cc(); | |||
cairo_save( cr ); | |||
// graph | |||
cairo_rectangle( cr, x, y, w, h ); | |||
cairo_set_source_rgb( cr,28 / 255.f, 28 / 255.f , 28 / 255.f ); | |||
cairo_fill(cr); | |||
// set up dashed lines, 1 px off, 1 px on | |||
double dashes[1]; | |||
dashes[0] = 2.0; | |||
cairo_set_dash ( cr, dashes, 1, 0.0); | |||
// loop over each 2nd line, drawing dots | |||
cairo_set_line_width(cr, 1.0); | |||
cairo_set_source_rgb(cr, 0.4,0.4,0.4); | |||
for ( int i = 0; i < 4; i++ ) | |||
{ | |||
cairo_move_to( cr, x + ((w / 4.f)*i), y ); | |||
cairo_line_to( cr, x + ((w / 4.f)*i), y + h ); | |||
} | |||
for ( int i = 0; i < 4; i++ ) | |||
{ | |||
cairo_move_to( cr, x , y + ((h / 4.f)*i) ); | |||
cairo_line_to( cr, x + w, y + ((h / 4.f)*i) ); | |||
} | |||
cairo_set_source_rgba( cr, 66 / 255.f, 66 / 255.f , 66 / 255.f , 0.5 ); | |||
cairo_stroke(cr); | |||
cairo_set_dash ( cr, dashes, 0, 0.0); | |||
// check that its a new "segment" to redraw | |||
int newAngle = ( _duration * 4.9f); | |||
int xc = (w) / 2.f; | |||
int yc = (h) / 2.f; | |||
float angle = 0.f; | |||
if ( newAngle == 0 ) | |||
angle = 0.06; | |||
else if ( newAngle == 1 ) | |||
angle = 0.125; | |||
else if ( newAngle <= 2 ) | |||
angle = 0.25; | |||
else if ( newAngle <= 3 ) | |||
angle = 0.5; | |||
else | |||
angle = 1; | |||
// replace: middle arc | |||
cairo_set_line_cap ( cr, CAIRO_LINE_CAP_ROUND ); | |||
cairo_arc( cr, x + xc, y + yc, xc * 6.5 / 14, -(3.1415/2), _replace * 6.28 - (3.1415/2) ); | |||
cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.8 ); | |||
cairo_set_line_width(cr, 9); | |||
cairo_stroke(cr); | |||
if ( newAngle == 0 ) | |||
cairo_set_source_rgba (cr, 1.0, 0.0 , 0.0, 1 ); | |||
else if ( newAngle == 1 ) | |||
cairo_set_source_rgba (cr, 1.0, 0.48, 0.0, 1 ); | |||
else if ( newAngle <= 2 ) | |||
cairo_set_source_rgba (cr, 0.0, 1.0 , 0.0, 0.8 ); | |||
else if ( newAngle <= 3 ) | |||
cairo_set_source_rgba (cr, 0.0, 0.48, 1.0, 1 ); | |||
else | |||
cairo_set_source_rgba (cr, 1.0, 0.0, 1.0, 0.7 ); | |||
// duration : outside arc | |||
cairo_arc( cr, x + xc, y + yc, xc * 9.5 / 14, -(3.1415/2), angle * 6.28 - (3.1415/2) ); | |||
cairo_set_line_width(cr, 11); | |||
cairo_stroke(cr); | |||
// volume: inside circle | |||
cairo_set_source_rgba(cr,0.3,0.3,0.3, 0.5); | |||
cairo_arc(cr, x + xc, y + yc, 25 * _volume, 0, 2 * 3.1415); | |||
cairo_set_line_width(cr, 4.2); | |||
cairo_fill_preserve(cr); | |||
cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.8 ); | |||
cairo_set_line_width(cr, 2); | |||
cairo_stroke(cr); | |||
// stroke rim | |||
cairo_rectangle(cr, x, y, w, h); | |||
//cairo_set_source_rgba( cr, 0 / 255.f, 153 / 255.f , 255 / 255.f , 1 ); | |||
cairo_set_source_rgba( cr, 126 / 255.f, 126 / 255.f , 126 / 255.f , 0.8 ); | |||
cairo_set_line_width(cr, 1.0); | |||
cairo_stroke( cr ); | |||
if ( !active ) | |||
{ | |||
// big grey X | |||
cairo_set_line_width(cr, 20.0); | |||
cairo_set_source_rgba(cr, 0.4,0.4,0.4, 0.7); | |||
cairo_move_to( cr, x + (3 * w / 4.f), y + ( h / 4.f ) ); | |||
cairo_line_to( cr, x + (w / 4.f), y + ( 3 *h / 4.f ) ); | |||
cairo_move_to( cr, x + (w / 4.f), y + ( h / 4.f ) ); | |||
cairo_line_to( cr, x + (3 * w / 4.f), y + ( 3 *h / 4.f ) ); | |||
cairo_set_line_cap ( cr, CAIRO_LINE_CAP_BUTT); | |||
cairo_stroke( cr ); | |||
} | |||
cairo_restore( cr ); | |||
draw_label(); | |||
} | |||
} | |||
void resize(int X, int Y, int W, int H) | |||
{ | |||
Fl_Widget::resize(X,Y,W,H); | |||
x = X; | |||
y = Y; | |||
w = W; | |||
h = H; | |||
redraw(); | |||
} | |||
int handle(int event) | |||
{ | |||
switch(event) { | |||
case FL_PUSH: | |||
highlight = 1; | |||
if ( Fl::event_button() == FL_RIGHT_MOUSE ) | |||
{ | |||
active = !active; | |||
redraw(); | |||
do_callback(); | |||
} | |||
return 1; | |||
case FL_DRAG: { | |||
int t = Fl::event_inside(this); | |||
if (t != highlight) { | |||
highlight = t; | |||
redraw(); | |||
} | |||
} | |||
return 1; | |||
case FL_ENTER: | |||
mouseOver = true; | |||
redraw(); | |||
return 1; | |||
case FL_LEAVE: | |||
mouseOver = false; | |||
redraw(); | |||
return 1; | |||
case FL_RELEASE: | |||
if (highlight) { | |||
highlight = 0; | |||
redraw(); | |||
} | |||
return 1; | |||
case FL_SHORTCUT: | |||
if ( test_shortcut() ) | |||
{ | |||
do_callback(); | |||
return 1; | |||
} | |||
return 0; | |||
default: | |||
return Fl_Widget::handle(event); | |||
} | |||
} | |||
}; | |||
} // Avtk | |||
#endif // AVTK_ADSR_H | |||
@@ -0,0 +1,284 @@ | |||
/* | |||
* Author: Harry van Haaren 2014 | |||
* harryhaaren@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., 51 Franklin Street, Fifth Floor, Boston, | |||
* MA 02110-1301, USA. | |||
* | |||
*/ | |||
#ifndef AVTK_PARAMETERIC_H | |||
#define AVTK_PARAMETERIC_H | |||
#include <FL/Fl_Widget.H> | |||
#include <FL/Fl_Slider.H> | |||
#include <FL/Fl_Menu_Item.H> | |||
#include <valarray> | |||
#include <string> | |||
namespace Avtk | |||
{ | |||
class Parameteric : public Fl_Slider | |||
{ | |||
public: | |||
Parameteric(int _x, int _y, int _w, int _h, const char *_label = 0): | |||
Fl_Slider(_x, _y, _w, _h, _label) | |||
{ | |||
x = _x; | |||
y = _y; | |||
w = _w; | |||
h = _h; | |||
label = _label; | |||
mouseClickedX = 0; | |||
mouseClickedY = 0; | |||
mouseClicked = false; | |||
active = true; | |||
highlight = false; | |||
gains[0] = 0.f; | |||
gains[1] = 0.f; | |||
gains[2] = 0.f; | |||
gains[3] = 0.f; | |||
gains[4] = 0.f; | |||
} | |||
bool active; | |||
bool highlight; | |||
int x, y, w, h; | |||
const char* label; | |||
int mouseClickedX; | |||
int mouseClickedY; | |||
bool mouseClicked; | |||
bool mouseRightClicked; | |||
float gains[5]; | |||
void setGain( int s, float g) | |||
{ | |||
gains[s] = g; | |||
redraw(); | |||
} | |||
float getVolume() | |||
{ | |||
return gains[0]; | |||
} | |||
void setActive(bool a) | |||
{ | |||
active = a; | |||
redraw(); | |||
} | |||
bool getActive() | |||
{ | |||
return active; | |||
} | |||
void draw() | |||
{ | |||
if (damage() & FL_DAMAGE_ALL) | |||
{ | |||
cairo_t *cr = Fl::cairo_cc(); | |||
cairo_save( cr ); | |||
cairo_set_line_width(cr, 1.5); | |||
// fill background | |||
cairo_rectangle( cr, x, y, w, h); | |||
cairo_set_source_rgb( cr, 28 / 255.f, 28 / 255.f , 28 / 255.f ); | |||
cairo_fill_preserve( cr ); | |||
cairo_clip( cr ); | |||
// set up dashed lines, 1 px off, 1 px on | |||
double dashes[1]; | |||
dashes[0] = 2.0; | |||
cairo_set_dash ( cr, dashes, 1, 0.0); | |||
cairo_set_line_width( cr, 1.0); | |||
// loop over each 2nd line, drawing dots | |||
cairo_set_line_width(cr, 1.0); | |||
cairo_set_source_rgb(cr, 0.4,0.4,0.4); | |||
for ( int i = 0; i < 4; i++ ) | |||
{ | |||
cairo_move_to( cr, x + ((w / 4.f)*i), y ); | |||
cairo_line_to( cr, x + ((w / 4.f)*i), y + h ); | |||
} | |||
for ( int i = 0; i < 4; i++ ) | |||
{ | |||
cairo_move_to( cr, x , y + ((h / 4.f)*i) ); | |||
cairo_line_to( cr, x + w, y + ((h / 4.f)*i) ); | |||
} | |||
cairo_set_source_rgba( cr, 66 / 255.f, 66 / 255.f , 66 / 255.f , 0.5 ); | |||
cairo_stroke(cr); | |||
cairo_set_dash ( cr, dashes, 0, 0.0); | |||
// draw frequency/amplitude rectangles | |||
for(int i = 0; i < 4; i ++) | |||
{ | |||
int startY = y + h/2; | |||
int heightY = h/4 * ( ( (1-gains[i+1])*2)-1 ); | |||
cairo_rectangle( cr, x + (w/4)*i, startY, w/4, heightY ); | |||
} | |||
cairo_set_line_cap( cr, CAIRO_LINE_CAP_ROUND ); | |||
cairo_set_source_rgba( cr, 0 / 255.f, 153 / 255.f , 255 / 255.f , 0.21 ); | |||
cairo_fill_preserve(cr); | |||
cairo_set_line_width(cr, 1.8); | |||
cairo_set_source_rgba( cr, 0 / 255.f, 153 / 255.f , 255 / 255.f , 1 ); | |||
cairo_stroke(cr); | |||
// draw "master gain line | |||
cairo_move_to( cr, x , y + h/2 + (h/4 *-(gains[0]*2-1)) ); | |||
cairo_line_to( cr, x+w, y + h/2 + (h/4 *-(gains[0]*2-1)) ); | |||
cairo_set_line_width(cr, 2.1); | |||
cairo_set_source_rgba( cr, 255 / 255.f, 0 / 255.f , 0 / 255.f , 1 ); | |||
cairo_stroke(cr); | |||
// stroke outline | |||
cairo_rectangle(cr, x+1, y+1, w-2, h-2); | |||
cairo_set_source_rgba( cr, 126 / 255.f, 126 / 255.f , 126 / 255.f , 0.8 ); | |||
cairo_set_line_width(cr, 1.0); | |||
cairo_stroke( cr ); | |||
if ( !active ) | |||
{ | |||
// big grey X | |||
cairo_set_line_width(cr, 20.0); | |||
cairo_set_source_rgba(cr, 0.4,0.4,0.4, 0.7); | |||
cairo_move_to( cr, x + (3 * w / 4.f), y + ( h / 4.f ) ); | |||
cairo_line_to( cr, x + (w / 4.f), y + ( 3 *h / 4.f ) ); | |||
cairo_move_to( cr, x + (w / 4.f), y + ( h / 4.f ) ); | |||
cairo_line_to( cr, x + (3 * w / 4.f), y + ( 3 *h / 4.f ) ); | |||
cairo_set_line_cap ( cr, CAIRO_LINE_CAP_BUTT); | |||
cairo_stroke( cr ); | |||
} | |||
cairo_restore( cr ); | |||
} | |||
} | |||
void resize(int X, int Y, int W, int H) | |||
{ | |||
Fl_Widget::resize(X,Y,W,H); | |||
x = X; | |||
y = Y; | |||
w = W; | |||
h = H; | |||
redraw(); | |||
} | |||
int handle(int event) | |||
{ | |||
switch(event) | |||
{ | |||
case FL_PUSH: | |||
highlight = 0; | |||
mouseRightClicked = false; | |||
mouseClickedX = Fl::event_x(); | |||
mouseClickedY = Fl::event_y(); | |||
if ( Fl::event_button() == FL_RIGHT_MOUSE ) | |||
{ | |||
active = !active; | |||
redraw(); | |||
mouseRightClicked = true; | |||
do_callback(); | |||
} | |||
return 1; | |||
case FL_DRAG: | |||
{ | |||
if ( Fl::event_state(FL_BUTTON1) ) | |||
{ | |||
if ( mouseClicked == false ) // catch the "click" event | |||
{ | |||
mouseClickedX = Fl::event_x(); | |||
mouseClickedY = Fl::event_y(); | |||
mouseClicked = true; | |||
} | |||
//float deltaX = mouseClickedX - Fl::event_x(); | |||
float deltaY = mouseClickedY - Fl::event_y(); | |||
//float valX = value() ; | |||
//valX -= deltaX / 100.f; | |||
float valY = gains[0]; | |||
valY += deltaY / 100.f; | |||
//if ( valX > 1.0 ) valX = 1.0; | |||
//if ( valX < 0.0 ) valX = 0.0; | |||
if ( valY > 1.0 ) valY = 1.0; | |||
if ( valY < 0.0 ) valY = 0.0; | |||
//handle_drag( value + deltaY ); | |||
//set_value( valX ); | |||
gains[0] = valY; | |||
mouseClickedX = Fl::event_x(); | |||
mouseClickedY = Fl::event_y(); | |||
redraw(); | |||
do_callback(); | |||
} | |||
} | |||
return 1; | |||
case FL_RELEASE: | |||
mouseRightClicked = false; | |||
if (highlight) { | |||
highlight = 0; | |||
redraw(); | |||
do_callback(); | |||
} | |||
mouseClicked = false; | |||
return 1; | |||
case FL_SHORTCUT: | |||
if ( test_shortcut() ) | |||
{ | |||
do_callback(); | |||
return 1; | |||
} | |||
return 0; | |||
default: | |||
return Fl_Widget::handle(event); | |||
} | |||
return 0; | |||
} | |||
private: | |||
}; | |||
} // Avtk | |||
#endif // AVTK_WAVESHAPER_H |
@@ -0,0 +1,221 @@ | |||
/* | |||
* Author: Harry van Haaren 2013 | |||
* harryhaaren@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., 51 Franklin Street, Fifth Floor, Boston, | |||
* MA 02110-1301, USA. | |||
* | |||
*/ | |||
#ifndef AVTK_REVERB_H | |||
#define AVTK_REVERB_H | |||
#include <FL/Fl_Slider.H> | |||
namespace Avtk | |||
{ | |||
class Reverb : public Fl_Slider | |||
{ | |||
public: | |||
Reverb(int _x, int _y, int _w, int _h, const char *_label =0): | |||
Fl_Slider(_x, _y, _w, _h, _label) | |||
{ | |||
x = _x; | |||
y = _y; | |||
w = _w; | |||
h = _h; | |||
amp = 0.5; | |||
s = 0.5; | |||
damp= 0.5; | |||
active = true; | |||
label = _label; | |||
highlight = false; | |||
mouseOver = false; | |||
} | |||
void size(float v) { s = v; redraw(); } | |||
void wet(float v) { amp = v; redraw(); } | |||
void damping(float v){damp = v; redraw();} | |||
bool getActive(){return active;} | |||
void setActive(bool a){active = a; redraw();} | |||
float s; | |||
float amp; | |||
float damp; | |||
bool active; | |||
bool mouseOver; | |||
bool highlight; | |||
int x, y, w, h; | |||
const char* label; | |||
void draw() | |||
{ | |||
if (damage() & FL_DAMAGE_ALL) | |||
{ | |||
cairo_t *cr = Fl::cairo_cc(); | |||
cairo_save( cr ); | |||
// graph | |||
cairo_rectangle( cr, x, y, w, h ); | |||
cairo_set_source_rgb( cr,28 / 255.f, 28 / 255.f , 28 / 255.f ); | |||
cairo_fill(cr); | |||
// set up dashed lines, 1 px off, 1 px on | |||
double dashes[1]; | |||
dashes[0] = 2.0; | |||
cairo_set_dash ( cr, dashes, 1, 0.0); | |||
// loop over each 2nd line, drawing dots | |||
cairo_set_line_width(cr, 1.0); | |||
cairo_set_source_rgb(cr, 0.4,0.4,0.4); | |||
for ( int i = 0; i < 4; i++ ) | |||
{ | |||
cairo_move_to( cr, x + ((w / 4.f)*i), y ); | |||
cairo_line_to( cr, x + ((w / 4.f)*i), y + h ); | |||
} | |||
for ( int i = 0; i < 4; i++ ) | |||
{ | |||
cairo_move_to( cr, x , y + ((h / 4.f)*i) ); | |||
cairo_line_to( cr, x + w, y + ((h / 4.f)*i) ); | |||
} | |||
cairo_set_source_rgba( cr, 66 / 255.f, 66 / 255.f , 66 / 255.f , 0.5 ); | |||
cairo_stroke(cr); | |||
cairo_set_dash ( cr, dashes, 0, 0.0); | |||
// draw "damping" control | |||
cairo_move_to( cr, x+w*0.1 , y + h*0.85 - (h*0.7*amp)); | |||
cairo_line_to( cr, x+w*0.1 + (w-20)*damp, y + h*0.85 - (h*0.7*amp)); | |||
cairo_set_source_rgba(cr, 1.0, 0.48, 0, 1); | |||
cairo_set_line_join( cr, CAIRO_LINE_JOIN_ROUND); | |||
cairo_set_line_cap ( cr, CAIRO_LINE_CAP_ROUND); | |||
cairo_set_line_width(cr, 1.9); | |||
cairo_stroke( cr ); | |||
// draw reverb triangle | |||
cairo_move_to( cr, x , y + h*0.99 ); | |||
cairo_line_to( cr, x + w*0.1, y + h*0.85 - (h*0.7*amp)); | |||
cairo_line_to( cr, x + w*0.3+w*0.7*s, y + (h*0.99)); | |||
// stroke | |||
cairo_set_source_rgba( cr, 0 / 255.f, 153 / 255.f , 255 / 255.f , 0.21 ); | |||
cairo_fill_preserve(cr); | |||
cairo_set_source_rgba( cr, 0 / 255.f, 153 / 255.f , 255 / 255.f , 1 ); | |||
cairo_set_line_width(cr, 1.5); | |||
cairo_stroke( cr ); | |||
// stroke rim | |||
cairo_rectangle(cr, x+1, y+1, w-2, h-2); | |||
//cairo_set_source_rgba( cr, 0 / 255.f, 153 / 255.f , 255 / 255.f , 1 ); | |||
cairo_set_source_rgba( cr, 126 / 255.f, 126 / 255.f , 126 / 255.f , 0.8 ); | |||
cairo_set_line_width(cr, 1.0); | |||
cairo_stroke( cr ); | |||
if ( !active ) | |||
{ | |||
// big grey X | |||
cairo_set_line_width(cr, 20.0); | |||
cairo_set_source_rgba(cr, 0.4,0.4,0.4, 0.7); | |||
cairo_move_to( cr, x + (3 * w / 4.f), y + ( h / 4.f ) ); | |||
cairo_line_to( cr, x + (w / 4.f), y + ( 3 *h / 4.f ) ); | |||
cairo_move_to( cr, x + (w / 4.f), y + ( h / 4.f ) ); | |||
cairo_line_to( cr, x + (3 * w / 4.f), y + ( 3 *h / 4.f ) ); | |||
cairo_set_line_cap ( cr, CAIRO_LINE_CAP_BUTT); | |||
cairo_stroke( cr ); | |||
} | |||
cairo_restore( cr ); | |||
draw_label(); | |||
} | |||
} | |||
void resize(int X, int Y, int W, int H) | |||
{ | |||
Fl_Widget::resize(X,Y,W,H); | |||
x = X; | |||
y = Y; | |||
w = W; | |||
h = H; | |||
redraw(); | |||
} | |||
int handle(int event) | |||
{ | |||
switch(event) { | |||
case FL_PUSH: | |||
highlight = 1; | |||
/* | |||
if ( Fl::event_button() == FL_RIGHT_MOUSE ) | |||
{ | |||
active = !active; | |||
redraw(); | |||
do_callback(); | |||
} | |||
*/ | |||
return 1; | |||
case FL_DRAG: { | |||
int t = Fl::event_inside(this); | |||
if (t != highlight) { | |||
highlight = t; | |||
redraw(); | |||
} | |||
} | |||
return 1; | |||
case FL_ENTER: | |||
mouseOver = true; | |||
redraw(); | |||
return 1; | |||
case FL_LEAVE: | |||
mouseOver = false; | |||
redraw(); | |||
return 1; | |||
case FL_RELEASE: | |||
if (highlight) { | |||
highlight = 0; | |||
redraw(); | |||
} | |||
return 1; | |||
case FL_SHORTCUT: | |||
if ( test_shortcut() ) | |||
{ | |||
do_callback(); | |||
return 1; | |||
} | |||
return 0; | |||
default: | |||
return Fl_Widget::handle(event); | |||
} | |||
} | |||
}; | |||
} // Avtk | |||
#endif // AVTK_ADSR_H | |||
@@ -0,0 +1,286 @@ | |||
/* | |||
* Author: Harry van Haaren 2013 | |||
* harryhaaren@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., 51 Franklin Street, Fifth Floor, Boston, | |||
* MA 02110-1301, USA. | |||
* | |||
*/ | |||
#ifndef AVTK_SIDECHAIN_GAIN_H | |||
#define AVTK_SIDECHAIN_GAIN_H | |||
#include <FL/Fl_Widget.H> | |||
#include <FL/Fl_Slider.H> | |||
#include <valarray> | |||
#include <string> | |||
namespace Avtk | |||
{ | |||
class SidechainGain : public Fl_Slider | |||
{ | |||
public: | |||
SidechainGain(int _x, int _y, int _w, int _h, const char *_label = 0): | |||
Fl_Slider(_x, _y, _w, _h, _label) | |||
{ | |||
x = _x; | |||
y = _y; | |||
w = _w; | |||
h = _h; | |||
label = _label; | |||
mouseClickedX = 0; | |||
mouseClickedY = 0; | |||
mouseClicked = false; | |||
active = true; | |||
highlight = false; | |||
_threshold = 1.0; | |||
_target = 1.f; | |||
_reduce = 1.f; | |||
_release = 0.5; | |||
_sidechainAmp = 0; | |||
} | |||
void threshold(float t) {_threshold = t; redraw();} | |||
void reduce (float r) {_reduce = r; redraw();} | |||
void release (float r) {_release = r; redraw();} | |||
/// sets the sidechain amplitude | |||
void sidechain(float s) {_sidechainAmp = s; redraw();} | |||
bool active; | |||
bool highlight; | |||
int x, y, w, h; | |||
const char* label; | |||
int mouseClickedX; | |||
int mouseClickedY; | |||
bool mouseClicked; | |||
bool mouseRightClicked; | |||
float _threshold; | |||
float _target; | |||
float _reduce; | |||
float _release; | |||
float _sidechainAmp; | |||
void set_active(bool a) | |||
{ | |||
active = a; | |||
redraw(); | |||
} | |||
void draw() | |||
{ | |||
if (damage() & FL_DAMAGE_ALL) | |||
{ | |||
cairo_t *cr = Fl::cairo_cc(); | |||
cairo_save( cr ); | |||
cairo_set_line_width(cr, 1.5); | |||
// fill background | |||
cairo_rectangle( cr, x, y, w, h); | |||
cairo_set_source_rgb( cr, 28 / 255.f, 28 / 255.f , 28 / 255.f ); | |||
cairo_fill_preserve( cr ); | |||
cairo_clip( cr ); | |||
// set up dashed lines, 1 px off, 1 px on | |||
double dashes[1]; | |||
dashes[0] = 2.0; | |||
cairo_set_dash ( cr, dashes, 1, 0.0); | |||
cairo_set_line_width( cr, 1.0); | |||
// loop over each 2nd line, drawing dots | |||
cairo_set_line_width(cr, 1.0); | |||
cairo_set_source_rgb(cr, 0.4,0.4,0.4); | |||
for ( int i = 0; i < 4; i++ ) | |||
{ | |||
cairo_move_to( cr, x + ((w / 4.f)*i), y ); | |||
cairo_line_to( cr, x + ((w / 4.f)*i), y + h ); | |||
} | |||
for ( int i = 0; i < 4; i++ ) | |||
{ | |||
cairo_move_to( cr, x , y + ((h / 4.f)*i) ); | |||
cairo_line_to( cr, x + w, y + ((h / 4.f)*i) ); | |||
} | |||
cairo_set_source_rgba( cr, 66 / 255.f, 66 / 255.f , 66 / 255.f , 0.5 ); | |||
cairo_stroke(cr); | |||
cairo_set_dash ( cr, dashes, 0, 0.0); | |||
// draw threshold / ducked line | |||
cairo_move_to( cr, x + w * 0.750 - (w * 0.5 * (1-_threshold)), y ); | |||
cairo_line_to( cr, x + w * 0.750 - (w * 0.5 * (1-_threshold)) + _sidechainAmp* _reduce*( w * 0.5 ), y + h / 2 ); | |||
cairo_line_to( cr, x + w * 0.750 - (w * 0.5 * (1-_threshold)), y + h ); | |||
cairo_line_to( cr, x + w , y + h ); | |||
cairo_line_to( cr, x + w , y ); | |||
cairo_close_path( cr ); | |||
cairo_set_source_rgba( cr, 0 / 255.f, 153 / 255.f , 255 / 255.f , 0.21 ); | |||
cairo_fill_preserve( cr ); | |||
cairo_set_source_rgba( cr, 0 / 255.f, 153 / 255.f , 255 / 255.f , 1 ); | |||
cairo_stroke( cr ); | |||
// _sidechainAmp => arrow | |||
cairo_move_to( cr, x + w * 0.00 * _sidechainAmp, y + h * 0.4 - (h*0.1*_sidechainAmp) ); | |||
cairo_line_to( cr, x + w * 0.65 * _sidechainAmp, y + h * 0.4 ); | |||
cairo_line_to( cr, x + w * 0.1 + w * 0.65 * _sidechainAmp, y + h * 0.5 ); | |||
cairo_line_to( cr, x + w * 0.65 * _sidechainAmp, y + h * 0.6 ); | |||
cairo_line_to( cr, x + w * 0.00 * _sidechainAmp, y + h * 0.6 + (h*0.1*_sidechainAmp) ); | |||
cairo_close_path( cr ); | |||
cairo_set_source_rgba( cr, 1.0, 0.48, 0.f , 0.21 ); | |||
cairo_fill_preserve( cr ); | |||
cairo_set_source_rgba( cr, 1.0, 0.48, 0.f , 1 ); | |||
cairo_stroke( cr ); | |||
// _release horizontal line | |||
cairo_move_to( cr, x , y + h * 0.25 + h/2 * _release ); | |||
cairo_line_to( cr, x + w, y + h * 0.25 + h/2 * _release ); | |||
cairo_set_source_rgba( cr, 1.0, 0.0, 0.f , 1 ); | |||
cairo_stroke( cr ); | |||
// stroke outline | |||
cairo_rectangle(cr, x+1, y+1, w-2, h-2); | |||
cairo_set_source_rgba( cr, 126 / 255.f, 126 / 255.f , 126 / 255.f , 0.8 ); | |||
cairo_set_line_width(cr, 1.0); | |||
cairo_stroke( cr ); | |||
if ( !active ) | |||
{ | |||
// big grey X | |||
cairo_set_line_width(cr, 20.0); | |||
cairo_set_source_rgba(cr, 0.4,0.4,0.4, 0.7); | |||
cairo_move_to( cr, x + (3 * w / 4.f), y + ( h / 4.f ) ); | |||
cairo_line_to( cr, x + (w / 4.f), y + ( 3 *h / 4.f ) ); | |||
cairo_move_to( cr, x + (w / 4.f), y + ( h / 4.f ) ); | |||
cairo_line_to( cr, x + (3 * w / 4.f), y + ( 3 *h / 4.f ) ); | |||
cairo_set_line_cap ( cr, CAIRO_LINE_CAP_BUTT); | |||
cairo_stroke( cr ); | |||
} | |||
cairo_restore( cr ); | |||
} | |||
} | |||
void resize(int X, int Y, int W, int H) | |||
{ | |||
Fl_Widget::resize(X,Y,W,H); | |||
x = X; | |||
y = Y; | |||
w = W; | |||
h = H; | |||
redraw(); | |||
} | |||
int handle(int event) | |||
{ | |||
/* | |||
switch(event) | |||
{ | |||
case FL_PUSH: | |||
highlight = 0; | |||
mouseRightClicked = false; | |||
if ( Fl::event_button() == FL_RIGHT_MOUSE ) | |||
{ | |||
active = !active; | |||
redraw(); | |||
mouseRightClicked = true; | |||
do_callback(); | |||
} | |||
return 1; | |||
case FL_DRAG: | |||
{ | |||
if ( Fl::event_state(FL_BUTTON1) ) | |||
{ | |||
if ( mouseClicked == false ) // catch the "click" event | |||
{ | |||
mouseClickedX = Fl::event_x(); | |||
mouseClickedY = Fl::event_y(); | |||
mouseClicked = true; | |||
} | |||
float deltaX = mouseClickedX - Fl::event_x(); | |||
float deltaY = mouseClickedY - Fl::event_y(); | |||
float valX = value(); | |||
valX -= deltaX / 100.f; | |||
float valY = makeupGain; | |||
valY += deltaY / 100.f; | |||
if ( valX > 1.0 ) valX = 1.0; | |||
if ( valX < 0.0 ) valX = 0.0; | |||
if ( valY > 1.0 ) valY = 1.0; | |||
if ( valY < 0.0 ) valY = 0.0; | |||
//handle_drag( value + deltaY ); | |||
set_value( valX ); | |||
makeupGain = valY; | |||
mouseClickedX = Fl::event_x(); | |||
mouseClickedY = Fl::event_y(); | |||
redraw(); | |||
do_callback(); | |||
} | |||
} | |||
return 1; | |||
case FL_RELEASE: | |||
mouseRightClicked = false; | |||
if (highlight) { | |||
highlight = 0; | |||
redraw(); | |||
do_callback(); | |||
} | |||
mouseClicked = false; | |||
return 1; | |||
case FL_SHORTCUT: | |||
if ( test_shortcut() ) | |||
{ | |||
do_callback(); | |||
return 1; | |||
} | |||
return 0; | |||
default: | |||
return Fl_Widget::handle(event); | |||
} | |||
*/ | |||
return 0; | |||
} | |||
private: | |||
}; | |||
} // Avtk | |||
#endif // AVTK_SIDECHAIN_GAIN_H |
@@ -0,0 +1,296 @@ | |||
/* | |||
* Author: Harry van Haaren 2013 | |||
* harryhaaren@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., 51 Franklin Street, Fifth Floor, Boston, | |||
* MA 02110-1301, USA. | |||
* | |||
*/ | |||
#ifndef AVTK_WAVESHAPER_H | |||
#define AVTK_WAVESHAPER_H | |||
#include <FL/Fl_Widget.H> | |||
#include <FL/Fl_Slider.H> | |||
#include <FL/Fl_Menu_Item.H> | |||
#include <valarray> | |||
#include <string> | |||
namespace Avtk | |||
{ | |||
class Waveshaper : public Fl_Slider | |||
{ | |||
public: | |||
Waveshaper(int _x, int _y, int _w, int _h, const char *_label = 0): | |||
Fl_Slider(_x, _y, _w, _h, _label) | |||
{ | |||
x = _x; | |||
y = _y; | |||
w = _w; | |||
h = _h; | |||
label = _label; | |||
mouseClickedX = 0; | |||
mouseClickedY = 0; | |||
mouseClicked = false; | |||
active = true; | |||
highlight = false; | |||
envelope = 0.5; | |||
waveshapeType = 0.f; | |||
} | |||
/// holds the preset: used from callback() to write value | |||
float waveshapeType; | |||
void type(float t) {waveshapeType = t; redraw();} | |||
bool active; | |||
bool highlight; | |||
int x, y, w, h; | |||
const char* label; | |||
int mouseClickedX; | |||
int mouseClickedY; | |||
bool mouseClicked; | |||
bool mouseRightClicked; | |||
float _threshold; | |||
float _sidechainAmp; | |||
float envelope; | |||
void setEnvelope(float e) | |||
{ | |||
envelope = e; | |||
redraw(); | |||
} | |||
float getEnvelope() | |||
{ | |||
return envelope; | |||
} | |||
void setActive(bool a) | |||
{ | |||
active = a; | |||
redraw(); | |||
} | |||
bool getActive() | |||
{ | |||
return active; | |||
} | |||
void draw() | |||
{ | |||
if (damage() & FL_DAMAGE_ALL) | |||
{ | |||
cairo_t *cr = Fl::cairo_cc(); | |||
cairo_save( cr ); | |||
cairo_set_line_width(cr, 1.5); | |||
// fill background | |||
cairo_rectangle( cr, x, y, w, h); | |||
cairo_set_source_rgb( cr, 28 / 255.f, 28 / 255.f , 28 / 255.f ); | |||
cairo_fill_preserve( cr ); | |||
cairo_clip( cr ); | |||
// set up dashed lines, 1 px off, 1 px on | |||
double dashes[1]; | |||
dashes[0] = 2.0; | |||
cairo_set_dash ( cr, dashes, 1, 0.0); | |||
cairo_set_line_width( cr, 1.0); | |||
// loop over each 2nd line, drawing dots | |||
cairo_set_line_width(cr, 1.0); | |||
cairo_set_source_rgb(cr, 0.4,0.4,0.4); | |||
for ( int i = 0; i < 4; i++ ) | |||
{ | |||
cairo_move_to( cr, x + ((w / 4.f)*i), y ); | |||
cairo_line_to( cr, x + ((w / 4.f)*i), y + h ); | |||
} | |||
for ( int i = 0; i < 4; i++ ) | |||
{ | |||
cairo_move_to( cr, x , y + ((h / 4.f)*i) ); | |||
cairo_line_to( cr, x + w, y + ((h / 4.f)*i) ); | |||
} | |||
cairo_set_source_rgba( cr, 66 / 255.f, 66 / 255.f , 66 / 255.f , 0.5 ); | |||
cairo_stroke(cr); | |||
cairo_set_dash ( cr, dashes, 0, 0.0); | |||
// curved waveshape | |||
float distort = value(); | |||
cairo_move_to( cr, x , y + h ); | |||
cairo_curve_to( cr, x + w * distort, y+h, // control point 1 | |||
x + w - (w * distort), y, // control point 2 | |||
x + w, y ); // end of curve 1, start curve 2 | |||
cairo_line_to ( cr, x + w, y + h ); | |||
cairo_close_path(cr); | |||
cairo_set_source_rgba( cr, 0 / 255.f, 153 / 255.f , 255 / 255.f , 0.21 ); | |||
cairo_fill_preserve(cr); | |||
cairo_set_line_width(cr, 2.0); | |||
cairo_set_source_rgba( cr, 0 / 255.f, 153 / 255.f , 255 / 255.f , 1 ); | |||
cairo_stroke(cr); | |||
// Tone bars | |||
cairo_move_to( cr, x + w/4, y + 2 ); | |||
cairo_line_to( cr, x + w/4, y + h / 2 * envelope ); | |||
cairo_move_to( cr, x + w - w/4, y + h - 2 ); | |||
cairo_line_to( cr, x + w - w/4, y + h - (h / 2 * envelope) ); | |||
//cairo_set_source_rgba (cr, 0.0, 0.48, 1.0, 0.6 ); | |||
cairo_set_source_rgba (cr, 0,0,0, 0.7 ); | |||
cairo_set_line_width(cr, 21.5); | |||
cairo_set_line_cap( cr, CAIRO_LINE_CAP_ROUND ); | |||
cairo_stroke( cr ); | |||
// stroke outline | |||
cairo_rectangle(cr, x+1, y+1, w-2, h-2); | |||
cairo_set_source_rgba( cr, 126 / 255.f, 126 / 255.f , 126 / 255.f , 0.8 ); | |||
cairo_set_line_width(cr, 1.0); | |||
cairo_stroke( cr ); | |||
if ( !active ) | |||
{ | |||
// big grey X | |||
cairo_set_line_width(cr, 20.0); | |||
cairo_set_source_rgba(cr, 0.4,0.4,0.4, 0.7); | |||
cairo_move_to( cr, x + (3 * w / 4.f), y + ( h / 4.f ) ); | |||
cairo_line_to( cr, x + (w / 4.f), y + ( 3 *h / 4.f ) ); | |||
cairo_move_to( cr, x + (w / 4.f), y + ( h / 4.f ) ); | |||
cairo_line_to( cr, x + (3 * w / 4.f), y + ( 3 *h / 4.f ) ); | |||
cairo_set_line_cap ( cr, CAIRO_LINE_CAP_BUTT); | |||
cairo_stroke( cr ); | |||
} | |||
cairo_restore( cr ); | |||
} | |||
} | |||
void resize(int X, int Y, int W, int H) | |||
{ | |||
Fl_Widget::resize(X,Y,W,H); | |||
x = X; | |||
y = Y; | |||
w = W; | |||
h = H; | |||
redraw(); | |||
} | |||
int handle(int event) | |||
{ | |||
switch(event) | |||
{ | |||
case FL_PUSH: | |||
highlight = 0; | |||
mouseRightClicked = false; | |||
mouseClickedX = Fl::event_x(); | |||
mouseClickedY = Fl::event_y(); | |||
if ( Fl::event_button() == FL_RIGHT_MOUSE ) | |||
{ | |||
active = !active; | |||
redraw(); | |||
mouseRightClicked = true; | |||
do_callback(); | |||
} | |||
return 1; | |||
case FL_DRAG: | |||
{ | |||
if ( Fl::event_state(FL_BUTTON1) ) | |||
{ | |||
if ( mouseClicked == false ) // catch the "click" event | |||
{ | |||
mouseClickedX = Fl::event_x(); | |||
mouseClickedY = Fl::event_y(); | |||
mouseClicked = true; | |||
} | |||
float deltaX = mouseClickedX - Fl::event_x(); | |||
float deltaY = mouseClickedY - Fl::event_y(); | |||
float valX = envelope; | |||
valX -= deltaX / 100.f; | |||
float valY = value(); | |||
valY += deltaY / 100.f; | |||
if ( valX > 1.0 ) valX = 1.0; | |||
if ( valX < 0.0 ) valX = 0.0; | |||
if ( valY > 1.0 ) valY = 1.0; | |||
if ( valY < 0.0 ) valY = 0.0; | |||
//handle_drag( value + deltaY ); | |||
set_value( valY ); | |||
envelope = valX; | |||
mouseClickedX = Fl::event_x(); | |||
mouseClickedY = Fl::event_y(); | |||
redraw(); | |||
do_callback(); | |||
} | |||
} | |||
return 1; | |||
case FL_RELEASE: | |||
mouseRightClicked = false; | |||
if (highlight) { | |||
highlight = 0; | |||
redraw(); | |||
do_callback(); | |||
} | |||
mouseClicked = false; | |||
return 1; | |||
case FL_SHORTCUT: | |||
if ( test_shortcut() ) | |||
{ | |||
do_callback(); | |||
return 1; | |||
} | |||
return 0; | |||
default: | |||
return Fl_Widget::handle(event); | |||
} | |||
return 0; | |||
} | |||
private: | |||
}; | |||
} // Avtk | |||
#endif // AVTK_WAVESHAPER_H |
@@ -0,0 +1,130 @@ | |||
#!/usr/bin/make -f | |||
# Makefile for DISTRHO Plugins # | |||
# ---------------------------- # | |||
# Created by falkTX | |||
# | |||
# NAME, OBJS_DSP and OBJS_UI have been defined before | |||
include ../../Makefile.mk | |||
# -------------------------------------------------------------- | |||
# Basic setup | |||
TARGET_DIR = ../../bin | |||
BUILD_C_FLAGS += -I. | |||
BUILD_CXX_FLAGS += -I. -I../../dpf/distrho -I../../dpf/dgl | |||
# -------------------------------------------------------------- | |||
# Set plugin binary file targets | |||
jack = $(TARGET_DIR)/$(NAME) | |||
ladspa_dsp = $(TARGET_DIR)/$(NAME)-ladspa.$(EXT) | |||
dssi_dsp = $(TARGET_DIR)/$(NAME)-dssi.$(EXT) | |||
dssi_ui = $(TARGET_DIR)/$(NAME)-dssi/$(NAME)_ui | |||
lv2 = $(TARGET_DIR)/$(NAME).lv2/$(NAME).$(EXT) | |||
lv2_dsp = $(TARGET_DIR)/$(NAME).lv2/$(NAME)_dsp.$(EXT) | |||
lv2_ui = $(TARGET_DIR)/$(NAME).lv2/$(NAME)_ui.$(EXT) | |||
vst = $(TARGET_DIR)/$(NAME)-vst.$(EXT) | |||
ifeq ($(WIN32),true) | |||
dssi_ui += .exe | |||
endif | |||
# TODO: MacOS VST bundle | |||
# -------------------------------------------------------------- | |||
# Set distrho code files | |||
DISTRHO_PLUGIN_FILES = ../../dpf/distrho/DistrhoPluginMain.cpp | |||
DISTRHO_UI_FILES = ../../dpf/distrho/DistrhoUIMain.cpp ../../dpf/libdgl.a | |||
# -------------------------------------------------------------- | |||
# Handle plugins without UI | |||
ifeq ($(TARGET_NOUI),true) | |||
dssi_ui = | |||
lv2_ui = | |||
DISTRHO_UI_FILES = | |||
DGL_LIBS = | |||
OBJS_UI = | |||
endif | |||
# -------------------------------------------------------------- | |||
# all needs to be first | |||
all: | |||
# -------------------------------------------------------------- | |||
# Common | |||
%.c.o: %.c | |||
$(CC) $< $(BUILD_C_FLAGS) -c -o $@ | |||
%.cpp.o: %.cpp ../../dpf/distrho/* | |||
$(CXX) $< $(BUILD_CXX_FLAGS) $(shell pkg-config --cflags ntk_images ntk) -c -o $@ | |||
clean: | |||
rm -f *.o | |||
rm -rf $(TARGET_DIR)/$(NAME) $(TARGET_DIR)/$(NAME)-* $(TARGET_DIR)/$(NAME).lv2/ | |||
# -------------------------------------------------------------- | |||
# JACK | |||
jack: $(jack) | |||
$(jack): $(OBJS_DSP) $(OBJS_UI) $(DISTRHO_PLUGIN_FILES) $(DISTRHO_UI_FILES) | |||
mkdir -p $(shell dirname $@) | |||
$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(DGL_LIBS) $(shell pkg-config --cflags --libs jack ntk_images ntk) -DDISTRHO_PLUGIN_TARGET_JACK -o $@ | |||
# -------------------------------------------------------------- | |||
# LADSPA | |||
ladspa: $(ladspa_dsp) | |||
$(ladspa_dsp): $(OBJS_DSP) $(DISTRHO_PLUGIN_FILES) | |||
mkdir -p $(shell dirname $@) | |||
$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(SHARED) -DDISTRHO_PLUGIN_TARGET_LADSPA -o $@ | |||
# -------------------------------------------------------------- | |||
# DSSI | |||
dssi: $(dssi_dsp) $(dssi_ui) | |||
$(dssi_dsp): $(OBJS_DSP) $(DISTRHO_PLUGIN_FILES) | |||
mkdir -p $(shell dirname $@) | |||
$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(SHARED) -DDISTRHO_PLUGIN_TARGET_DSSI -o $@ | |||
$(dssi_ui): $(OBJS_UI) $(DISTRHO_UI_FILES) | |||
mkdir -p $(shell dirname $@) | |||
$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(DGL_LIBS) $(shell pkg-config --cflags --libs liblo ntk_images ntk) -DDISTRHO_PLUGIN_TARGET_DSSI -o $@ | |||
# -------------------------------------------------------------- | |||
# LV2 | |||
lv2_one: $(lv2) | |||
lv2_sep: $(lv2_dsp) $(lv2_ui) | |||
$(lv2): $(OBJS_DSP) $(OBJS_UI) $(DISTRHO_PLUGIN_FILES) $(DISTRHO_UI_FILES) | |||
mkdir -p $(shell dirname $@) | |||
$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(DGL_LIBS) $(shell pkg-config --cflags --libs ntk_images ntk) $(SHARED) -DDISTRHO_PLUGIN_TARGET_LV2 -o $@ | |||
$(lv2_dsp): $(OBJS_DSP) $(DISTRHO_PLUGIN_FILES) | |||
mkdir -p $(shell dirname $@) | |||
$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(SHARED) -DDISTRHO_PLUGIN_TARGET_LV2 -o $@ | |||
$(lv2_ui): $(OBJS_UI) $(DISTRHO_UI_FILES) | |||
mkdir -p $(shell dirname $@) | |||
$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(DGL_LIBS) $(shell pkg-config --cflags --libs ntk_images ntk) $(SHARED) -DDISTRHO_PLUGIN_TARGET_LV2 -o $@ | |||
# -------------------------------------------------------------- | |||
# VST | |||
vst: $(vst) | |||
$(vst): $(OBJS_DSP) $(OBJS_UI) $(DISTRHO_PLUGIN_FILES) $(DISTRHO_UI_FILES) | |||
mkdir -p $(shell dirname $@) | |||
$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(DGL_LIBS) $(shell pkg-config --cflags --libs ntk_images ntk) $(SHARED) -DDISTRHO_PLUGIN_TARGET_VST -o $@ | |||
# -------------------------------------------------------------- |
@@ -20,6 +20,7 @@ | |||
#define DISTRHO_PLUGIN_NAME "Parameters" | |||
#define DISTRHO_PLUGIN_HAS_UI 1 | |||
#define DISTRHO_PLUGIN_IS_RT_SAFE 1 | |||
#define DISTRHO_PLUGIN_IS_SYNTH 0 | |||
#define DISTRHO_PLUGIN_NUM_INPUTS 2 | |||
@@ -20,6 +20,7 @@ | |||
#define DISTRHO_PLUGIN_NAME "States" | |||
#define DISTRHO_PLUGIN_HAS_UI 1 | |||
#define DISTRHO_PLUGIN_IS_RT_SAFE 1 | |||
#define DISTRHO_PLUGIN_IS_SYNTH 0 | |||
#define DISTRHO_PLUGIN_NUM_INPUTS 2 | |||
@@ -0,0 +1,204 @@ | |||
/* | |||
* DISTRHO Plugin Framework (DPF) | |||
* Copyright (C) 2012-2014 Filipe Coelho <falktx@falktx.com> | |||
* | |||
* Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
* or without fee is hereby granted, provided that the above copyright notice and this | |||
* permission notice appear in all copies. | |||
* | |||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD | |||
* TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN | |||
* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL | |||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER | |||
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | |||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
*/ | |||
#include "DistrhoPlugin.hpp" | |||
#include "dsp/dsp_reverb.hxx" | |||
START_NAMESPACE_DISTRHO | |||
// ----------------------------------------------------------------------------------------------------------- | |||
class ArtyFxPluginRoomy : public Plugin | |||
{ | |||
public: | |||
ArtyFxPluginRoomy() | |||
: Plugin(3, 0, 0), // 3 parameters, 0 programs, 0 states | |||
dspReverb(d_getSampleRate()) | |||
{ | |||
// Initialize all our parameters to their defaults. | |||
controlTime = 0.5f; | |||
controlDamping = 0.5f; | |||
controlDryWet = 0.5f; | |||
} | |||
protected: | |||
/* -------------------------------------------------------------------------------------------------------- | |||
* Information */ | |||
/** | |||
Get the plugin label. | |||
A plugin label follows the same rules as Parameter::symbol, with the exception that it can start with numbers. | |||
*/ | |||
const char* d_getLabel() const override | |||
{ | |||
return "roomy"; | |||
} | |||
/** | |||
Get the plugin author/maker. | |||
*/ | |||
const char* d_getMaker() const override | |||
{ | |||
return "OpenAV Productions"; | |||
} | |||
/** | |||
Get the plugin license name (a single line of text). | |||
*/ | |||
const char* d_getLicense() const override | |||
{ | |||
return "ISC"; | |||
} | |||
/** | |||
Get the plugin version, in hexadecimal. | |||
TODO format to be defined | |||
*/ | |||
uint32_t d_getVersion() const override | |||
{ | |||
return 0x1000; | |||
} | |||
/** | |||
Get the plugin unique Id. | |||
This value is used by LADSPA, DSSI and VST plugin formats. | |||
*/ | |||
int64_t d_getUniqueId() const override | |||
{ | |||
return d_cconst('O', 'V', 'r', 'm'); | |||
} | |||
/* -------------------------------------------------------------------------------------------------------- | |||
* Init */ | |||
/** | |||
Initialize the parameter @a index. | |||
This function will be called once, shortly after the plugin is created. | |||
*/ | |||
void d_initParameter(uint32_t index, Parameter& parameter) override | |||
{ | |||
parameter.hints = kParameterIsAutomable; | |||
parameter.ranges.def = 0.5f; | |||
parameter.ranges.min = 0.0f; | |||
parameter.ranges.max = 1.0f; | |||
switch (index) | |||
{ | |||
case 0: | |||
parameter.name = "Time"; | |||
parameter.symbol = "time"; | |||
break; | |||
case 1: | |||
parameter.name = "Damping"; | |||
parameter.symbol = "damping"; | |||
break; | |||
case 2: | |||
parameter.name = "Dry Wet Mix"; | |||
parameter.symbol = "dry_wet"; | |||
break; | |||
} | |||
} | |||
/* -------------------------------------------------------------------------------------------------------- | |||
* Internal data */ | |||
/** | |||
Get the current value of a parameter. | |||
*/ | |||
float d_getParameterValue(uint32_t index) const override | |||
{ | |||
switch (index) | |||
{ | |||
case 0: return controlTime; | |||
case 1: return controlDamping; | |||
case 2: return controlDryWet; | |||
} | |||
return 0.0f; | |||
} | |||
/** | |||
Change a parameter value. | |||
*/ | |||
void d_setParameterValue(uint32_t index, float value) override | |||
{ | |||
switch (index) | |||
{ | |||
case 0: | |||
controlTime = value; | |||
break; | |||
case 1: | |||
controlDamping = value; | |||
break; | |||
case 2: | |||
controlDryWet = value; | |||
break; | |||
} | |||
} | |||
/* -------------------------------------------------------------------------------------------------------- | |||
* Process */ | |||
/** | |||
Run/process function for plugins without MIDI input. | |||
*/ | |||
void d_run(const float** inputs, float** outputs, uint32_t frames) override | |||
{ | |||
dspReverb.rt60 ( controlTime ); | |||
dspReverb.damping ( controlDamping ); | |||
dspReverb.dryWet ( controlDryWet ); | |||
dspReverb.process(frames, inputs, outputs); | |||
} | |||
/* -------------------------------------------------------------------------------------------------------- | |||
* Callbacks */ | |||
/** | |||
Optional callback to inform the plugin about a sample rate change. | |||
This function will only be called when the plugin is deactivated. | |||
*/ | |||
void d_sampleRateChanged(double /*newSampleRate*/) override | |||
{ | |||
// TODO - reinit dspReverb | |||
} | |||
// ------------------------------------------------------------------------------------------------------- | |||
private: | |||
// our parameters | |||
float controlTime; | |||
float controlDamping; | |||
float controlDryWet; | |||
// the reverb | |||
Reverb dspReverb; | |||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ArtyFxPluginRoomy) | |||
}; | |||
/* ------------------------------------------------------------------------------------------------------------ | |||
* Plugin entry point, called by DPF to create a new plugin instance. */ | |||
Plugin* createPlugin() | |||
{ | |||
return new ArtyFxPluginRoomy(); | |||
} | |||
// ----------------------------------------------------------------------------------------------------------- | |||
END_NAMESPACE_DISTRHO |
@@ -0,0 +1,93 @@ | |||
/* | |||
* DISTRHO Plugin Framework (DPF) | |||
* Copyright (C) 2012-2014 Filipe Coelho <falktx@falktx.com> | |||
* | |||
* Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
* or without fee is hereby granted, provided that the above copyright notice and this | |||
* permission notice appear in all copies. | |||
* | |||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD | |||
* TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN | |||
* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL | |||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER | |||
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | |||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
*/ | |||
#include "DistrhoUI.hpp" | |||
// include full file here for convenience | |||
#include "gui/roomy_widget.cxx" | |||
START_NAMESPACE_DISTRHO | |||
// ----------------------------------------------------------------------------------------------------------- | |||
class ArtyFxUiRoomy : public UI | |||
{ | |||
public: | |||
ArtyFxUiRoomy() | |||
: UI(), | |||
fUI(this) | |||
{ | |||
// ntk method to add sub-window | |||
add(fUI.window); | |||
fUI.window->show(); | |||
// start widgets on their default values | |||
fUI.graph->size(0.5f); | |||
fUI.graph->damping(0.5f); | |||
fUI.graph->wet(0.5f); | |||
fUI.time->value(0.5f); | |||
fUI.damping->value(0.5f); | |||
fUI.dryWet->value(0.5f); | |||
setSize(fUI.getWidth(), fUI.getHeight()); | |||
} | |||
protected: | |||
/* -------------------------------------------------------------------------------------------------------- | |||
* DSP/Plugin Callbacks */ | |||
/** | |||
A parameter has changed on the plugin side. | |||
This is called by the host to inform the UI about parameter changes. | |||
*/ | |||
void d_parameterChanged(uint32_t index, float value) override | |||
{ | |||
switch (index) | |||
{ | |||
case 0: | |||
fUI.graph->size(value); | |||
fUI.time->value(value); | |||
break; | |||
case 1: | |||
fUI.graph->damping(value); | |||
fUI.damping->value(value); | |||
break; | |||
case 2: | |||
fUI.graph->wet(value); | |||
fUI.dryWet->value(value); | |||
break; | |||
} | |||
} | |||
// ------------------------------------------------------------------------------------------------------- | |||
private: | |||
RoomyUI fUI; | |||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ArtyFxUiRoomy) | |||
}; | |||
/* ------------------------------------------------------------------------------------------------------------ | |||
* UI entry point, called by DPF to create a new UI instance. */ | |||
UI* createUI() | |||
{ | |||
return new ArtyFxUiRoomy(); | |||
} | |||
// ----------------------------------------------------------------------------------------------------------- | |||
END_NAMESPACE_DISTRHO |
@@ -0,0 +1,39 @@ | |||
/* | |||
* DISTRHO Plugin Framework (DPF) | |||
* Copyright (C) 2012-2014 Filipe Coelho <falktx@falktx.com> | |||
* | |||
* Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
* or without fee is hereby granted, provided that the above copyright notice and this | |||
* permission notice appear in all copies. | |||
* | |||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD | |||
* TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN | |||
* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL | |||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER | |||
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | |||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
*/ | |||
#ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
#define DISTRHO_PLUGIN_INFO_H_INCLUDED | |||
#define DISTRHO_PLUGIN_NAME "Roomy" | |||
#define DISTRHO_PLUGIN_HAS_UI 1 | |||
#define DISTRHO_PLUGIN_IS_RT_SAFE 1 | |||
#define DISTRHO_PLUGIN_IS_SYNTH 0 | |||
#define DISTRHO_PLUGIN_NUM_INPUTS 2 | |||
#define DISTRHO_PLUGIN_NUM_OUTPUTS 2 | |||
#define DISTRHO_PLUGIN_WANT_LATENCY 0 | |||
#define DISTRHO_PLUGIN_WANT_PROGRAMS 0 | |||
#define DISTRHO_PLUGIN_WANT_STATE 0 | |||
#define DISTRHO_PLUGIN_WANT_TIMEPOS 0 | |||
#define DISTRHO_PLUGIN_URI "http://www.openavproductions.com/artyfx#roomy" | |||
#define DISTRHO_UI_URI "http://www.openavproductions.com/artyfx#roomy/gui" | |||
#define DISTRHO_UI_USE_NTK 1 | |||
#endif // DISTRHO_PLUGIN_INFO_H_INCLUDED |
@@ -0,0 +1,35 @@ | |||
#!/usr/bin/make -f | |||
# Makefile for DISTRHO Plugins # | |||
# ---------------------------- # | |||
# Created by falkTX | |||
# | |||
# -------------------------------------------------------------- | |||
# Project name, used for binaries | |||
NAME = roomy | |||
# -------------------------------------------------------------- | |||
# Files to build | |||
OBJS_DSP = \ | |||
ArtyFxPluginRoomy.cpp.o | |||
OBJS_UI = \ | |||
ArtyFxUiRoomy.cpp.o | |||
# -------------------------------------------------------------- | |||
# Do some magic | |||
include ../Makefile.ntk.mk | |||
# -------------------------------------------------------------- | |||
# Enable all possible plugin types | |||
ifeq ($(LINUX),true) | |||
all: jack ladspa dssi lv2_sep vst | |||
else | |||
all: ladspa dssi lv2_sep vst | |||
endif | |||
# -------------------------------------------------------------- |
@@ -0,0 +1,4 @@ | |||
# OpenAV / NTK example | |||
This example will show an OpenAV based plugin working with DPF.<br/> | |||
The UI uses NTK instead of OpenGL.<br/> |
@@ -0,0 +1,511 @@ | |||
/* | |||
* Author: Harry van Haaren 2013 | |||
* harryhaaren@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., 51 Franklin Street, Fifth Floor, Boston, | |||
* MA 02110-1301, USA. | |||
*/ | |||
/* | |||
The DSP code in this file was generated using FAUST. | |||
The FAUST code used is under the following licenses: | |||
effect.lib/name Faust Audio Effect Library | |||
effect.lib/author Julius O. Smith (jos at ccrma.stanford.edu) | |||
effect.lib/copyright Julius O. Smith III | |||
effect.lib/version 1.33 | |||
effect.lib/license STK-4.3 | |||
effect.lib/reference https://ccrma.stanford.edu/realsimple/faust_strings/ | |||
filter.lib/author Julius O. Smith (jos at ccrma.stanford.edu) | |||
filter.lib/name Faust Filter Library | |||
filter.lib/copyright Julius O. Smith III | |||
filter.lib/version 1.29 | |||
filter.lib/license STK-4.3 | |||
filter.lib/reference https://ccrma.stanford.edu/~jos/filters/ | |||
music.lib/name Music Library | |||
music.lib/author GRAME | |||
music.lib/copyright GRAME | |||
music.lib/version 1.0 | |||
music.lib/license LGPL | |||
math.lib/name Math Library | |||
math.lib/author GRAME | |||
math.lib/copyright GRAME | |||
math.lib/version 1.0 | |||
math.lib/license LGPL | |||
*/ | |||
#ifndef OPENAV_DSP_REVERB_H | |||
#define OPENAV_DSP_REVERB_H | |||
#include <math.h> | |||
#include <cmath> | |||
#include <cstdlib> | |||
template <class T> const T& max (const T& a, const T& b) { | |||
return (a<b)?b:a; | |||
} | |||
template <class T> const T& min (const T& a, const T& b) { | |||
return !(b<a)?a:b; | |||
} | |||
template <int N> inline float faustpower(float x) { return powf(x,N); } | |||
template <int N> inline double faustpower(double x) { return pow(x,N); } | |||
template <int N> inline int faustpower(int x) { return faustpower<N/2>(x) * faustpower<N-N/2>(x); } | |||
template <> inline int faustpower<0>(int x) { return 1; } | |||
template <> inline int faustpower<1>(int x) { return x; } | |||
class Reverb // : Effect | |||
{ | |||
public: | |||
Reverb(int sr) | |||
{ | |||
init( sr ); | |||
} | |||
int getNumInputs() { return 2; } | |||
int getNumOutputs(){ return 2; } | |||
void damping(float d) | |||
{ | |||
if( d > 1.0 ) d = 1.0f; | |||
if( d < 0.0 ) d = 0.0f; | |||
fslider1 = (1-d) * 18500 + 1500.f; | |||
} | |||
void rt60(float rt) | |||
{ | |||
if( rt > 1.0 ) rt = 1.0f; | |||
if( rt < 0.0 ) rt = 0.0f; | |||
fslider0 = 1 + rt * 5; | |||
} | |||
void dryWet(float dw) | |||
{ | |||
if( dw > 1.0 ) dw = 1.0f; | |||
if( dw < 0.0 ) dw = 0.0f; | |||
_dryWet = dw; | |||
} | |||
void process (int count, const float** input, float** output) | |||
{ | |||
float fSlow0 = fslider0; | |||
float fSlow1 = expf((fConst2 / fSlow0)); | |||
float fSlow2 = faustpower<2>(fSlow1); | |||
float fSlow3 = (1.0f - fSlow2); | |||
float fSlow4 = cosf((fConst3 * fslider1)); | |||
float fSlow5 = (1.0f - (fSlow4 * fSlow2)); | |||
float fSlow6 = sqrtf(max(0.f, ((faustpower<2>(fSlow5) / faustpower<2>(fSlow3)) - 1.0f))); | |||
float fSlow7 = (fSlow5 / fSlow3); | |||
float fSlow8 = (fSlow7 - fSlow6); | |||
float fSlow9 = (fSlow0 - 0.5f); | |||
float fSlow10 = ((expf((fConst2 / fSlow9)) / fSlow1) - 1); | |||
float fSlow11 = (fSlow1 * ((1.0f + fSlow6) - fSlow7)); | |||
float fSlow12 = expf((fConst12 / fSlow0)); | |||
float fSlow13 = faustpower<2>(fSlow12); | |||
float fSlow14 = (1.0f - fSlow13); | |||
float fSlow15 = (1.0f - (fSlow4 * fSlow13)); | |||
float fSlow16 = sqrtf(max(0.f, ((faustpower<2>(fSlow15) / faustpower<2>(fSlow14)) - 1.0f))); | |||
float fSlow17 = (fSlow15 / fSlow14); | |||
float fSlow18 = (fSlow17 - fSlow16); | |||
float fSlow19 = ((expf((fConst12 / fSlow9)) / fSlow12) - 1); | |||
float fSlow20 = (fSlow12 * ((1.0f + fSlow16) - fSlow17)); | |||
float fSlow21 = expf((fConst17 / fSlow0)); | |||
float fSlow22 = faustpower<2>(fSlow21); | |||
float fSlow23 = (1.0f - fSlow22); | |||
float fSlow24 = (1.0f - (fSlow4 * fSlow22)); | |||
float fSlow25 = sqrtf(max(0.f, ((faustpower<2>(fSlow24) / faustpower<2>(fSlow23)) - 1.0f))); | |||
float fSlow26 = (fSlow24 / fSlow23); | |||
float fSlow27 = (fSlow26 - fSlow25); | |||
float fSlow28 = ((expf((fConst17 / fSlow9)) / fSlow21) - 1); | |||
float fSlow29 = (fSlow21 * ((1.0f + fSlow25) - fSlow26)); | |||
float fSlow30 = expf((fConst22 / fSlow0)); | |||
float fSlow31 = faustpower<2>(fSlow30); | |||
float fSlow32 = (1.0f - fSlow31); | |||
float fSlow33 = (1.0f - (fSlow4 * fSlow31)); | |||
float fSlow34 = sqrtf(max(0.f, ((faustpower<2>(fSlow33) / faustpower<2>(fSlow32)) - 1.0f))); | |||
float fSlow35 = (fSlow33 / fSlow32); | |||
float fSlow36 = (fSlow35 - fSlow34); | |||
float fSlow37 = ((expf((fConst22 / fSlow9)) / fSlow30) - 1); | |||
float fSlow38 = (fSlow30 * ((1.0f + fSlow34) - fSlow35)); | |||
float fSlow39 = expf((fConst27 / fSlow0)); | |||
float fSlow40 = faustpower<2>(fSlow39); | |||
float fSlow41 = (1.0f - fSlow40); | |||
float fSlow42 = (1.0f - (fSlow4 * fSlow40)); | |||
float fSlow43 = sqrtf(max(0.f, ((faustpower<2>(fSlow42) / faustpower<2>(fSlow41)) - 1.0f))); | |||
float fSlow44 = (fSlow42 / fSlow41); | |||
float fSlow45 = (fSlow44 - fSlow43); | |||
float fSlow46 = ((expf((fConst27 / fSlow9)) / fSlow39) - 1); | |||
float fSlow47 = (fSlow39 * ((1.0f + fSlow43) - fSlow44)); | |||
float fSlow48 = expf((fConst32 / fSlow0)); | |||
float fSlow49 = faustpower<2>(fSlow48); | |||
float fSlow50 = (1.0f - fSlow49); | |||
float fSlow51 = (1.0f - (fSlow4 * fSlow49)); | |||
float fSlow52 = sqrtf(max(0.f, ((faustpower<2>(fSlow51) / faustpower<2>(fSlow50)) - 1.0f))); | |||
float fSlow53 = (fSlow51 / fSlow50); | |||
float fSlow54 = (fSlow53 - fSlow52); | |||
float fSlow55 = ((expf((fConst32 / fSlow9)) / fSlow48) - 1); | |||
float fSlow56 = (fSlow48 * ((1.0f + fSlow52) - fSlow53)); | |||
float fSlow57 = expf((fConst37 / fSlow0)); | |||
float fSlow58 = faustpower<2>(fSlow57); | |||
float fSlow59 = (1.0f - fSlow58); | |||
float fSlow60 = (1.0f - (fSlow4 * fSlow58)); | |||
float fSlow61 = sqrtf(max(0.f, ((faustpower<2>(fSlow60) / faustpower<2>(fSlow59)) - 1.0f))); | |||
float fSlow62 = (fSlow60 / fSlow59); | |||
float fSlow63 = (fSlow62 - fSlow61); | |||
float fSlow64 = ((expf((fConst37 / fSlow9)) / fSlow57) - 1); | |||
float fSlow65 = (fSlow57 * ((1.0f + fSlow61) - fSlow62)); | |||
float fSlow66 = expf((fConst42 / fSlow0)); | |||
float fSlow67 = faustpower<2>(fSlow66); | |||
float fSlow68 = (1.0f - fSlow67); | |||
float fSlow69 = (1.0f - (fSlow67 * fSlow4)); | |||
float fSlow70 = sqrtf(max(0.f, ((faustpower<2>(fSlow69) / faustpower<2>(fSlow68)) - 1.0f))); | |||
float fSlow71 = (fSlow69 / fSlow68); | |||
float fSlow72 = (fSlow71 - fSlow70); | |||
float fSlow73 = ((expf((fConst42 / fSlow9)) / fSlow66) - 1); | |||
float fSlow74 = (fSlow66 * ((1.0f + fSlow70) - fSlow71)); | |||
const float* input0 = input[0]; | |||
const float* input1 = input[1]; | |||
float* output0 = output[0]; | |||
float* output1 = output[1]; | |||
for (int i=0; i<count; i++) { | |||
fRec11[0] = ((fConst7 * (fRec4[1] + fRec4[2])) + (fConst6 * fRec11[1])); | |||
fRec10[0] = ((fSlow11 * (fRec4[1] + (fSlow10 * fRec11[0]))) + (fSlow8 * fRec10[1])); | |||
fVec0[IOTA&8191] = (1e-20f + (0.35355339059327373f * fRec10[0])); | |||
float fTemp0 = (0.3f * (float)input0[i]); | |||
float fTemp1 = ((fTemp0 + fVec0[(IOTA-iConst9)&8191]) - (0.6f * fRec8[1])); | |||
fVec1[IOTA&2047] = fTemp1; | |||
fRec8[0] = fVec1[(IOTA-iConst10)&2047]; | |||
float fRec9 = (0.6f * fVec1[IOTA&2047]); | |||
fRec15[0] = ((fConst7 * (fRec0[1] + fRec0[2])) + (fConst6 * fRec15[1])); | |||
fRec14[0] = ((fSlow20 * (fRec0[1] + (fSlow19 * fRec15[0]))) + (fSlow18 * fRec14[1])); | |||
fVec2[IOTA&8191] = (1e-20f + (0.35355339059327373f * fRec14[0])); | |||
float fTemp2 = ((fTemp0 + fVec2[(IOTA-iConst14)&8191]) - (0.6f * fRec12[1])); | |||
fVec3[IOTA&1023] = fTemp2; | |||
fRec12[0] = fVec3[(IOTA-iConst15)&1023]; | |||
float fRec13 = (0.6f * fVec3[IOTA&1023]); | |||
float fTemp3 = (fRec13 + fRec9); | |||
fRec19[0] = ((fConst7 * (fRec2[1] + fRec2[2])) + (fConst6 * fRec19[1])); | |||
fRec18[0] = ((fSlow29 * (fRec2[1] + (fSlow28 * fRec19[0]))) + (fSlow27 * fRec18[1])); | |||
fVec4[IOTA&8191] = (1e-20f + (0.35355339059327373f * fRec18[0])); | |||
float fTemp4 = (fVec4[(IOTA-iConst19)&8191] - (fTemp0 + (0.6f * fRec16[1]))); | |||
fVec5[IOTA&2047] = fTemp4; | |||
fRec16[0] = fVec5[(IOTA-iConst20)&2047]; | |||
float fRec17 = (0.6f * fVec5[IOTA&2047]); | |||
fRec23[0] = ((fConst7 * (fRec6[1] + fRec6[2])) + (fConst6 * fRec23[1])); | |||
fRec22[0] = ((fSlow38 * (fRec6[1] + (fSlow37 * fRec23[0]))) + (fSlow36 * fRec22[1])); | |||
fVec6[IOTA&8191] = (1e-20f + (0.35355339059327373f * fRec22[0])); | |||
float fTemp5 = (fVec6[(IOTA-iConst24)&8191] - (fTemp0 + (0.6f * fRec20[1]))); | |||
fVec7[IOTA&1023] = fTemp5; | |||
fRec20[0] = fVec7[(IOTA-iConst25)&1023]; | |||
float fRec21 = (0.6f * fVec7[IOTA&1023]); | |||
float fTemp6 = (fRec21 + (fRec17 + fTemp3)); | |||
fRec27[0] = ((fConst7 * (fRec1[1] + fRec1[2])) + (fConst6 * fRec27[1])); | |||
fRec26[0] = ((fSlow47 * (fRec1[1] + (fSlow46 * fRec27[0]))) + (fSlow45 * fRec26[1])); | |||
fVec8[IOTA&16383] = (1e-20f + (0.35355339059327373f * fRec26[0])); | |||
float fTemp7 = (0.3f * (float)input1[i]); | |||
float fTemp8 = ((fTemp7 + fVec8[(IOTA-iConst29)&16383]) + (0.6f * fRec24[1])); | |||
fVec9[IOTA&2047] = fTemp8; | |||
fRec24[0] = fVec9[(IOTA-iConst30)&2047]; | |||
float fRec25 = (0 - (0.6f * fVec9[IOTA&2047])); | |||
fRec31[0] = ((fConst7 * (fRec5[1] + fRec5[2])) + (fConst6 * fRec31[1])); | |||
fRec30[0] = ((fSlow56 * (fRec5[1] + (fSlow55 * fRec31[0]))) + (fSlow54 * fRec30[1])); | |||
fVec10[IOTA&8191] = (1e-20f + (0.35355339059327373f * fRec30[0])); | |||
float fTemp9 = ((fTemp7 + fVec10[(IOTA-iConst34)&8191]) + (0.6f * fRec28[1])); | |||
fVec11[IOTA&2047] = fTemp9; | |||
fRec28[0] = fVec11[(IOTA-iConst35)&2047]; | |||
float fRec29 = (0 - (0.6f * fVec11[IOTA&2047])); | |||
fRec35[0] = ((fConst7 * (fRec3[1] + fRec3[2])) + (fConst6 * fRec35[1])); | |||
fRec34[0] = ((fSlow65 * (fRec3[1] + (fSlow64 * fRec35[0]))) + (fSlow63 * fRec34[1])); | |||
fVec12[IOTA&16383] = (1e-20f + (0.35355339059327373f * fRec34[0])); | |||
float fTemp10 = ((fVec12[(IOTA-iConst39)&16383] + (0.6f * fRec32[1])) - fTemp7); | |||
fVec13[IOTA&2047] = fTemp10; | |||
fRec32[0] = fVec13[(IOTA-iConst40)&2047]; | |||
float fRec33 = (0 - (0.6f * fVec13[IOTA&2047])); | |||
fRec39[0] = ((fConst7 * (fRec7[1] + fRec7[2])) + (fConst6 * fRec39[1])); | |||
fRec38[0] = ((fSlow74 * (fRec7[1] + (fSlow73 * fRec39[0]))) + (fSlow72 * fRec38[1])); | |||
fVec14[IOTA&16383] = (1e-20f + (0.35355339059327373f * fRec38[0])); | |||
float fTemp11 = ((fVec14[(IOTA-iConst44)&16383] + (0.6f * fRec36[1])) - fTemp7); | |||
fVec15[IOTA&1023] = fTemp11; | |||
fRec36[0] = fVec15[(IOTA-iConst45)&1023]; | |||
float fRec37 = (0 - (0.6f * fVec15[IOTA&1023])); | |||
fRec0[0] = (fRec12[1] + (fRec8[1] + (fRec16[1] + (fRec20[1] + (fRec24[1] + (fRec28[1] + (fRec32[1] + (fRec36[1] + (fRec37 + (fRec33 + (fRec29 + (fRec25 + fTemp6)))))))))))); | |||
fRec1[0] = (0 - ((fRec24[1] + (fRec28[1] + (fRec32[1] + (fRec36[1] + (fRec37 + (fRec33 + (fRec25 + fRec29))))))) - (fRec12[1] + (fRec8[1] + (fRec16[1] + (fRec20[1] + fTemp6)))))); | |||
float fTemp12 = (fRec17 + fRec21); | |||
fRec2[0] = (0 - ((fRec16[1] + (fRec20[1] + (fRec32[1] + (fRec36[1] + (fRec37 + (fRec33 + fTemp12)))))) - (fRec12[1] + (fRec8[1] + (fRec24[1] + (fRec28[1] + (fRec29 + (fRec25 + fTemp3)))))))); | |||
fRec3[0] = (0 - ((fRec16[1] + (fRec20[1] + (fRec24[1] + (fRec28[1] + (fRec29 + (fRec25 + fTemp12)))))) - (fRec12[1] + (fRec8[1] + (fRec32[1] + (fRec36[1] + (fRec37 + (fRec33 + fTemp3)))))))); | |||
float fTemp13 = (fRec13 + fRec17); | |||
float fTemp14 = (fRec9 + fRec21); | |||
fRec4[0] = (0 - ((fRec8[1] + (fRec20[1] + (fRec28[1] + (fRec36[1] + (fRec37 + (fRec29 + fTemp14)))))) - (fRec12[1] + (fRec16[1] + (fRec24[1] + (fRec32[1] + (fRec33 + (fRec25 + fTemp13)))))))); | |||
fRec5[0] = (0 - ((fRec8[1] + (fRec20[1] + (fRec24[1] + (fRec32[1] + (fRec33 + (fRec25 + fTemp14)))))) - (fRec12[1] + (fRec16[1] + (fRec28[1] + (fRec36[1] + (fRec37 + (fRec29 + fTemp13)))))))); | |||
float fTemp15 = (fRec13 + fRec21); | |||
float fTemp16 = (fRec9 + fRec17); | |||
fRec6[0] = (0 - ((fRec8[1] + (fRec16[1] + (fRec28[1] + (fRec32[1] + (fRec33 + (fRec29 + fTemp16)))))) - (fRec12[1] + (fRec20[1] + (fRec24[1] + (fRec36[1] + (fRec37 + (fRec25 + fTemp15)))))))); | |||
fRec7[0] = (0 - ((fRec8[1] + (fRec16[1] + (fRec24[1] + (fRec36[1] + (fRec37 + (fRec25 + fTemp16)))))) - (fRec12[1] + (fRec20[1] + (fRec28[1] + (fRec32[1] + (fRec33 + (fRec29 + fTemp15)))))))); | |||
float reverb0 = (float)(0.37f * (fRec1[0] + fRec2[0])); | |||
float reverb1 = (float)(0.37f * (fRec1[0] - fRec2[0])); | |||
output0[i] = (input0[i] * (1-_dryWet)) + (reverb0 * _dryWet ); | |||
output1[i] = (input1[i] * (1-_dryWet)) + (reverb1 * _dryWet ); | |||
// post processing | |||
fRec7[2] = fRec7[1]; fRec7[1] = fRec7[0]; | |||
fRec6[2] = fRec6[1]; fRec6[1] = fRec6[0]; | |||
fRec5[2] = fRec5[1]; fRec5[1] = fRec5[0]; | |||
fRec4[2] = fRec4[1]; fRec4[1] = fRec4[0]; | |||
fRec3[2] = fRec3[1]; fRec3[1] = fRec3[0]; | |||
fRec2[2] = fRec2[1]; fRec2[1] = fRec2[0]; | |||
fRec1[2] = fRec1[1]; fRec1[1] = fRec1[0]; | |||
fRec0[2] = fRec0[1]; fRec0[1] = fRec0[0]; | |||
fRec36[1] = fRec36[0]; | |||
fRec38[1] = fRec38[0]; | |||
fRec39[1] = fRec39[0]; | |||
fRec32[1] = fRec32[0]; | |||
fRec34[1] = fRec34[0]; | |||
fRec35[1] = fRec35[0]; | |||
fRec28[1] = fRec28[0]; | |||
fRec30[1] = fRec30[0]; | |||
fRec31[1] = fRec31[0]; | |||
fRec24[1] = fRec24[0]; | |||
fRec26[1] = fRec26[0]; | |||
fRec27[1] = fRec27[0]; | |||
fRec20[1] = fRec20[0]; | |||
fRec22[1] = fRec22[0]; | |||
fRec23[1] = fRec23[0]; | |||
fRec16[1] = fRec16[0]; | |||
fRec18[1] = fRec18[0]; | |||
fRec19[1] = fRec19[0]; | |||
fRec12[1] = fRec12[0]; | |||
fRec14[1] = fRec14[0]; | |||
fRec15[1] = fRec15[0]; | |||
fRec8[1] = fRec8[0]; | |||
IOTA = IOTA+1; | |||
fRec10[1] = fRec10[0]; | |||
fRec11[1] = fRec11[0]; | |||
} | |||
} | |||
private: | |||
float _dryWet; | |||
float fslider0; | |||
int iConst0; | |||
float fConst1; | |||
float fConst2; | |||
float fslider1; | |||
float fConst3; | |||
float fConst4; | |||
float fConst5; | |||
float fConst6; | |||
float fConst7; | |||
float fRec11[2]; | |||
float fRec10[2]; | |||
int IOTA; | |||
float fVec0[8192]; | |||
float fConst8; | |||
int iConst9; | |||
float fVec1[2048]; | |||
int iConst10; | |||
float fRec8[2]; | |||
float fConst11; | |||
float fConst12; | |||
float fRec15[2]; | |||
float fRec14[2]; | |||
float fVec2[8192]; | |||
float fConst13; | |||
int iConst14; | |||
float fVec3[1024]; | |||
int iConst15; | |||
float fRec12[2]; | |||
float fConst16; | |||
float fConst17; | |||
float fRec19[2]; | |||
float fRec18[2]; | |||
float fVec4[8192]; | |||
float fConst18; | |||
int iConst19; | |||
float fVec5[2048]; | |||
int iConst20; | |||
float fRec16[2]; | |||
float fConst21; | |||
float fConst22; | |||
float fRec23[2]; | |||
float fRec22[2]; | |||
float fVec6[8192]; | |||
float fConst23; | |||
int iConst24; | |||
float fVec7[1024]; | |||
int iConst25; | |||
float fRec20[2]; | |||
float fConst26; | |||
float fConst27; | |||
float fRec27[2]; | |||
float fRec26[2]; | |||
float fVec8[16384]; | |||
float fConst28; | |||
int iConst29; | |||
float fVec9[2048]; | |||
int iConst30; | |||
float fRec24[2]; | |||
float fConst31; | |||
float fConst32; | |||
float fRec31[2]; | |||
float fRec30[2]; | |||
float fVec10[8192]; | |||
float fConst33; | |||
int iConst34; | |||
float fVec11[2048]; | |||
int iConst35; | |||
float fRec28[2]; | |||
float fConst36; | |||
float fConst37; | |||
float fRec35[2]; | |||
float fRec34[2]; | |||
float fVec12[16384]; | |||
float fConst38; | |||
int iConst39; | |||
float fVec13[2048]; | |||
int iConst40; | |||
float fRec32[2]; | |||
float fConst41; | |||
float fConst42; | |||
float fRec39[2]; | |||
float fRec38[2]; | |||
float fVec14[16384]; | |||
float fConst43; | |||
int iConst44; | |||
float fVec15[1024]; | |||
int iConst45; | |||
float fRec36[2]; | |||
float fRec0[3]; | |||
float fRec1[3]; | |||
float fRec2[3]; | |||
float fRec3[3]; | |||
float fRec4[3]; | |||
float fRec5[3]; | |||
float fRec6[3]; | |||
float fRec7[3]; | |||
/// Long nasty function setting initial values | |||
void init(int samplingFreq) | |||
{ | |||
fslider0 = 3.0f; | |||
iConst0 = min(192000, max(1, samplingFreq)); | |||
fConst1 = floorf((0.5f + (0.174713f * iConst0))); | |||
fConst2 = ((0 - (6.907755278982138f * fConst1)) / iConst0); | |||
fslider1 = 6e+03f; | |||
fConst3 = (6.283185307179586f / float(iConst0)); | |||
fConst4 = (1.0f / tanf((1256.6370614359173f / iConst0))); | |||
fConst5 = (1 + fConst4); | |||
fConst6 = (0 - ((1 - fConst4) / fConst5)); | |||
fConst7 = (1.0f / fConst5); | |||
for (int i=0; i<2; i++) fRec11[i] = 0; | |||
for (int i=0; i<2; i++) fRec10[i] = 0; | |||
IOTA = 0; | |||
for (int i=0; i<8192; i++) fVec0[i] = 0; | |||
fConst8 = floorf((0.5f + (0.022904f * iConst0))); | |||
iConst9 = int((int((fConst1 - fConst8)) & 8191)); | |||
for (int i=0; i<2048; i++) fVec1[i] = 0; | |||
iConst10 = int((int((fConst8 - 1)) & 2047)); | |||
for (int i=0; i<2; i++) fRec8[i] = 0; | |||
fConst11 = floorf((0.5f + (0.153129f * iConst0))); | |||
fConst12 = ((0 - (6.907755278982138f * fConst11)) / iConst0); | |||
for (int i=0; i<2; i++) fRec15[i] = 0; | |||
for (int i=0; i<2; i++) fRec14[i] = 0; | |||
for (int i=0; i<8192; i++) fVec2[i] = 0; | |||
fConst13 = floorf((0.5f + (0.020346f * iConst0))); | |||
iConst14 = int((int((fConst11 - fConst13)) & 8191)); | |||
for (int i=0; i<1024; i++) fVec3[i] = 0; | |||
iConst15 = int((int((fConst13 - 1)) & 1023)); | |||
for (int i=0; i<2; i++) fRec12[i] = 0; | |||
fConst16 = floorf((0.5f + (0.127837f * iConst0))); | |||
fConst17 = ((0 - (6.907755278982138f * fConst16)) / iConst0); | |||
for (int i=0; i<2; i++) fRec19[i] = 0; | |||
for (int i=0; i<2; i++) fRec18[i] = 0; | |||
for (int i=0; i<8192; i++) fVec4[i] = 0; | |||
fConst18 = floorf((0.5f + (0.031604f * iConst0))); | |||
iConst19 = int((int((fConst16 - fConst18)) & 8191)); | |||
for (int i=0; i<2048; i++) fVec5[i] = 0; | |||
iConst20 = int((int((fConst18 - 1)) & 2047)); | |||
for (int i=0; i<2; i++) fRec16[i] = 0; | |||
fConst21 = floorf((0.5f + (0.125f * iConst0))); | |||
fConst22 = ((0 - (6.907755278982138f * fConst21)) / iConst0); | |||
for (int i=0; i<2; i++) fRec23[i] = 0; | |||
for (int i=0; i<2; i++) fRec22[i] = 0; | |||
for (int i=0; i<8192; i++) fVec6[i] = 0; | |||
fConst23 = floorf((0.5f + (0.013458f * iConst0))); | |||
iConst24 = int((int((fConst21 - fConst23)) & 8191)); | |||
for (int i=0; i<1024; i++) fVec7[i] = 0; | |||
iConst25 = int((int((fConst23 - 1)) & 1023)); | |||
for (int i=0; i<2; i++) fRec20[i] = 0; | |||
fConst26 = floorf((0.5f + (0.210389f * iConst0))); | |||
fConst27 = ((0 - (6.907755278982138f * fConst26)) / iConst0); | |||
for (int i=0; i<2; i++) fRec27[i] = 0; | |||
for (int i=0; i<2; i++) fRec26[i] = 0; | |||
for (int i=0; i<16384; i++) fVec8[i] = 0; | |||
fConst28 = floorf((0.5f + (0.024421f * iConst0))); | |||
iConst29 = int((int((fConst26 - fConst28)) & 16383)); | |||
for (int i=0; i<2048; i++) fVec9[i] = 0; | |||
iConst30 = int((int((fConst28 - 1)) & 2047)); | |||
for (int i=0; i<2; i++) fRec24[i] = 0; | |||
fConst31 = floorf((0.5f + (0.192303f * iConst0))); | |||
fConst32 = ((0 - (6.907755278982138f * fConst31)) / iConst0); | |||
for (int i=0; i<2; i++) fRec31[i] = 0; | |||
for (int i=0; i<2; i++) fRec30[i] = 0; | |||
for (int i=0; i<8192; i++) fVec10[i] = 0; | |||
fConst33 = floorf((0.5f + (0.029291f * iConst0))); | |||
iConst34 = int((int((fConst31 - fConst33)) & 8191)); | |||
for (int i=0; i<2048; i++) fVec11[i] = 0; | |||
iConst35 = int((int((fConst33 - 1)) & 2047)); | |||
for (int i=0; i<2; i++) fRec28[i] = 0; | |||
fConst36 = floorf((0.5f + (0.256891f * iConst0))); | |||
fConst37 = ((0 - (6.907755278982138f * fConst36)) / iConst0); | |||
for (int i=0; i<2; i++) fRec35[i] = 0; | |||
for (int i=0; i<2; i++) fRec34[i] = 0; | |||
for (int i=0; i<16384; i++) fVec12[i] = 0; | |||
fConst38 = floorf((0.5f + (0.027333f * iConst0))); | |||
iConst39 = int((int((fConst36 - fConst38)) & 16383)); | |||
for (int i=0; i<2048; i++) fVec13[i] = 0; | |||
iConst40 = int((int((fConst38 - 1)) & 2047)); | |||
for (int i=0; i<2; i++) fRec32[i] = 0; | |||
fConst41 = floorf((0.5f + (0.219991f * iConst0))); | |||
fConst42 = ((0 - (6.907755278982138f * fConst41)) / iConst0); | |||
for (int i=0; i<2; i++) fRec39[i] = 0; | |||
for (int i=0; i<2; i++) fRec38[i] = 0; | |||
for (int i=0; i<16384; i++) fVec14[i] = 0; | |||
fConst43 = floorf((0.5f + (0.019123f * iConst0))); | |||
iConst44 = int((int((fConst41 - fConst43)) & 16383)); | |||
for (int i=0; i<1024; i++) fVec15[i] = 0; | |||
iConst45 = int((int((fConst43 - 1)) & 1023)); | |||
for (int i=0; i<2; i++) fRec36[i] = 0; | |||
for (int i=0; i<3; i++) fRec0[i] = 0; | |||
for (int i=0; i<3; i++) fRec1[i] = 0; | |||
for (int i=0; i<3; i++) fRec2[i] = 0; | |||
for (int i=0; i<3; i++) fRec3[i] = 0; | |||
for (int i=0; i<3; i++) fRec4[i] = 0; | |||
for (int i=0; i<3; i++) fRec5[i] = 0; | |||
for (int i=0; i<3; i++) fRec6[i] = 0; | |||
for (int i=0; i<3; i++) fRec7[i] = 0; | |||
} | |||
}; | |||
#endif // OPENAV_DSP_REVERB_H |
@@ -0,0 +1,28 @@ | |||
/* | |||
* Author: Harry van Haaren 2013 | |||
* harryhaaren@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., 51 Franklin Street, Fifth Floor, Boston, | |||
* MA 02110-1301, USA. | |||
*/ | |||
#ifndef ROOMY_AVTK | |||
#define ROOMY_AVTK | |||
#include "../../avtk/dial.h" | |||
#include "../../avtk/image.h" | |||
#include "../../avtk/reverb.h" | |||
#endif |
@@ -0,0 +1,652 @@ | |||
/* GIMP RGBA C-Source image dump (header.c) */ | |||
static const struct { | |||
unsigned int width; | |||
unsigned int height; | |||
unsigned int bytes_per_pixel; /* 2:RGB16, 3:RGB, 4:RGBA */ | |||
unsigned char pixel_data[160 * 29 * 4 + 1]; | |||
} header = { | |||
160, 29, 4, | |||
"000\377000\377000\377000\377000\377000\377000\377000\377000\377000\37700" | |||
"0\377000\377000\377000\377000\377000\377000\377000\377000\377000\377000\377" | |||
"000\377000\377000\377000\377000\377000\377000\377000\377000\377000\37700" | |||
"0\377000\377000\377000\377000\377000\377000\377000\377000\377000\377000\377" | |||
"000\377000\377000\377000\377000\377000\377000\377000\377000\377000\37700" | |||
"0\377000\377000\377000\377000\377000\377000\377000\377000\377000\377000\377" | |||
"000\377000\377000\377000\377000\377000\377000\377000\377000\377000\37700" | |||
"0\377000\377000\377000\377000\377000\377000\377000\377000\377000\377000\377" | |||
"000\377000\377000\377000\377000\377000\377000\377000\377000\377000\37700" | |||
"0\377000\377000\377000\377000\377000\377000\377000\377000\377000\377000\377" | |||
"000\377000\377000\377000\377000\377000\377000\377000\377000\377000\37700" | |||
"0\377000\377000\377000\377000\377000\377000\377000\377000\377000\377000\377" | |||
"000\377000\377000\377000\377000\377000\377000\377000\377000\377000\37700" | |||
"0\377000\377000\377000\377000\377000\377000\377000\377000\377000\377000\377" | |||
"000\377000\377000\377000\377000\377000\377000\377000\377000\377000\37700" | |||
"0\377000\377000\377///\377///\377///\377///\377///\377///\377///\377///\377" | |||
"///\377///\377///\377///\377///\377///\377///\377///\377///\377///\377//" | |||
"/\377///\377///\377///\377///\377///\377///\377///\377///\377///\377///\377" | |||
"///\377///\377///\377///\377///\377///\377///\377///\377///\377///\377//" | |||
"/\377///\377///\377///\377///\377///\377///\377///\377///\377///\377///\377" | |||
"///\377///\377///\377///\377///\377///\377///\377///\377///\377///\377//" | |||
"/\377///\377///\377///\377///\377///\377///\377///\377///\377///\377///\377" | |||
"///\377///\377///\377///\377///\377///\377///\377///\377///\377///\377//" | |||
"/\377///\377///\377///\377///\377///\377///\377///\377///\377///\377///\377" | |||
"///\377///\377///\377///\377///\377///\377///\377///\377///\377///\377//" | |||
"/\377///\377///\377///\377///\377///\377///\377///\377///\377///\377///\377" | |||
"///\377///\377///\377///\377///\377///\377///\377///\377///\377///\377//" | |||
"/\377///\377///\377///\377///\377///\377///\377///\377///\377///\377///\377" | |||
"///\377///\377///\377///\377///\377///\377///\377///\377///\377///\377//" | |||
"/\377///\377///\377///\377///\377///\377///\377///\377///\377///\377///\377" | |||
"///\377///\377///\377///\377///\377...\377...\377...\377...\377...\377.." | |||
".\377...\377...\377...\377...\377...\377...\377...\377...\377...\377...\377" | |||
"...\377...\377...\377...\377...\377...\377...\377...\377...\377...\377.." | |||
".\377...\377...\377...\377...\377...\377...\377...\377...\377...\377...\377" | |||
"...\377...\377...\377...\377...\377...\377...\377...\377...\377...\377.." | |||
".\377...\377...\377...\377...\377...\377...\377...\377...\377...\377...\377" | |||
"...\377...\377...\377...\377...\377...\377...\377...\377...\377...\377.." | |||
".\377...\377...\377...\377...\377...\377...\377...\377...\377...\377...\377" | |||
"...\377...\377...\377...\377...\377...\377...\377...\377...\377...\377.." | |||
".\377...\377...\377...\377...\377...\377...\377...\377...\377...\377...\377" | |||
"...\377...\377...\377...\377...\377...\377...\377...\377...\377...\377.." | |||
".\377...\377...\377...\377...\377...\377...\377...\377...\377...\377...\377" | |||
"...\377...\377...\377...\377...\377...\377...\377...\377...\377...\377.." | |||
".\377...\377...\377...\377...\377...\377...\377...\377...\377...\377...\377" | |||
"...\377...\377...\377...\377...\377...\377...\377...\377...\377...\377.." | |||
".\377...\377...\377...\377...\377...\377...\377...\377---\377---\377---\377" | |||
"---\377---\377---\377---\377---\377---\377---\377---\377---\377---\377--" | |||
"-\377---\377---\377---\377---\377---\377---\377---\377---\377---\377---\377" | |||
"---\377---\377---\377---\377---\377---\377---\377---\377---\377---\377--" | |||
"-\377---\377---\377---\377---\377---\377---\377---\377---\377---\377---\377" | |||
"---\377---\377---\377---\377---\377---\377---\377---\377---\377---\377--" | |||
"-\377---\377---\377---\377---\377---\377---\377---\377---\377---\377---\377" | |||
"---\377---\377---\377---\377---\377---\377---\377---\377---\377---\377--" | |||
"-\377---\377---\377---\377---\377---\377---\377---\377---\377---\377---\377" | |||
"---\377---\377---\377---\377---\377---\377---\377---\377---\377---\377--" | |||
"-\377---\377---\377---\377---\377---\377---\377---\377---\377---\377---\377" | |||
"---\377---\377---\377---\377---\377---\377---\377---\377---\377---\377--" | |||
"-\377---\377---\377---\377---\377---\377---\377---\377---\377---\377---\377" | |||
"---\377---\377---\377---\377---\377---\377---\377---\377---\377---\377--" | |||
"-\377---\377---\377---\377---\377---\377---\377---\377---\377---\377---\377" | |||
"---\377---\377---\377---\377---\377---\377---\377---\377---\377---\377,," | |||
",\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377" | |||
",,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,," | |||
",\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377" | |||
",,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,," | |||
",\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377" | |||
",,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,," | |||
",\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377" | |||
",,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,," | |||
",\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377" | |||
",,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,," | |||
",\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377" | |||
",,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,," | |||
",\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377" | |||
",,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,," | |||
",\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377,,,\377" | |||
",,,\377,,,\377+++\377+*+\377+++\377+++\377*++\377+++\377+++\377+++\377*+" | |||
"+\377+++\377+++\377+*+\377*++\377**+\377+*+\377+*+\377+*+\377*++\377++*\377" | |||
"+*+\377+*+\377*++\377++*\377++*\377+++\377*++\377*++\377++*\377++*\377++" | |||
"+\377+*+\377+++\377+++\377+++\377++*\377+++\377*+*\377*+*\377+++\377+++\377" | |||
"**+\377++*\377++*\377+*+\377+++\377+*+\377+*+\377+++\377*+*\377+++\377++" | |||
"*\377*+*\377+*+\377*++\377+**\377**+\377+++\377+**\377+++\377+*+\377+++\377" | |||
"++*\377+*+\377++*\377*++\377++*\377**+\377*+*\377+**\377++*\377+**\377++" | |||
"*\377++*\377+++\377*++\377++*\377*++\377*++\377++*\377+*+\377*++\377**+\377" | |||
"+*+\377+++\377++*\377++*\377+++\377+++\377*+*\377+*+\377++*\377+++\377++" | |||
"+\377***\377+++\377+*+\377*++\377*++\377+**\377*++\377+++\377+++\377*+*\377" | |||
"**+\377+*+\377+*+\377*+*\377+*+\377+*+\377*++\377+++\377***\377+++\377*+" | |||
"+\377+++\377+++\377+*+\377++*\377+*+\377*+*\377+++\377+++\377+*+\377+*+\377" | |||
"+*+\377+**\377***\377+++\377++*\377++*\377+*+\377*++\377**+\377+++\377++" | |||
"+\377+++\377*+*\377+**\377*+*\377+*+\377+++\377++*\377+*+\377++*\377++*\377" | |||
"+**\377**+\377*++\377+++\377*++\377+++\377+++\377+++\377+*+\377+++\377++" | |||
"+\377++*\377++*\377+++\377++*\377)))\377)))\377)))\377)))\377)))\377)))\377" | |||
")))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377))" | |||
")\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377" | |||
")))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377))" | |||
")\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377" | |||
")))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377))" | |||
")\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377" | |||
")))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377))" | |||
")\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377" | |||
")))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377))" | |||
")\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377" | |||
")))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377))" | |||
")\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377" | |||
")))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377))" | |||
")\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377)))\377" | |||
")))\377)))\377)))\377)))\377)))\377)))\377)))\377(((\377(((\377(((\377((" | |||
"(\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377" | |||
"(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377((" | |||
"(\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377" | |||
"(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377((" | |||
"(\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377" | |||
"(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377((" | |||
"(\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377" | |||
"(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377((" | |||
"(\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377" | |||
"(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377((" | |||
"(\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377" | |||
"(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377((" | |||
"(\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377" | |||
"(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377((" | |||
"(\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377(((\377'''\377" | |||
"'''\377'''\377'''\377'''\377'''\377'''\377'''\377'''\377'''\377'''\377''" | |||
"'\377'''\377'''\377'''\377'''\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\374f\0\377z?\27\377'''\377'''\377'''\377''" | |||
"'\377'''\377'''\377'''\377'''\377'''\377'''\377'''\377'''\377'''\377'''\377" | |||
"\226H\22\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h" | |||
"\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377'''\377'''\377'''\377'''\377'''\377'''\377'''\377'" | |||
"''\377\226H\22\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377'''\377'''\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\232I\22\377'''\377" | |||
"'''\377'''\377'''\377'''\377'''\377'''\377'''\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377'''\377'''\377'''\377" | |||
"'''\377'''\377'''\377'''\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377'''\377'''\377'''\377'''\377'''\377'''\377" | |||
"'''\377'''\377'''\377'''\377'''\377'''\377'''\377'''\377'''\377'''\377''" | |||
"'\377&&&\377&&&\377&&&\377&&&\377&&&\377&&&\377&&&\377&&&\377&&&\377&&&\377" | |||
"&&&\377&&&\377&&&\377&&&\377&&&\377&&&\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\206B\25\377&" | |||
"&&\377&&&\377&&&\377&&&\377&&&\377&&&\377&&&\377&&&\377&&&\377&&&\377&&&" | |||
"\377&&&\377\235J\20\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h" | |||
"\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377&&&\377&&&\377&&&\377&&&\377" | |||
"&&&\377&&&\377&&&\377\235J\20\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377&&&\377&&&\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\251M\16\377'&%\377&&&\377&&&\377&&&\377&&&\377&&&\377" | |||
"&&&\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377&&&\377&&&\377&&&\377&&&\377&&&\377&&&\377&&&\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377&&&\377&&&" | |||
"\377&&&\377&&&\377&&&\377&&&\377&&&\377&&&\377&&&\377&&&\377&&&\377&&&\377" | |||
"&&&\377&&&\377&&&\377&&&\377&&&\377%%%\377%%%\377%%%\377%%%\377%%%\377%%" | |||
"%\377%%%\377%%%\377%%%\377%%%\377%%%\377%%%\377%%%\377%%%\377%%%\377%%%\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\224F\21\377%%%\377%%%\377%%%\377%%%\377%%%" | |||
"\377%%%\377%%%\377%%%\377%%%\377%$$\377\243L\17\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377%%%\377%%%\377%%%\377%%%\377%%%\377%$$\377\243L\17\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377%%%\377%%%\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\270" | |||
"R\13\377*&#\377%%%\377%%%\377%%%\377%%%\377%%%\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377%%%\377%%%\377%%%" | |||
"\377%%%\377%%%\377%%%\377%%%\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377%%%\377%%%\377%%%\377%%%\377%%%\377" | |||
"%%%\377%%%\377%%%\377%%%\377%%%\377%%%\377%%%\377%%%\377%%%\377%%%\377%%" | |||
"%\377%%%\377$$$\377$$$\377$$$\377$$$\377$$$\377$$$\377$$$\377$$$\377$$$\377" | |||
"$$$\377$$$\377$$$\377$$$\377$$$\377$$$\377$$$\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\241J\17\377$##\377$$$\377$$$\377$$$\377$$$\377$$$\377$$$" | |||
"\377%$#\377\253M\15\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h" | |||
"\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377$$$\377" | |||
"$$$\377$$$\377$$$\377%$#\377\253M\15\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377$$$\377$$$\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\304" | |||
"V\11\377-&\"\377$$$\377$$$\377$$$\377$$$\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377$$$\377$$$\377$$$\377$$$" | |||
"\377$$$\377$$$\377$$$\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377$$$\377$$$\377$$$\377$$$\377$$$\377$$$\377$" | |||
"$$\377$$$\377$$$\377$$$\377$$$\377$$$\377$$$\377$$$\377$$$\377$$$\377$$$" | |||
"\377###\377###\377###\377###\377###\377###\377###\377###\377###\377###\377" | |||
"###\377###\377###\377###\377###\377###\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\256N\14\377%$\"\377###\377###\377###\377###\377%$\"\377" | |||
"\261O\14\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h" | |||
"\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377###\377" | |||
"###\377###\377%$\"\377\261O\14\377\377h\0\377\377h\0\377\377h\0\377\377h" | |||
"\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377###\377###\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\320X\7\3772'\40\377###\377###\377###\377\377h\0\377\377h" | |||
"\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377###\377###\377" | |||
"###\377###\377###\377###\377###\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377###\377###\377###\377###\377###\377" | |||
"###\377###\377###\377###\377###\377###\377###\377###\377###\377###\377##" | |||
"#\377###\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377" | |||
"\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"" | |||
"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"" | |||
"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"!!\377" | |||
"\241J\16\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h" | |||
"\0\377\272Q\12\377(#\40\377\"\"\"\377\"\"\"\377&\"!\377\270Q\12\377\377h" | |||
"\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\374f\0\377}?\23\377\"" | |||
"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377#\"!\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\"\"\"\377\"\"\"\377&" | |||
"\"!\377\270Q\12\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\374f\0\377}?\23\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377#\"!\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\"\"\"\377\"\"\"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377" | |||
"\"\"\"\377\"\"\"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377" | |||
"\200?\23\377\375g\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h" | |||
"\0\377\332[\5\3779(\36\377\"\"\"\377\"\"\"\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\"\"\"\377\"\"\"\377\"" | |||
"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\"\"\"\377\"\"\"\377\"" | |||
"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"" | |||
"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"" | |||
"\377!!!\377\40!!\377\40!!\377!!\40\377!\40!\377\40!!\377\40!!\377\40!!\377" | |||
"!\40!\377!!!\377!\40!\377\40!!\377!!\40\377\40!!\377\40!!\377!!!\377\226" | |||
"E\17\377\226E\17\377\226E\17\377\226E\17\377\226E\16\377\226E\17\377\226" | |||
"E\16\377\226E\17\377\226E\17\377\226E\17\377\226E\16\377\226E\17\377\226" | |||
"E\17\377\351`\3\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\257M\13\377\40!\40\377!!!\377\275S\11\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\373g\0\377m9\24\377\40!\40\377!!!\377!" | |||
"\40!\377\40\40!\377!!\40\377(#\36\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377!!!\377!\40\40\377\275S\11\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\373g\0\377m9\24\377!" | |||
"!!\377!!!\377!!\40\377\40!\40\377!!!\377'#\37\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377!!\40\377\40!\40\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"!!\40\377!!\40\377!\40!\377!!!\377!!!\377!!!\377!!!\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377!\40!\377!\40" | |||
"!\377!\40\40\377!!!\377!!!\377!!!\377o9\25\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\344_\3\377!!\40\377!!!\377\377h" | |||
"\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377!!!\377!!\40\377!!!\377!\40!\377!\40!\377!!!\377!!\40\377!!!\377\40" | |||
"!\40\377!!!\377\40!\40\377\40!!\377!!!\377\40\40!\377!!!\377!!!\377!!!\377" | |||
"\37\37\37\377\37\37\37\377\37\37\37\377\37\37\37\377\37\37\37\377\37\37\37" | |||
"\377\37\37\37\377\37\37\37\377\37\37\37\377\37\37\37\377\37\37\37\377\37" | |||
"\37\37\377\37\37\37\377\37\37\37\377\37\37\37\377\37\37\37\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\312V\7\377" | |||
"\37\37\37\377\37\37\37\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\356b\2\377\37\37\37\377\37\37\37\377\37\37\37\377\37\37" | |||
"\37\377\37\37\37\377\37\37\37\377-#\34\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\37\37\37\377\37\37\37\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\356b\2\377" | |||
"\37\37\37\377\37\37\37\377\37\37\37\377\37\37\37\377\37\37\37\377\37\37\37" | |||
"\377-#\34\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\37\37\37\377\37\37\37\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\37\37\37\377\37\37\37\377" | |||
"\37\37\37\377\37\37\37\377\37\37\37\377\37\37\37\377\37\37\37\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\37" | |||
"\37\37\377\37\37\37\377\37\37\37\377\37\37\37\377\37\37\37\377\37\37\37\377" | |||
"\37\37\37\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\37\37\37\377\37\37\37\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\37\37\37\377\37\37" | |||
"\37\377\37\37\37\377\37\37\37\377\37\37\37\377\37\37\37\377\37\37\37\377" | |||
"\37\37\37\377\37\37\37\377\37\37\37\377\37\37\37\377\37\37\37\377\37\37\37" | |||
"\377\37\37\37\377\37\37\37\377\37\37\37\377\37\37\37\377\36\36\36\377\36" | |||
"\36\36\377\36\36\36\377\36\36\36\377\36\36\36\377\36\36\36\377\36\36\36\377" | |||
"\36\36\36\377\36\36\36\377\36\36\36\377\36\36\36\377\36\36\36\377\36\36\36" | |||
"\377\36\36\36\377\36\36\36\377\36\36\36\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\312V\6\377\36\36\36\377\36\36" | |||
"\36\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\360c\1\377\36\36\36\377\36\36\36\377\36\36\36\377\36\36\36\377\36\36\36" | |||
"\377\36\36\36\3771#\33\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\36\36\36\377\36\36\36\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\360c\1\377\36\36\36\377" | |||
"\36\36\36\377\36\36\36\377\36\36\36\377\36\36\36\377\36\36\36\3771#\33\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\36\36\36\377\36\36\36\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\36\36\36\377\36\36\36\377\36\36\36\377" | |||
"\36\36\36\377\36\36\36\377\36\36\36\377\36\36\36\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\36\36\36\377\36\36" | |||
"\36\377\36\36\36\377\36\36\36\377\36\36\36\377\36\36\36\377\36\36\36\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\36\36\36\377\36\36\36\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\36\36\36\377\36\36\36\377\36\36" | |||
"\36\377\36\36\36\377\36\36\36\377\36\36\36\377\36\36\36\377\36\36\36\377" | |||
"\36\36\36\377\36\36\36\377\36\36\36\377\36\36\36\377\36\36\36\377\36\36\36" | |||
"\377\36\36\36\377\36\36\36\377\36\36\36\377\35\35\35\377\35\35\35\377\35" | |||
"\35\35\377\35\35\35\377\35\35\35\377\35\35\35\377\35\35\35\377\35\35\35\377" | |||
"\35\35\35\377\35\35\35\377\35\35\35\377\35\35\35\377\35\35\35\377\35\35\35" | |||
"\377\35\35\35\377\35\35\35\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\311U\6\377\35\35\35\377\35\35\35\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\364d\1\377\35" | |||
"\35\35\377\35\35\35\377\35\35\35\377\35\35\35\377\35\35\35\377\35\35\35\377" | |||
"6%\31\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\35\35\35\377\35\35\35\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\364d\1\377\35\35\35\377\35\35\35\377\35\35" | |||
"\35\377\35\35\35\377\35\35\35\377\35\35\35\3776%\31\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\35\35\35\377" | |||
"\35\35\35\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\35\35\35\377\35\35\35\377\35\35\35\377\35\35\35\377\35" | |||
"\35\35\377\35\35\35\377\35\35\35\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\35\35\35\377\35\35\35\377\35\35" | |||
"\35\377\35\35\35\377\35\35\35\377\35\35\35\377\35\35\35\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\35\35\35\377" | |||
"\35\35\35\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\35\35\35\377\35\35\35\377\35\35\35\377\35\35\35" | |||
"\377\35\35\35\377\35\35\35\377\35\35\35\377\35\35\35\377\35\35\35\377\35" | |||
"\35\35\377\35\35\35\377\35\35\35\377\35\35\35\377\35\35\35\377\35\35\35\377" | |||
"\35\35\35\377\35\35\35\377\34\34\34\377\34\34\34\377\34\34\34\377\34\34\34" | |||
"\377\34\34\34\377\34\34\34\377\34\34\34\377\34\34\34\377\34\34\34\377\34" | |||
"\34\34\377\34\34\34\377\34\34\34\377\34\34\34\377\34\34\34\377\34\34\34\377" | |||
"\34\34\34\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\311U\6\377\34\34\34\377\34\34\34\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\366e\0\377\34\34\34\377\34\34" | |||
"\34\377\34\34\34\377\34\34\34\377\34\34\34\377\34\34\34\377;&\30\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\34\34\34\377\34\34\34\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\366e\0\377\34\34\34\377\34\34\34\377\34\34\34\377\34\34" | |||
"\34\377\34\34\34\377\34\34\34\377;&\30\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\34\34\34\377\34\34\34\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\34\34\34\377\34\34\34\377\34\34\34\377\34\34\34\377\34\34\34\377\34\34\34" | |||
"\377\34\34\34\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\34\34\34\377\34\34\34\377\34\34\34\377\34\34\34\377" | |||
"\34\34\34\377\34\34\34\377\34\34\34\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\34\34\34\377\34\34\34\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\34\34\34\377\34\34\34\377\34\34\34\377\34\34\34\377\34\34\34\377" | |||
"\34\34\34\377\34\34\34\377\34\34\34\377\34\34\34\377\34\34\34\377\34\34\34" | |||
"\377\34\34\34\377\34\34\34\377\34\34\34\377\34\34\34\377\34\34\34\377\34" | |||
"\34\34\377\33\33\33\377\33\33\33\377\33\33\33\377\33\33\33\377\33\33\33\377" | |||
"\33\33\33\377\33\33\33\377\33\33\33\377\33\33\33\377\33\33\33\377\33\33\33" | |||
"\377\33\33\33\377\33\33\33\377\33\33\33\377\33\33\33\377\33\33\33\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\236G\13\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h" | |||
"\0\377\225D\14\377+\40\30\377+\40\30\377+\40\30\377+\40\30\377+\40\30\377" | |||
"'\37\31\377\33\33\33\377\33\33\33\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\371f\0\377\33\33\33\377\33\33\33\377\33\33" | |||
"\33\377\33\33\33\377\33\33\33\377\33\33\33\377\225D\14\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\274Q\7\377\33\33\33\377" | |||
"\33\33\33\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\371f\0\377\33\33\33\377\33\33\33\377\33\33\33\377\33\33\33\377\33" | |||
"\33\33\377\33\33\33\377\225D\14\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\274Q\7\377\33\33\33\377\33\33\33\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\33" | |||
"\33\33\377\33\33\33\377\33\33\33\377\33\33\33\377\33\33\33\377\33\33\33\377" | |||
"\33\33\33\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\33\33\33\377\33\33\33\377\33\33\33\377\33\33\33\377\33" | |||
"\33\33\377\33\33\33\377\33\33\33\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\33\33\33\377\33\33\33\377\33\33" | |||
"\33\377\33\33\33\377\33\33\33\377\33\33\33\377\33\33\33\377\33\33\33\377" | |||
"\33\33\33\377\33\33\33\377\33\33\33\377\33\33\33\377\33\33\33\377\33\33\33" | |||
"\377\33\33\33\377\221B\14\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\274Q\7\377\33\33\33\377\33\33\33\377\33\33\33\377" | |||
"\33\33\33\377\33\33\33\377\33\33\33\377\33\33\33\377\33\33\33\377\33\33\33" | |||
"\377\33\33\33\377\33\33\33\377\33\33\33\377\33\33\33\377\33\33\33\377\33" | |||
"\33\33\377\33\33\33\377\33\33\33\377\32\32\32\377\32\32\32\377\32\32\32\377" | |||
"\32\32\32\377\32\32\32\377\32\32\32\377\32\32\32\377\32\32\32\377\32\32\32" | |||
"\377\32\32\32\377\32\32\32\377\32\32\32\377\32\32\32\377\32\32\32\377\32" | |||
"\32\32\377\32\32\32\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h" | |||
"\0\377\377h\0\377\377h\0\377\32\31\31\377\241H\12\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\177;\16\377\32\32\32\377\32" | |||
"\32\32\377\32\32\32\377\32\32\32\377\32\32\32\377\32\32\32\377\32\32\32\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\375g\0" | |||
"\377\32\32\32\377\32\32\32\377\32\32\32\377\32\32\32\377\32\32\32\377\225" | |||
"C\13\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\264N\10\377\36\33\31\377\32\32\32\377\32\32\32\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\375g\0\377\32\32\32\377\32\32" | |||
"\32\377\32\32\32\377\32\32\32\377\32\32\32\377\225C\13\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\264N\10\377\36\33\31" | |||
"\377\32\32\32\377\32\32\32\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\32\32\32\377\32\32\32\377\32\32\32\377" | |||
"\32\32\32\377\32\32\32\377\32\32\32\377\32\32\32\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\32\32\32\377\32\32" | |||
"\32\377\32\32\32\377\32\32\32\377\32\32\32\377\32\32\32\377\32\32\32\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\32\32\32\377\32\32\32\377\32\32\32\377\32\32\32\377\32\32\32\377\32" | |||
"\32\32\377\32\32\32\377\32\32\32\377\32\32\32\377\32\32\32\377\32\32\32\377" | |||
"\32\32\32\377\32\32\32\377\32\32\32\377\224C\14\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\264N\10\377\36\33\31\377\32" | |||
"\32\32\377\32\32\32\377\32\32\32\377\32\32\32\377\32\32\32\377\32\32\32\377" | |||
"\32\32\32\377\32\32\32\377\32\32\32\377\32\32\32\377\32\32\32\377\32\32\32" | |||
"\377\32\32\32\377\32\32\32\377\32\32\32\377\32\32\32\377\32\32\32\377\31" | |||
"\31\31\377\31\31\31\377\31\31\31\377\31\31\31\377\31\31\31\377\31\31\31\377" | |||
"\31\31\31\377\31\31\31\377\31\31\31\377\31\31\31\377\31\31\31\377\31\31\31" | |||
"\377\31\31\31\377\31\31\31\377\31\31\31\377\31\31\31\377\377h\0\377\377h" | |||
"\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\31\31\31\377" | |||
"\31\30\30\377\243H\11\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377|:\16\377\31\31\31\377\31\31\31\377\31\31\31\377\31\31" | |||
"\31\377\31\31\31\377\31\31\31\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\256L\10\377\33\32\30\377\31\31\31\377\31\31\31\377\31\31\31\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\256L\10\377\33\32\30" | |||
"\377\31\31\31\377\31\31\31\377\31\31\31\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\31\31\31\377\31\31\31\377" | |||
"\31\31\31\377\31\31\31\377\31\31\31\377\31\31\31\377\31\31\31\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\31" | |||
"\31\31\377\31\31\31\377\31\31\31\377\31\31\31\377\31\31\31\377\31\31\31\377" | |||
"\31\31\31\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\31\31\31\377\31\31\31\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\256L\10\377\33\32\30\377\31\31\31\377\31\31\31\377" | |||
"\31\31\31\377\31\31\31\377\31\31\31\377\31\31\31\377\31\31\31\377\31\31\31" | |||
"\377\31\31\31\377\31\31\31\377\31\31\31\377\31\31\31\377\31\31\31\377\31" | |||
"\31\31\377\31\31\31\377\31\31\31\377\31\31\31\377\31\31\31\377\30\30\27\377" | |||
"\27\27\27\377\30\30\27\377\27\27\30\377\27\30\30\377\27\30\27\377\27\30\27" | |||
"\377\30\27\30\377\27\27\27\377\27\27\30\377\27\27\27\377\27\30\27\377\30" | |||
"\27\27\377\27\30\27\377\30\27\30\377\27\27\27\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\27\27\30\377\27\30\30" | |||
"\377\27\26\26\377\245H\11\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377w8\15\377\27\27\27\377\27\27\27\377\27\27\27\377\30" | |||
"\30\27\377\27\27\27\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h" | |||
"\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\246H\10" | |||
"\377\31\27\27\377\27\27\27\377\27\27\30\377\30\30\27\377\27\27\30\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\246H\10\377\31\27\27\377\30\27\27\377" | |||
"\27\27\27\377\30\30\27\377\27\30\30\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\30\27\30\377\30\27\27\377\27" | |||
"\30\30\377\27\27\27\377\30\30\27\377\27\27\27\377\30\30\27\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\27\27" | |||
"\27\377\27\27\30\377\27\27\27\377\27\27\30\377\27\27\30\377\27\27\27\377" | |||
"\30\30\27\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\30\30\30\377\27\30\27\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\246H\10\377\30\30\26\377\27\27\30\377\27\27\27\377\30\27\27\377" | |||
"\27\27\30\377\27\30\27\377\30\27\27\377\27\27\30\377\30\30\27\377\27\30\27" | |||
"\377\27\30\27\377\27\27\27\377\30\27\27\377\30\27\27\377\27\27\27\377\27" | |||
"\27\30\377\27\27\27\377\27\30\27\377\27\27\27\377\27\27\30\377\26\26\26\377" | |||
"\26\26\26\377\26\26\26\377\26\26\26\377\26\26\26\377\26\26\26\377\26\26\26" | |||
"\377\26\26\26\377\26\26\26\377\26\26\26\377\26\26\26\377\26\26\26\377\26" | |||
"\26\26\377\26\26\26\377\26\26\26\377\26\26\26\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\26\26\26\377\26\26\26" | |||
"\377\26\26\26\377\27\26\25\377\246I\10\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377t6\15\377\26\26\26\377\26\26\26\377\26\26" | |||
"\26\377\26\26\26\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\235E\11\377\26\25\25\377" | |||
"\26\26\26\377\26\26\26\377\26\26\26\377\26\26\26\377\26\26\26\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\235E\11\377\26\25\25\377\26\26\26\377\26\26\26\377" | |||
"\26\26\26\377\26\26\26\377\26\26\26\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\26\26\26\377\26\26\26\377\26" | |||
"\26\26\377\26\26\26\377\26\26\26\377\26\26\26\377\26\26\26\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\26\26" | |||
"\26\377\26\26\26\377\26\26\26\377\26\26\26\377\26\26\26\377\26\26\26\377" | |||
"\26\26\26\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\26\26\26\377\26\26\26\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\235E\11\377\26\25\25\377\26\26\26\377\26\26\26\377\26\26\26\377\26\26\26" | |||
"\377\26\26\26\377\26\26\26\377\26\26\26\377\26\26\26\377\26\26\26\377\26" | |||
"\26\26\377\26\26\26\377\26\26\26\377\26\26\26\377\26\26\26\377\26\26\26\377" | |||
"\26\26\26\377\26\26\26\377\26\26\26\377\26\26\26\377\26\26\26\377\25\25\25" | |||
"\377\25\25\25\377\25\25\25\377\25\25\25\377\25\25\25\377\25\25\25\377\25" | |||
"\25\25\377\25\25\25\377\25\25\25\377\25\25\25\377\25\25\25\377\25\25\25\377" | |||
"\25\25\25\377\25\25\25\377\25\25\25\377\25\25\25\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\25\25\25\377\25\25" | |||
"\25\377\25\25\25\377\25\25\25\377\26\25\24\377\251I\7\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\375g\0\377p5\14\377\25\25\25\377" | |||
"\25\25\25\377\25\25\25\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\225B\11\377\25\25\25\377\25" | |||
"\25\25\377\25\25\25\377\25\25\25\377\25\25\25\377\25\25\25\377\25\25\25\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\225B\11\377\25\25\25\377\25\25\25\377\25\25\25\377\25" | |||
"\25\25\377\25\25\25\377\25\25\25\377\25\25\25\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\25\25\25\377\25\25\25" | |||
"\377\25\25\25\377\25\25\25\377\25\25\25\377\25\25\25\377\25\25\25\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\25\25\25\377\25\25\25\377\25\25\25\377\25\25\25\377\25\25\25\377\25\25\25" | |||
"\377\25\25\25\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\25\25\25\377\25\25\25\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\225B\11" | |||
"\377\25\25\25\377\25\25\25\377\25\25\25\377\25\25\25\377\25\25\25\377\25" | |||
"\25\25\377\25\25\25\377\25\25\25\377\25\25\25\377\25\25\25\377\25\25\25\377" | |||
"\25\25\25\377\25\25\25\377\25\25\25\377\25\25\25\377\25\25\25\377\25\25\25" | |||
"\377\25\25\25\377\25\25\25\377\25\25\25\377\25\25\25\377\25\25\25\377\24" | |||
"\24\24\377\24\24\24\377\24\24\24\377\24\24\24\377\24\24\24\377\24\24\24\377" | |||
"\24\24\24\377\24\24\24\377\24\24\24\377\24\24\24\377\24\24\24\377\24\24\24" | |||
"\377\24\24\24\377\24\24\24\377\24\24\24\377\24\24\24\377\377h\0\377\377h" | |||
"\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\24\24\24\377" | |||
"\24\24\24\377\24\24\24\377\24\24\24\377\24\24\24\377\25\24\23\377\252I\7" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\375g\0\377m3" | |||
"\14\377\24\24\24\377\24\24\24\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\215>\11\377\24\24\24\377\24\24\24" | |||
"\377\24\24\24\377\24\24\24\377\24\24\24\377\24\24\24\377\24\24\24\377\24" | |||
"\24\24\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\215>\11\377\24\24\24\377\24\24\24\377\24\24\24\377\24" | |||
"\24\24\377\24\24\24\377\24\24\24\377\24\24\24\377\24\24\24\377\377h\0\377" | |||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\24\24" | |||
"\24\377\24\24\24\377\24\24\24\377\24\24\24\377\24\24\24\377\24\24\24\377" | |||
"\24\24\24\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\24\24\24\377\24\24\24\377\24\24\24\377\24\24\24\377\24" | |||
"\24\24\377\24\24\24\377\24\24\24\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\24\24\24\377\24\24\24\377\377h\0" | |||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||
"\215>\11\377\24\24\24\377\24\24\24\377\24\24\24\377\24\24\24\377\24\24\24" | |||
"\377\24\24\24\377\24\24\24\377\24\24\24\377\24\24\24\377\24\24\24\377\24" | |||
"\24\24\377\24\24\24\377\24\24\24\377\24\24\24\377\24\24\24\377\24\24\24\377" | |||
"\24\24\24\377\24\24\24\377\24\24\24\377\24\24\24\377\24\24\24\377\24\24\24" | |||
"\377\24\24\24\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23" | |||
"\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377" | |||
"\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23" | |||
"\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23" | |||
"\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377" | |||
"\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23" | |||
"\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23" | |||
"\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377" | |||
"\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23" | |||
"\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23" | |||
"\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377" | |||
"\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23" | |||
"\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23" | |||
"\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377" | |||
"\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23" | |||
"\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23" | |||
"\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377" | |||
"\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23" | |||
"\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23" | |||
"\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377" | |||
"\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23" | |||
"\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23" | |||
"\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377" | |||
"\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23" | |||
"\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23" | |||
"\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377" | |||
"\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23" | |||
"\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23\23\23\377\23" | |||
"\23\23\377\23\23\23\377\23\23\23\377\22\22\22\377\22\22\22\377\22\22\22\377" | |||
"\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22" | |||
"\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22" | |||
"\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377" | |||
"\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22" | |||
"\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22" | |||
"\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377" | |||
"\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22" | |||
"\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22" | |||
"\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377" | |||
"\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22" | |||
"\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22" | |||
"\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377" | |||
"\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22" | |||
"\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22" | |||
"\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377" | |||
"\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22" | |||
"\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22" | |||
"\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377" | |||
"\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22" | |||
"\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22" | |||
"\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377" | |||
"\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22" | |||
"\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22" | |||
"\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377" | |||
"\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22" | |||
"\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22" | |||
"\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377" | |||
"\22\22\22\377\22\22\22\377\22\22\22\377\22\22\22\377\21\21\21\377\21\21\21" | |||
"\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21" | |||
"\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377" | |||
"\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21" | |||
"\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21" | |||
"\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377" | |||
"\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21" | |||
"\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21" | |||
"\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377" | |||
"\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21" | |||
"\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21" | |||
"\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377" | |||
"\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21" | |||
"\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21" | |||
"\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377" | |||
"\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21" | |||
"\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21" | |||
"\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377" | |||
"\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21" | |||
"\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21" | |||
"\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377" | |||
"\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21" | |||
"\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21" | |||
"\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377" | |||
"\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21" | |||
"\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21" | |||
"\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377" | |||
"\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21" | |||
"\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377\21\21\21\377", | |||
}; | |||
@@ -0,0 +1,153 @@ | |||
// generated by Fast Light User Interface Designer (fluid) version 1.0300 | |||
#include "roomy_widget.h" | |||
START_NAMESPACE_DISTRHO | |||
void RoomyUI::cb_headerImage_i(Avtk::Image*, void*) { | |||
//system("xdg-open http://www.openavproductions.com/artyfx#ducka"); | |||
} | |||
void RoomyUI::cb_headerImage(Avtk::Image* o, void* v) { | |||
((RoomyUI*)(o->parent()->user_data()))->cb_headerImage_i(o,v); | |||
} | |||
void RoomyUI::cb_graph_i(Avtk::Reverb* o, void*) { | |||
//cutoff = o->value(); | |||
//float g = o->getGain(); | |||
//gainDial->value( g ); | |||
//freq->value( cutoff ); // update dial | |||
//writePort(CUTOFF_FREQ, cutoff); | |||
//writePort(CUTOFF_GAIN, g); | |||
} | |||
void RoomyUI::cb_graph(Avtk::Reverb* o, void* v) { | |||
((RoomyUI*)(o->parent()->user_data()))->cb_graph_i(o,v); | |||
} | |||
void RoomyUI::cb_time_i(Avtk::Dial* o, void*) { | |||
float tmp = o->value(); | |||
graph->size( tmp ); | |||
setHostParameter( 0, tmp ); | |||
} | |||
void RoomyUI::cb_time(Avtk::Dial* o, void* v) { | |||
((RoomyUI*)(o->parent()->user_data()))->cb_time_i(o,v); | |||
} | |||
void RoomyUI::cb_damping_i(Avtk::Dial* o, void*) { | |||
float tmp = o->value(); | |||
graph->damping( tmp ); | |||
setHostParameter( 1, tmp ); | |||
} | |||
void RoomyUI::cb_damping(Avtk::Dial* o, void* v) { | |||
((RoomyUI*)(o->parent()->user_data()))->cb_damping_i(o,v); | |||
} | |||
void RoomyUI::cb_dryWet_i(Avtk::Dial* o, void*) { | |||
float tmp = o->value(); | |||
graph->wet( tmp ); | |||
setHostParameter( 2, tmp ); | |||
} | |||
void RoomyUI::cb_dryWet(Avtk::Dial* o, void* v) { | |||
((RoomyUI*)(o->parent()->user_data()))->cb_dryWet_i(o,v); | |||
} | |||
/** | |||
if the type of filter changes, this function will highlight the right button | |||
*/ | |||
void RoomyUI::update_button(int button) { | |||
} | |||
RoomyUI::RoomyUI(UI* uic) : ui(uic) { | |||
{ Fl_Double_Window* o = window = new Fl_Double_Window(160, 220); | |||
window->user_data((void*)(this)); | |||
{ headerImage = new Avtk::Image(0, 0, 160, 29, "header.png"); | |||
headerImage->box(FL_NO_BOX); | |||
headerImage->color(FL_BACKGROUND_COLOR); | |||
headerImage->selection_color(FL_BACKGROUND_COLOR); | |||
headerImage->labeltype(FL_NORMAL_LABEL); | |||
headerImage->labelfont(0); | |||
headerImage->labelsize(14); | |||
headerImage->labelcolor((Fl_Color)20); | |||
headerImage->callback((Fl_Callback*)cb_headerImage); | |||
headerImage->align(Fl_Align(FL_ALIGN_CENTER)); | |||
headerImage->when(FL_WHEN_RELEASE_ALWAYS); | |||
headerImage->setPixbuf(header.pixel_data,4); | |||
} // Avtk::Image* headerImage | |||
{ graph = new Avtk::Reverb(5, 36, 150, 126, "graph"); | |||
graph->box(FL_UP_BOX); | |||
graph->color((Fl_Color)179); | |||
graph->selection_color(FL_INACTIVE_COLOR); | |||
graph->labeltype(FL_NO_LABEL); | |||
graph->labelfont(0); | |||
graph->labelsize(14); | |||
graph->labelcolor(FL_FOREGROUND_COLOR); | |||
graph->callback((Fl_Callback*)cb_graph); | |||
graph->align(Fl_Align(FL_ALIGN_BOTTOM)); | |||
graph->when(FL_WHEN_CHANGED); | |||
} // Avtk::Reverb* graph | |||
{ time = new Avtk::Dial(10, 169, 37, 37, "Time"); | |||
time->box(FL_NO_BOX); | |||
time->color((Fl_Color)90); | |||
time->selection_color(FL_INACTIVE_COLOR); | |||
time->labeltype(FL_NORMAL_LABEL); | |||
time->labelfont(0); | |||
time->labelsize(10); | |||
time->labelcolor(FL_FOREGROUND_COLOR); | |||
time->callback((Fl_Callback*)cb_time); | |||
time->align(Fl_Align(FL_ALIGN_BOTTOM)); | |||
time->when(FL_WHEN_CHANGED); | |||
} // Avtk::Dial* time | |||
{ damping = new Avtk::Dial(62, 169, 37, 37, "Damping"); | |||
damping->box(FL_NO_BOX); | |||
damping->color((Fl_Color)90); | |||
damping->selection_color(FL_INACTIVE_COLOR); | |||
damping->labeltype(FL_NORMAL_LABEL); | |||
damping->labelfont(0); | |||
damping->labelsize(10); | |||
damping->labelcolor(FL_FOREGROUND_COLOR); | |||
damping->callback((Fl_Callback*)cb_damping); | |||
damping->align(Fl_Align(FL_ALIGN_BOTTOM)); | |||
damping->when(FL_WHEN_CHANGED); | |||
} // Avtk::Dial* damping | |||
{ dryWet = new Avtk::Dial(113, 168, 37, 37, "Dry / Wet"); | |||
dryWet->box(FL_NO_BOX); | |||
dryWet->color((Fl_Color)90); | |||
dryWet->selection_color(FL_INACTIVE_COLOR); | |||
dryWet->labeltype(FL_NORMAL_LABEL); | |||
dryWet->labelfont(0); | |||
dryWet->labelsize(10); | |||
dryWet->labelcolor(FL_FOREGROUND_COLOR); | |||
dryWet->callback((Fl_Callback*)cb_dryWet); | |||
dryWet->align(Fl_Align(FL_ALIGN_BOTTOM)); | |||
dryWet->when(FL_WHEN_CHANGED); | |||
} // Avtk::Dial* dryWet | |||
window->color( fl_rgb_color( 17, 17, 17) ); | |||
close_cb(o, 0); | |||
window->end(); | |||
} // Fl_Double_Window* window | |||
} | |||
int RoomyUI::getWidth() { | |||
return window->w(); | |||
} | |||
int RoomyUI::getHeight() { | |||
return window->h(); | |||
} | |||
void RoomyUI::setHostParameter(uint32_t index, float value) { | |||
//cout << "port " << port << " value " << value << endl; | |||
ui->d_setParameterValue(index, value); | |||
} | |||
void close_cb(Fl_Widget* o, void*) { | |||
if ((Fl::event() == FL_KEYDOWN || Fl::event() == FL_SHORTCUT) && Fl::event_key() == FL_Escape) | |||
{ | |||
return; // ignore ESC | |||
} | |||
else | |||
{ | |||
o->hide(); | |||
} | |||
} | |||
END_NAMESPACE_DISTRHO |
@@ -0,0 +1,110 @@ | |||
# data file for the Fltk User Interface Designer (fluid) | |||
version 1.0300 | |||
header_name {.h} | |||
code_name {.cxx} | |||
class RoomyUI {open | |||
} { | |||
Function {update_button(int button)} { | |||
comment {if the type of filter changes, this function will highlight the right button} open return_type void | |||
} { | |||
code {} {} | |||
} | |||
Function {RoomyUI()} {open | |||
} { | |||
Fl_Window window {open selected | |||
xywh {1024 378 160 220} type Double | |||
code0 {\#include "lv2/lv2plug.in/ns/extensions/ui/ui.h"} | |||
code1 {window->color( fl_rgb_color( 17, 17, 17) );} | |||
code2 {close_cb(o, 0);} | |||
code3 {\#include "../dsp/roomy.hxx"} visible | |||
} { | |||
Fl_Box headerImage { | |||
label {header.png} | |||
callback {//system("xdg-open http://www.openavproductions.com/artyfx\#ducka");} | |||
xywh {0 0 160 29} labelcolor 20 when 6 | |||
code0 {\#include "avtk.h"} | |||
code1 {\#include <stdio.h>} | |||
code2 {\#include "header.c"} | |||
code3 {headerImage->setPixbuf(header.pixel_data,4);} | |||
class {Avtk::Image} | |||
} | |||
Fl_Dial graph { | |||
label graph | |||
callback {//cutoff = o->value(); | |||
//float g = o->getGain(); | |||
//gainDial->value( g ); | |||
//freq->value( cutoff ); // update dial | |||
//writePort(CUTOFF_FREQ, cutoff); | |||
//writePort(CUTOFF_GAIN, g);} | |||
xywh {5 36 150 126} box UP_BOX color 179 labeltype NO_LABEL | |||
code1 {using namespace std;} | |||
code2 {\#include <iostream>} | |||
class {Avtk::Reverb} | |||
} | |||
Fl_Dial time { | |||
label Time | |||
callback {float tmp = o->value(); | |||
graph->size( tmp ); | |||
writePort( int(ROOMY_TIME), tmp );} | |||
xywh {10 169 37 37} color 90 labelsize 10 | |||
class {Avtk::Dial} | |||
} | |||
Fl_Dial damping { | |||
label Damping | |||
callback {float tmp = o->value(); | |||
graph->damping( tmp ); | |||
writePort( int(ROOMY_DAMPING), tmp );} | |||
xywh {62 169 37 37} color 90 labelsize 10 | |||
class {Avtk::Dial} | |||
} | |||
Fl_Dial dryWet { | |||
label {Dry / Wet} | |||
callback {float tmp = o->value(); | |||
graph->wet( tmp ); | |||
writePort( int(ROOMY_DRY_WET),tmp );} | |||
xywh {113 168 37 37} color 90 labelsize 10 | |||
class {Avtk::Dial} | |||
} | |||
} | |||
} | |||
decl {LV2UI_Write_Function write_function;} {public local | |||
} | |||
decl {LV2UI_Controller controller;} {public local | |||
} | |||
Function {idle()} {open return_type void | |||
} { | |||
code {Fl::check(); | |||
Fl::flush();} {} | |||
} | |||
Function {getWidth()} {open return_type int | |||
} { | |||
code {return window->w();} {} | |||
} | |||
Function {getHeight()} {open return_type int | |||
} { | |||
code {return window->h();} {} | |||
} | |||
decl {float gain;} {private local | |||
} | |||
decl {float cutoff;} {private local | |||
} | |||
decl {float Q;} {private local | |||
} | |||
Function {writePort(int port, float& value)} {open | |||
} { | |||
code {//cout << "port " << port << " value " << value << endl; | |||
write_function(controller, port, sizeof(float), 0, &value);} {} | |||
} | |||
} | |||
Function {close_cb(Fl_Widget* o, void*)} {open | |||
} { | |||
code {if ((Fl::event() == FL_KEYDOWN || Fl::event() == FL_SHORTCUT) && Fl::event_key() == FL_Escape) | |||
{ | |||
return; // ignore ESC | |||
} | |||
else | |||
{ | |||
o->hide(); | |||
}} {} | |||
} |
@@ -0,0 +1,66 @@ | |||
// generated by Fast Light User Interface Designer (fluid) version 1.0300 | |||
#ifndef roomy_widget_h | |||
#define roomy_widget_h | |||
#include <FL/Fl.H> | |||
#include <FL/Fl_Double_Window.H> | |||
//#include "lv2/lv2plug.in/ns/extensions/ui/ui.h" | |||
//#include "../dsp/roomy.hxx" | |||
#include "DistrhoUI.hpp" | |||
#include "avtk.h" | |||
#include <stdio.h> | |||
#include "header.c" | |||
using namespace std; | |||
#include <iostream> | |||
// keep things inside the namespace to prevent issues with public symbols | |||
START_NAMESPACE_DISTRHO | |||
class RoomyUI { | |||
public: | |||
void update_button(int button); | |||
RoomyUI(UI* ui); | |||
Fl_Double_Window *window; | |||
Avtk::Image *headerImage; | |||
private: | |||
void cb_headerImage_i(Avtk::Image*, void*); | |||
static void cb_headerImage(Avtk::Image*, void*); | |||
public: | |||
Avtk::Reverb *graph; | |||
private: | |||
void cb_graph_i(Avtk::Reverb*, void*); | |||
static void cb_graph(Avtk::Reverb*, void*); | |||
public: | |||
Avtk::Dial *time; | |||
private: | |||
void cb_time_i(Avtk::Dial*, void*); | |||
static void cb_time(Avtk::Dial*, void*); | |||
public: | |||
Avtk::Dial *damping; | |||
private: | |||
void cb_damping_i(Avtk::Dial*, void*); | |||
static void cb_damping(Avtk::Dial*, void*); | |||
public: | |||
Avtk::Dial *dryWet; | |||
private: | |||
void cb_dryWet_i(Avtk::Dial*, void*); | |||
static void cb_dryWet(Avtk::Dial*, void*); | |||
public: | |||
int getWidth(); | |||
int getHeight(); | |||
private: | |||
UI* const ui; | |||
float gain; | |||
float cutoff; | |||
float Q; | |||
public: | |||
void setHostParameter(uint32_t index, float value); | |||
}; | |||
void close_cb(Fl_Widget* o, void*); | |||
END_NAMESPACE_DISTRHO | |||
#endif |