@@ -16,8 +16,6 @@ plugins: libs | |||||
$(MAKE) all -C plugins/Meters | $(MAKE) all -C plugins/Meters | ||||
$(MAKE) all -C plugins/Parameters | $(MAKE) all -C plugins/Parameters | ||||
$(MAKE) all -C plugins/States | $(MAKE) all -C plugins/States | ||||
#$(MAKE) all -C plugins/openav-ducka | |||||
#$(MAKE) all -C plugins/openav-roomy | |||||
gen: plugins dpf/utils/lv2_ttl_generator | gen: plugins dpf/utils/lv2_ttl_generator | ||||
@$(CURDIR)/dpf/utils/generate-ttl.sh | @$(CURDIR)/dpf/utils/generate-ttl.sh | ||||
@@ -37,8 +35,6 @@ clean: | |||||
$(MAKE) clean -C plugins/Meters | $(MAKE) clean -C plugins/Meters | ||||
$(MAKE) clean -C plugins/Parameters | $(MAKE) clean -C plugins/Parameters | ||||
$(MAKE) clean -C plugins/States | $(MAKE) clean -C plugins/States | ||||
#$(MAKE) clean -C plugins/openav-ducka | |||||
#$(MAKE) clean -C plugins/openav-roomy | |||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
@@ -1,7 +0,0 @@ | |||||
AVTK : | |||||
These files are AVTK widgets. | |||||
They're included in this repo for convinience. | |||||
Details on www.openavproductions.com/avtk |
@@ -1,349 +0,0 @@ | |||||
/* | |||||
* 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 |
@@ -1,183 +0,0 @@ | |||||
/* | |||||
* 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 |
@@ -1,356 +0,0 @@ | |||||
/* | |||||
* 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 |
@@ -1,113 +0,0 @@ | |||||
/* | |||||
* 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 | |||||
@@ -1,253 +0,0 @@ | |||||
/* | |||||
* 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 | |||||
@@ -1,284 +0,0 @@ | |||||
/* | |||||
* 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 |
@@ -1,221 +0,0 @@ | |||||
/* | |||||
* 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 | |||||
@@ -1,286 +0,0 @@ | |||||
/* | |||||
* 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 |
@@ -1,296 +0,0 @@ | |||||
/* | |||||
* 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 |
@@ -1,298 +0,0 @@ | |||||
/* | |||||
* 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" | |||||
START_NAMESPACE_DISTRHO | |||||
// ----------------------------------------------------------------------------------------------------------- | |||||
class ArtyFxPluginDucka : public Plugin | |||||
{ | |||||
public: | |||||
ArtyFxPluginDucka() | |||||
: Plugin(4, 0, 0), // 4 parameters, 0 programs, 0 states | |||||
// parameters init | |||||
controlThreshold(0.25f), | |||||
controlReduction(1.0f), | |||||
controlReleaseTime(0.5f), | |||||
controlSidechainAmp(0.0f), | |||||
// filter state init | |||||
w(10.0f / (d_getSampleRate() * 0.02)), | |||||
a(0.07f), | |||||
b(1.0f / (1.0f - a)), | |||||
g1(0.0f), | |||||
g2(0.0f), | |||||
samplerate( d_getSampleRate() ), | |||||
peakFrameCounter(0), | |||||
peakCountDuration( samplerate / 4 ), | |||||
currentTarget(0) | |||||
{ | |||||
} | |||||
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 "ducka"; | |||||
} | |||||
/** | |||||
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', 'd', 'k'); | |||||
} | |||||
/* -------------------------------------------------------------------------------------------------------- | |||||
* 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.min = 0.0f; | |||||
parameter.ranges.max = 1.0f; | |||||
switch (index) | |||||
{ | |||||
case 0: | |||||
parameter.name = "Threshold"; | |||||
parameter.symbol = "threshold"; | |||||
parameter.ranges.def = 0.25f; | |||||
break; | |||||
case 1: | |||||
parameter.name = "Reduction"; | |||||
parameter.symbol = "reduction"; | |||||
parameter.ranges.def = 1.0f; | |||||
break; | |||||
case 2: | |||||
parameter.name = "Release Time"; | |||||
parameter.symbol = "release_time"; | |||||
parameter.ranges.def = 0.5f; | |||||
break; | |||||
case 3: | |||||
parameter.hints |= kParameterIsOutput; | |||||
parameter.name = "Sidechain Amplitude"; | |||||
parameter.symbol = "sidechain_amp"; | |||||
parameter.ranges.def = 0.0f; | |||||
break; | |||||
} | |||||
} | |||||
/* -------------------------------------------------------------------------------------------------------- | |||||
* Internal data */ | |||||
/** | |||||
Get the current value of a parameter. | |||||
*/ | |||||
float d_getParameterValue(uint32_t index) const override | |||||
{ | |||||
switch (index) | |||||
{ | |||||
case 0: return controlThreshold; | |||||
case 1: return controlReduction; | |||||
case 2: return controlReleaseTime; | |||||
case 3: return controlSidechainAmp; | |||||
} | |||||
return 0.0f; | |||||
} | |||||
/** | |||||
Change a parameter value. | |||||
*/ | |||||
void d_setParameterValue(uint32_t index, float value) override | |||||
{ | |||||
switch (index) | |||||
{ | |||||
case 0: | |||||
controlThreshold = value; | |||||
break; | |||||
case 1: | |||||
controlReduction = value; | |||||
break; | |||||
case 2: | |||||
controlReleaseTime = value; | |||||
break; | |||||
} | |||||
// outputs can't be changed by the host | |||||
} | |||||
/* -------------------------------------------------------------------------------------------------------- | |||||
* Process */ | |||||
/** | |||||
Run/process function for plugins without MIDI input. | |||||
*/ | |||||
void d_run(const float** inputs, float** outputs, uint32_t frames) override | |||||
{ | |||||
const float* inL = inputs[0]; | |||||
const float* inR = inputs[1]; | |||||
const float* side = inputs[2]; | |||||
float* outL = outputs[0]; | |||||
float* outR = outputs[1]; | |||||
const TimePosition& timePos(d_getTimePosition()); | |||||
if (timePos.bbt.valid) | |||||
peakCountDuration = samplerate / ( timePos.bbt.beatsPerMinute / 60.0); | |||||
else | |||||
peakCountDuration = samplerate / 2.0f; | |||||
/// analyse sidechain input for peak | |||||
float sum = 0.f; | |||||
for( uint32_t i = 0; i < frames; i++ ) | |||||
{ | |||||
if ( *side > 0.000001 ) | |||||
sum += *side++; | |||||
else | |||||
sum += -*side++; | |||||
} | |||||
currentTarget = 0.f; | |||||
/// check for peak level (offset to avoid "always on" peak) | |||||
if ( sum / frames > controlThreshold + 0.05 ) | |||||
{ | |||||
peakFrameCounter = peakCountDuration * controlReleaseTime; | |||||
currentTarget = 1.f - controlReduction; | |||||
} | |||||
else if ( peakFrameCounter < 0 ) | |||||
{ | |||||
currentTarget = 1.f; | |||||
} | |||||
else | |||||
{ | |||||
currentTarget = 1.f - controlReduction; | |||||
} | |||||
if ( currentTarget < 0.f ) | |||||
currentTarget = 0.f; | |||||
peakFrameCounter -= frames; | |||||
for( uint32_t i = 0; i < frames; i++ ) | |||||
{ | |||||
/// smoothing algo is a lowpass, to de-zip the fades | |||||
/// x^^4 approximates linear volume increase for human ears | |||||
g1 += w * ( std::pow ( currentTarget, 4.f ) - g1 - a * g2 - 1e-20f); | |||||
g2 += w * (b * g1 - g2 + 1e-20f); | |||||
float gain = g2; | |||||
*outL++ = *inL++ * gain; | |||||
*outR++ = *inR++ * gain; | |||||
} | |||||
/// update output value | |||||
controlSidechainAmp = 1-currentTarget; | |||||
} | |||||
/* -------------------------------------------------------------------------------------------------------- | |||||
* 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 | |||||
{ | |||||
// reinit filter | |||||
w = 10.0f / (newSampleRate * 0.02); | |||||
a = 0.07f; | |||||
b = 1.0f / (1.0f - a); | |||||
g1 = 0.0f; | |||||
g2 = 0.0f; | |||||
samplerate = newSampleRate; | |||||
peakFrameCounter = 0; | |||||
peakCountDuration = samplerate / 4; | |||||
currentTarget = 0; | |||||
} | |||||
// ------------------------------------------------------------------------------------------------------- | |||||
private: | |||||
/// control signals | |||||
float controlThreshold; | |||||
float controlReduction; | |||||
float controlReleaseTime; | |||||
float controlSidechainAmp; | |||||
/// filter state | |||||
float w, a, b, g1, g2; | |||||
/// last peak history | |||||
long samplerate; | |||||
bool nowIsAPeak; | |||||
long peakFrameCounter; | |||||
/// nframes available for countdown | |||||
long peakCountDuration; | |||||
/// control output | |||||
float currentTarget; | |||||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ArtyFxPluginDucka) | |||||
}; | |||||
/* ------------------------------------------------------------------------------------------------------------ | |||||
* Plugin entry point, called by DPF to create a new plugin instance. */ | |||||
Plugin* createPlugin() | |||||
{ | |||||
return new ArtyFxPluginDucka(); | |||||
} | |||||
// ----------------------------------------------------------------------------------------------------------- | |||||
END_NAMESPACE_DISTRHO |
@@ -1,103 +0,0 @@ | |||||
/* | |||||
* 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/ducka_widget.cxx" | |||||
START_NAMESPACE_DISTRHO | |||||
// ----------------------------------------------------------------------------------------------------------- | |||||
class ArtyFxUiDucka : public UI | |||||
{ | |||||
public: | |||||
ArtyFxUiDucka() | |||||
: UI(), | |||||
fUI(this), | |||||
sidechainAmp(0.0f) | |||||
{ | |||||
// ntk method to add sub-window | |||||
add(fUI.window); | |||||
fUI.window->show(); | |||||
// start widgets on their default values | |||||
fUI.graph->threshold(0.25f); | |||||
fUI.graph->reduce(1.0f); | |||||
fUI.graph->release(0.5f); | |||||
fUI.threshold->value(0.25f); | |||||
fUI.drop->value(1.0f); | |||||
fUI.time->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->threshold( value ); | |||||
fUI.threshold->value( value ); | |||||
break; | |||||
case 1: | |||||
fUI.graph->reduce( value ); | |||||
fUI.drop->value( value ); | |||||
break; | |||||
case 2: | |||||
fUI.graph->release( value ); | |||||
fUI.time->value( value ); | |||||
break; | |||||
case 3: | |||||
/// only update when value changes? | |||||
if ( sidechainAmp > value + 0.1 || sidechainAmp < value - 0.1) | |||||
{ | |||||
fUI.graph->sidechain( value ); | |||||
sidechainAmp = value; | |||||
} | |||||
break; | |||||
} | |||||
} | |||||
// ------------------------------------------------------------------------------------------------------- | |||||
private: | |||||
DuckaUI fUI; | |||||
float sidechainAmp; | |||||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ArtyFxUiDucka) | |||||
}; | |||||
/* ------------------------------------------------------------------------------------------------------------ | |||||
* UI entry point, called by DPF to create a new UI instance. */ | |||||
UI* createUI() | |||||
{ | |||||
return new ArtyFxUiDucka(); | |||||
} | |||||
// ----------------------------------------------------------------------------------------------------------- | |||||
END_NAMESPACE_DISTRHO |
@@ -1,39 +0,0 @@ | |||||
/* | |||||
* 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 "Ducka" | |||||
#define DISTRHO_PLUGIN_HAS_UI 1 | |||||
#define DISTRHO_PLUGIN_IS_RT_SAFE 1 | |||||
#define DISTRHO_PLUGIN_IS_SYNTH 0 | |||||
#define DISTRHO_PLUGIN_NUM_INPUTS 3 | |||||
#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 1 | |||||
#define DISTRHO_PLUGIN_URI "http://www.openavproductions.com/artyfx#ducka" | |||||
#define DISTRHO_UI_URI "http://www.openavproductions.com/artyfx#ducka/gui" | |||||
#define DISTRHO_UI_USE_NTK 1 | |||||
#endif // DISTRHO_PLUGIN_INFO_H_INCLUDED |
@@ -1,35 +0,0 @@ | |||||
#!/usr/bin/make -f | |||||
# Makefile for DISTRHO Plugins # | |||||
# ---------------------------- # | |||||
# Created by falkTX | |||||
# | |||||
# -------------------------------------------------------------- | |||||
# Project name, used for binaries | |||||
NAME = ducka | |||||
# -------------------------------------------------------------- | |||||
# Files to build | |||||
OBJS_DSP = \ | |||||
ArtyFxPluginDucka.cpp.o | |||||
OBJS_UI = \ | |||||
ArtyFxUiDucka.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 | |||||
# -------------------------------------------------------------- |
@@ -1,4 +0,0 @@ | |||||
# OpenAV / NTK example | |||||
This example will show an OpenAV based plugin working with DPF.<br/> | |||||
The UI uses NTK instead of OpenGL.<br/> |
@@ -1,28 +0,0 @@ | |||||
/* | |||||
* 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 DUCKA_AVTK | |||||
#define DUCKA_AVTK | |||||
#include "../../avtk/dial.h" | |||||
#include "../../avtk/image.h" | |||||
#include "../../avtk/sidechain_gain.h" | |||||
#endif |
@@ -1,153 +0,0 @@ | |||||
// generated by Fast Light User Interface Designer (fluid) version 1.0300 | |||||
#include "ducka_widget.h" | |||||
START_NAMESPACE_DISTRHO | |||||
void DuckaUI::cb_headerImage_i(Avtk::Image*, void*) { | |||||
//system("xdg-open http://www.openavproductions.com/artyfx#ducka"); | |||||
} | |||||
void DuckaUI::cb_headerImage(Avtk::Image* o, void* v) { | |||||
((DuckaUI*)(o->parent()->user_data()))->cb_headerImage_i(o,v); | |||||
} | |||||
void DuckaUI::cb_graph_i(Avtk::SidechainGain* 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 DuckaUI::cb_graph(Avtk::SidechainGain* o, void* v) { | |||||
((DuckaUI*)(o->parent()->user_data()))->cb_graph_i(o,v); | |||||
} | |||||
void DuckaUI::cb_threshold_i(Avtk::Dial* o, void*) { | |||||
float tmp = o->value(); | |||||
graph->threshold( tmp ); | |||||
setHostParameter( 0, tmp ); | |||||
} | |||||
void DuckaUI::cb_threshold(Avtk::Dial* o, void* v) { | |||||
((DuckaUI*)(o->parent()->user_data()))->cb_threshold_i(o,v); | |||||
} | |||||
void DuckaUI::cb_drop_i(Avtk::Dial* o, void*) { | |||||
float tmp = o->value(); | |||||
graph->reduce( tmp ); | |||||
setHostParameter( 1, tmp ); | |||||
} | |||||
void DuckaUI::cb_drop(Avtk::Dial* o, void* v) { | |||||
((DuckaUI*)(o->parent()->user_data()))->cb_drop_i(o,v); | |||||
} | |||||
void DuckaUI::cb_time_i(Avtk::Dial* o, void*) { | |||||
float tmp = o->value(); | |||||
graph->release( tmp ); | |||||
setHostParameter( 2, tmp ); | |||||
} | |||||
void DuckaUI::cb_time(Avtk::Dial* o, void* v) { | |||||
((DuckaUI*)(o->parent()->user_data()))->cb_time_i(o,v); | |||||
} | |||||
/** | |||||
if the type of filter changes, this function will highlight the right button | |||||
*/ | |||||
void DuckaUI::update_button(int button) { | |||||
} | |||||
DuckaUI::DuckaUI(UI* const 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::SidechainGain(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::SidechainGain* graph | |||||
{ threshold = new Avtk::Dial(10, 169, 37, 37, "Thres"); | |||||
threshold->box(FL_NO_BOX); | |||||
threshold->color((Fl_Color)90); | |||||
threshold->selection_color(FL_INACTIVE_COLOR); | |||||
threshold->labeltype(FL_NORMAL_LABEL); | |||||
threshold->labelfont(0); | |||||
threshold->labelsize(10); | |||||
threshold->labelcolor(FL_FOREGROUND_COLOR); | |||||
threshold->callback((Fl_Callback*)cb_threshold); | |||||
threshold->align(Fl_Align(FL_ALIGN_BOTTOM)); | |||||
threshold->when(FL_WHEN_CHANGED); | |||||
} // Avtk::Dial* threshold | |||||
{ drop = new Avtk::Dial(62, 169, 37, 37, "Drop"); | |||||
drop->box(FL_NO_BOX); | |||||
drop->color((Fl_Color)90); | |||||
drop->selection_color(FL_INACTIVE_COLOR); | |||||
drop->labeltype(FL_NORMAL_LABEL); | |||||
drop->labelfont(0); | |||||
drop->labelsize(10); | |||||
drop->labelcolor(FL_FOREGROUND_COLOR); | |||||
drop->callback((Fl_Callback*)cb_drop); | |||||
drop->align(Fl_Align(FL_ALIGN_BOTTOM)); | |||||
drop->when(FL_WHEN_CHANGED); | |||||
} // Avtk::Dial* drop | |||||
{ time = new Avtk::Dial(113, 168, 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 | |||||
window->color( fl_rgb_color( 17,17,17) ); | |||||
close_cb( o, 0 ); | |||||
window->end(); | |||||
} // Fl_Double_Window* window | |||||
} | |||||
int DuckaUI::getWidth() { | |||||
return window->w(); | |||||
} | |||||
int DuckaUI::getHeight() { | |||||
return window->h(); | |||||
} | |||||
void DuckaUI::setHostParameter(uint32_t index, float value) { | |||||
//cout << "port " << port << " value " << value << endl; | |||||
ui->d_setParameterValue(index, value); | |||||
} | |||||
void DuckaUI::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 |
@@ -1,108 +0,0 @@ | |||||
# data file for the Fltk User Interface Designer (fluid) | |||||
version 1.0300 | |||||
header_name {.h} | |||||
code_name {.cxx} | |||||
class DuckaUI {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 {DuckaUI()} {open | |||||
} { | |||||
Fl_Window window {open selected | |||||
xywh {1734 413 160 220} type Double | |||||
code0 {\#include "lv2/lv2plug.in/ns/extensions/ui/ui.h"} | |||||
code1 {\#include "avtk.h"} | |||||
code2 {window->color( fl_rgb_color( 17,17,17) );} | |||||
code3 {close_cb( o, 0 );} 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 {using namespace std;} | |||||
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 {\#include "../dsp/ducka.hxx"} | |||||
class {Avtk::SidechainGain} | |||||
} | |||||
Fl_Dial threshold { | |||||
label Thres | |||||
callback {float tmp = o->value(); | |||||
graph->threshold( tmp ); | |||||
writePort( int(DUCKA_THRESHOLD), tmp );} | |||||
xywh {10 169 37 37} color 90 labelsize 10 | |||||
class {Avtk::Dial} | |||||
} | |||||
Fl_Dial drop { | |||||
label Drop | |||||
callback {float tmp = o->value(); | |||||
graph->reduce( tmp ); | |||||
writePort( int(DUCKA_REDUCTION), tmp );} | |||||
xywh {62 169 37 37} color 90 labelsize 10 | |||||
class {Avtk::Dial} | |||||
} | |||||
Fl_Dial time { | |||||
label Time | |||||
callback {float tmp = o->value(); | |||||
graph->release( tmp ); | |||||
writePort( int(DUCKA_RELEASE_TIME),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(); | |||||
}} {} | |||||
} | |||||
} |
@@ -1,64 +0,0 @@ | |||||
// generated by Fast Light User Interface Designer (fluid) version 1.0300 | |||||
#ifndef ducka_widget_h | |||||
#define ducka_widget_h | |||||
#include <FL/Fl.H> | |||||
#include <FL/Fl_Double_Window.H> | |||||
//#include "lv2/lv2plug.in/ns/extensions/ui/ui.h" | |||||
#include "DistrhoUI.hpp" | |||||
#include "avtk.h" | |||||
#include <stdio.h> | |||||
#include "header.c" | |||||
using namespace std; | |||||
// keep things inside the namespace to prevent issues with public symbols | |||||
START_NAMESPACE_DISTRHO | |||||
class DuckaUI { | |||||
public: | |||||
void update_button(int button); | |||||
DuckaUI(UI* const 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::SidechainGain *graph; | |||||
private: | |||||
void cb_graph_i(Avtk::SidechainGain*, void*); | |||||
static void cb_graph(Avtk::SidechainGain*, void*); | |||||
public: | |||||
Avtk::Dial *threshold; | |||||
private: | |||||
void cb_threshold_i(Avtk::Dial*, void*); | |||||
static void cb_threshold(Avtk::Dial*, void*); | |||||
public: | |||||
Avtk::Dial *drop; | |||||
private: | |||||
void cb_drop_i(Avtk::Dial*, void*); | |||||
static void cb_drop(Avtk::Dial*, void*); | |||||
public: | |||||
Avtk::Dial *time; | |||||
private: | |||||
void cb_time_i(Avtk::Dial*, void*); | |||||
static void cb_time(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 |
@@ -1,650 +0,0 @@ | |||||
/* 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'''\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" | |||||
"\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\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\244L\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\314X\11\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\233I\21\377\377h\0\377\377" | |||||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\314X\11\3773+$\377''" | |||||
"'\377'''\377'''\377'''\377'''\377'''\377('&\377\242L\20\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'''\377" | |||||
"'''\377'''\377'''\377'''\377'''\377'''\377'''\377'''\377'''\377'''\377''" | |||||
"'\377'''\377'''\377'''\377'''\377'''\377'''\377'''\377'''\377'''\377'''\377" | |||||
"'''\377'''\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\251M\16\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\374f\0\377&&&\377&&&\377&&&\377&&&\377&&&\377" | |||||
"&&&\377&&&\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&&&\377&&&\377&&&\377&&&\377'&%\377\252N" | |||||
"\16\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||||
"\377\377h\0\377\314W\10\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\252N\16\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||||
"\377h\0\377\300T\12\377-($\377&&&\377&&&\377&&&\377&&&\377&&&\377&&&\377" | |||||
"/($\377\275S\13\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||||
"\377h\0\377\377h\0\377\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&&&\377&&&\377&&&\377&&&\377&&&\377&&&\377&&&\377&&" | |||||
"&\377&&&\377&&&\377&&&\377&&&\377&&&\377&&&\377&&&\377&&&\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\270R\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\372e\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\256O\15\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\313W\10" | |||||
"\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\271R\13\377\377h\0\377" | |||||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\262P\14\377(%$\377" | |||||
"%%%\377%%%\377%%%\377%%%\377%%%\377%%%\377;+!\377\325Z\6\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%%%\377%%%\377%%%\377%%%\377%%%\377%%%\377%%%\377%%%\377%" | |||||
"%%\377%%%\377%%%\377%%%\377%%%\377%%%\377%%%\377%%%\377%%%\377%%%\377%%%" | |||||
"\377%%%\377%%%\377%%%\377%%%\377%%%\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\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\304V\11\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\370f\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\261P\14\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\313W\10\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\305U\11\377\377h\0\377\377h\0\377\377h" | |||||
"\0\377\377h\0\377\377h\0\377\377h\0\377\242J\17\377$##\377$$$\377$$$\377" | |||||
"$$$\377$$$\377$$$\377$$$\377L0\35\377\346_\3\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$$$\377$$$\377$$$\377$$$\377$$$\377$$$\377$$$\377$$$\377$" | |||||
"$$\377$$$\377$$$\377$$$\377$$$\377$$$\377$$$\377$$$\377$$$\377$$$\377$$$" | |||||
"\377$$$\377$$$\377$$$\377$$$\377$$$\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\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\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\367e\1" | |||||
"\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\266P\13\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\313W\10" | |||||
"\377###\377###\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||||
"\377h\0\377\377h\0\377###\3773'\40\377\320X\7\377\377h\0\377\377h\0\377\377" | |||||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\222E\21\377###\377###\377###\377" | |||||
"###\377###\377###\377###\377c7\30\377\363c\1\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###\377###\377###\377###\377###\377###\377###\377" | |||||
"###\377###\377###\377###\377###\377###\377###\377###\377###\377###\377##" | |||||
"#\377###\377###\377###\377###\377###\377###\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\"\"\"\377\"\"" | |||||
"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\202@\23\377\375g\0\377\377h\0\377\377" | |||||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\332[\5\3779(\36\377\"\"\"\377\"" | |||||
"\"\"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||||
"\365e\1\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\272Q\12\377\377h\0\377\377h\0\377" | |||||
"\377h\0\377\377h\0\377\377h\0\377\373g\0\377r;\25\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:)\36\377\333]\5\377\377" | |||||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\375g\0\377\200?\23\377" | |||||
"\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\177" | |||||
"?\23\377\373g\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||||
"\364d\1\377d7\27\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\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"\"\"\377\"" | |||||
"\"\"\377\"\"\"\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\40\40!\377\40\40!\377!\40!\377!!!\377" | |||||
"!!\40\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||||
"\377h\0\377!!!\377!\40!\377\40!!\377!!!\377!\40!\377\40!!\377{=\23\377\377" | |||||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\344_\3\377" | |||||
"\40!\40\377!!!\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||||
"\377h\0\377\363c\1\377!!\40\377!!\40\377\40!!\377\40!!\377!!\40\377!!\40" | |||||
"\377!!\40\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||||
"h\0\377\377h\0\377\40\40\40\377!!!\377\276R\11\377\377h\0\377\377h\0\377" | |||||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377e7\26\377\40!!\377!!!\377\40" | |||||
"\40!\377\40!!\377!!\40\377\40!!\377!!!\377!!!\377!!\40\377\40!\40\377\40" | |||||
"!!\377!\40!\377!!\40\377!!!\377!\40!\377\377h\0\377\377h\0\377\377h\0\377" | |||||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\344_\3\377\377h\0\377\377h\0" | |||||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\177=\22\377!\40!\377!\40" | |||||
"!\377!\40!\377!\40\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\311V\7\377\255M\14" | |||||
"\377\273R\11\377\312V\7\377\331\\\5\377\350`\3\377\367e\1\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\40\40\40\377\40!\40\377!\40!\377!\40!\377\40" | |||||
"!!\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\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<(\32\377\377" | |||||
"h\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\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||||
"h\0\377\377h\0\377\362d\1\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\377" | |||||
"h\0\377\377h\0\377\377h\0\377\377h\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\377" | |||||
"h\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\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\326[\5\3771$\34\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\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\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\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\377" | |||||
"h\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\3776&\32\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\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\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\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\377h\0\377\377h\0\377" | |||||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\332\\\4\3774%\32\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\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\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\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\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\35\35\35\377\35\35\35\377\35\35\35\377" | |||||
"\35\35\35\377\35\35\35\377\35\35\35\3770#\32\377\377h\0\377\377h\0\377\377" | |||||
"h\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\377h\0\377\357" | |||||
"b\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\35\35\35\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||||
"h\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\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\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\337]\3\3776%\31\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\377h\0\377\377" | |||||
"h\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\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\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)\40\32\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\356b\1\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\377" | |||||
"h\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\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\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\342]\3\3779%\30\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\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\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\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\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" | |||||
"\33\33\33\377\33\33\33\377\33\33\33\377\33\33\33\377\33\33\33\377\33\33\33" | |||||
"\377#\35\31\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\234G\13\377\377h\0\377\377h" | |||||
"\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\227D\14\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\377h\0\377\377h\0\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\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\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||||
"\377h\0\377\377h\0\377+\40\30\377+\40\30\377+\40\30\377+\40\30\377P-\24\377" | |||||
"\356a\1\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\345^\2" | |||||
"\377<&\26\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\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\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\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\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\377" | |||||
"h\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\33\32\31\377\377h\0\377\377h\0\377\377" | |||||
"h\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\231E\13\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||||
"\377h\0\377\377h\0\377\230D\13\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\377" | |||||
"h\0\377\377h\0\377\377h\0\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\32\32\32\377\32\32\32\377\377h\0\377\377h\0\377\377" | |||||
"h\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\377C'\25\377\353`\2\377\377h\0\377" | |||||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\351`\2\377?'\25\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\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" | |||||
"\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\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\31\31\31\377\31\31\31\377\31\31\31\377\31\31\31\377\227D\13\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\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\377h\0\377\377h\0\377" | |||||
"\311T\5\377\31\31\31\377\31\31\31\377\377h\0\377\377h\0\377\377h\0\377\377" | |||||
"h\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\377N*\23\377\377h\0\377\377h\0" | |||||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\354a\1\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\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\377" | |||||
"h\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\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" | |||||
"\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" | |||||
"\27\27\27\377\27\27\27\377\30\27\27\377\27\30\30\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\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\27\27\27\377\27\27\27\377\30\30\30\377\27\27\27\377\30\27\30\377\224" | |||||
"B\12\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||||
"\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\27\27\30\377\27\27\30\377" | |||||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\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" | |||||
"\310T\5\377\27\27\27\377\30\27\27\377\377h\0\377\377h\0\377\377h\0\377\377" | |||||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\27\27\27\377\30\30\27\377\30\30" | |||||
"\27\377\30\30\27\377\27\30\27\377\30\27\27\3772\40\24\377\377h\0\377\377" | |||||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\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\27\27\27\377\27\30\30\377\30" | |||||
"\27\30\377\27\27\30\377\30\27\30\377\377h\0\377\377h\0\377\377h\0\377\377" | |||||
"h\0\377\377h\0\377\377h\0\377\377h\0\377\30\27\27\377\30\27\27\377\27\27" | |||||
"\30\377\27\27\27\377\30\30\27\377\27\27\27\377\27\30\27\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" | |||||
"\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\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\220@\12\377\377h\0\377\377h\0\377\377h\0\377\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\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\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\310T\5\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)\34\24\377\377h\0\377\377" | |||||
"h\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\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\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\377" | |||||
"h\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\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" | |||||
"\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\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\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\215?\12\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\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\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377" | |||||
"h\0\377\310T\4\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\25\25\25\377\25\25\25\377\40\30\23\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\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\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\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\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\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\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\212>\11\377\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\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\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377" | |||||
"\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0\377\377h\0" | |||||
"\377\377h\0\377\307S\4\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\26\25\23\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\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\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" | |||||
"\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", | |||||
}; | |||||
@@ -1,204 +0,0 @@ | |||||
/* | |||||
* 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 |
@@ -1,93 +0,0 @@ | |||||
/* | |||||
* 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 |
@@ -1,39 +0,0 @@ | |||||
/* | |||||
* 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 |
@@ -1,35 +0,0 @@ | |||||
#!/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 | |||||
# -------------------------------------------------------------- |
@@ -1,4 +0,0 @@ | |||||
# OpenAV / NTK example | |||||
This example will show an OpenAV based plugin working with DPF.<br/> | |||||
The UI uses NTK instead of OpenGL.<br/> |
@@ -1,511 +0,0 @@ | |||||
/* | |||||
* 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 |
@@ -1,28 +0,0 @@ | |||||
/* | |||||
* 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 |
@@ -1,652 +0,0 @@ | |||||
/* 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", | |||||
}; | |||||
@@ -1,153 +0,0 @@ | |||||
// 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* const 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 |
@@ -1,110 +0,0 @@ | |||||
# 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(); | |||||
}} {} | |||||
} |
@@ -1,65 +0,0 @@ | |||||
// 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 "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* const 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 |