From 77b3943b751bed43d230de6db322a750bfd1fc8e Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Thu, 4 Apr 2013 21:19:58 +0200 Subject: New message system. New common midi input class. Some compiler warning fixes. New ListBoxBasic class used by both LustBox and ComboBox. New embossed font. --- lv2/input_lv2.cc | 13 +- lv2/input_lv2.h | 9 +- lv2/lv2.cc | 2 +- lv2/lv2_gui.cc | 2 + plugingui/Makefile.am.plugingui | 1 + plugingui/Makefile.mingw32 | 1 + plugingui/button.cc | 4 +- plugingui/combobox.cc | 2 +- plugingui/combobox.h | 4 +- plugingui/font.cc | 4 +- plugingui/font.h | 2 +- plugingui/label.cc | 4 +- plugingui/listbox.cc | 234 +-------- plugingui/listbox.h | 36 +- plugingui/listboxbasic.cc | 311 ++++++++++++ plugingui/listboxbasic.h | 92 ++++ plugingui/painter.cc | 38 +- plugingui/painter.h | 3 +- plugingui/plugingui.cc | 30 +- plugingui/resource_data.cc | 908 +++++++++++++++++++++++++++++----- plugingui/resources/pushbutton_b.png | Bin 203 -> 203 bytes plugingui/resources/pushbutton_bl.png | Bin 371 -> 397 bytes plugingui/resources/pushbutton_br.png | Bin 371 -> 388 bytes plugingui/resources/pushbutton_c.png | Bin 187 -> 188 bytes plugingui/resources/pushbutton_l.png | Bin 325 -> 303 bytes plugingui/resources/pushbutton_r.png | Bin 312 -> 288 bytes plugingui/resources/pushbutton_t.png | Bin 193 -> 191 bytes plugingui/resources/pushbutton_tl.png | Bin 267 -> 305 bytes plugingui/resources/pushbutton_tr.png | Bin 286 -> 333 bytes src/Makefile.am | 1 + src/Makefile.am.drumgizmo | 1 + src/audioinputengine.h | 2 + src/audioinputenginemidi.cc | 14 +- src/audioinputenginemidi.h | 12 +- src/drumgizmo.cc | 116 ++++- src/drumgizmo.h | 30 +- src/drumkitloader.cc | 5 +- src/message.h | 22 +- src/midimapper.cc | 6 + src/midimapper.h | 2 + vst/Makefile.mingw32 | 1 + vst/drumgizmo_vst.cc | 8 +- vst/input_vst.cc | 17 - vst/input_vst.h | 8 +- 44 files changed, 1448 insertions(+), 497 deletions(-) create mode 100644 plugingui/listboxbasic.cc create mode 100644 plugingui/listboxbasic.h diff --git a/lv2/input_lv2.cc b/lv2/input_lv2.cc index 11e79a6..0d97760 100644 --- a/lv2/input_lv2.cc +++ b/lv2/input_lv2.cc @@ -61,6 +61,7 @@ void InputLV2::stop() void InputLV2::pre() { } + event_t *InputLV2::run(size_t pos, size_t len, size_t *nevents) { event_t *list; @@ -114,18 +115,6 @@ void InputLV2::post() { } -void InputLV2::loadMidiMap(std::string f) -{ - if(f == "") return; - MidiMapParser p(f); - if(p.parse()) {/*return false;*/} - mmap.midimap = p.midimap; - - for(size_t i = 0; i < instruments->size(); i++) { - mmap.instrmap[(*instruments)[i]->name()] = i; - } -} - #ifdef TEST_INPUT_LV2 //Additional dependency files //deps: diff --git a/lv2/input_lv2.h b/lv2/input_lv2.h index 00e0b51..aa39a23 100644 --- a/lv2/input_lv2.h +++ b/lv2/input_lv2.h @@ -27,12 +27,11 @@ #ifndef __DRUMGIZMO_INPUT_LV2_H__ #define __DRUMGIZMO_INPUT_LV2_H__ -#include -#include +#include #include -class InputLV2 : public AudioInputEngine { +class InputLV2 : public AudioInputEngineMidi { public: InputLV2(); ~InputLV2(); @@ -48,12 +47,8 @@ public: event_t *run(size_t pos, size_t len, size_t *nevents); void post(); - void loadMidiMap(std::string file); - LV2_Event_Buffer *eventPort; - MidiMapper mmap; - private: Instruments *instruments; }; diff --git a/lv2/lv2.cc b/lv2/lv2.cc index 4916cf2..dd2a059 100644 --- a/lv2/lv2.cc +++ b/lv2/lv2.cc @@ -161,7 +161,7 @@ dg_restore(LV2_Handle instance, std::string config; config.append(data, size - 1); dglv2->dg->setConfigString(config); - dglv2->in->loadMidiMap(dglv2->dg->midimapfile); + //dglv2->in->loadMidiMap(dglv2->dg->midimapfile); } /* diff --git a/lv2/lv2_gui.cc b/lv2/lv2_gui.cc index 5524a76..afd47a2 100644 --- a/lv2/lv2_gui.cc +++ b/lv2/lv2_gui.cc @@ -151,6 +151,7 @@ static void closeHandler(void *ptr) static void midimapHandler(void *ptr, const char* file) { + /* printf("> midimapHandler %s\n", file); struct DG_GUI *gui = (struct DG_GUI *)ptr; gui->instance->midimapfile = file; @@ -159,6 +160,7 @@ static void midimapHandler(void *ptr, const char* file) dglv2->in->loadMidiMap(file); printf("< midimapHandler\n"); + */ } static LV2UI_Handle ui_instantiate(const struct _LV2UI_Descriptor * descriptor, diff --git a/plugingui/Makefile.am.plugingui b/plugingui/Makefile.am.plugingui index c0f5a6c..321cc30 100644 --- a/plugingui/Makefile.am.plugingui +++ b/plugingui/Makefile.am.plugingui @@ -19,6 +19,7 @@ PLUGIN_GUI_SOURCES = \ $(top_srcdir)/plugingui/checkbox.cc \ $(top_srcdir)/plugingui/slider.cc \ $(top_srcdir)/plugingui/listbox.cc \ + $(top_srcdir)/plugingui/listboxbasic.cc \ $(top_srcdir)/plugingui/knob.cc \ $(top_srcdir)/plugingui/filebrowser.cc \ $(top_srcdir)/plugingui/image.cc \ diff --git a/plugingui/Makefile.mingw32 b/plugingui/Makefile.mingw32 index 7d6add6..7fb5492 100644 --- a/plugingui/Makefile.mingw32 +++ b/plugingui/Makefile.mingw32 @@ -28,6 +28,7 @@ CXX_SOURCES = \ $(top_srcdir)/plugingui/checkbox.cc \ $(top_srcdir)/plugingui/slider.cc \ $(top_srcdir)/plugingui/listbox.cc \ + $(top_srcdir)/plugingui/listboxbasic.cc \ $(top_srcdir)/plugingui/filebrowser.cc \ $(top_srcdir)/plugingui/knob.cc \ $(top_srcdir)/plugingui/combobox.cc \ diff --git a/plugingui/button.cc b/plugingui/button.cc index 2370f29..d03bc01 100644 --- a/plugingui/button.cc +++ b/plugingui/button.cc @@ -99,10 +99,10 @@ void GUI::Button::repaintEvent(GUI::RepaintEvent *e) break; } - Font font; + Font font(":fontemboss.png"); p.setColour(Colour(0.1)); p.drawText(width()/2-(text.length()*3)+(state==up?0:1), - height()/2+5+(state==up?0:1), font, text); + height()/2+5+(state==up?0:1), font, text, true); } void GUI::Button::setText(std::string text) diff --git a/plugingui/combobox.cc b/plugingui/combobox.cc index 376b3f1..a8f53b7 100644 --- a/plugingui/combobox.cc +++ b/plugingui/combobox.cc @@ -57,7 +57,7 @@ GUI::ComboBox::ComboBox(GUI::Widget *parent) box.bottomRight = new Image(":widget_br.png"); box.center = new Image(":widget_c.png"); - listbox = new GUI::ListBox(parent); + listbox = new GUI::ListBoxBasic(parent); listbox->registerSelectHandler(listboxSelectHandler, this); listbox->registerClickHandler(listboxSelectHandler, this); listbox->hide(); diff --git a/plugingui/combobox.h b/plugingui/combobox.h index ce68b2c..f02d07a 100644 --- a/plugingui/combobox.h +++ b/plugingui/combobox.h @@ -32,7 +32,7 @@ #include "widget.h" #include "font.h" -#include "listbox.h" +#include "listboxbasic.h" #include "painter.h" namespace GUI { @@ -62,7 +62,7 @@ private: Painter::Box box; GUI::Font font; - GUI::ListBox *listbox; + GUI::ListBoxBasic *listbox; void (*handler)(void *); void *ptr; diff --git a/plugingui/font.cc b/plugingui/font.cc index 670eba0..f9c8135 100644 --- a/plugingui/font.cc +++ b/plugingui/font.cc @@ -30,8 +30,8 @@ #include #endif/*X11*/ -GUI::Font::Font() - : img_font(":font.png") +GUI::Font::Font(std::string fontfile) + : img_font(fontfile) { int px = 0; int c; diff --git a/plugingui/font.h b/plugingui/font.h index 32a06f2..c0a65f4 100644 --- a/plugingui/font.h +++ b/plugingui/font.h @@ -38,7 +38,7 @@ namespace GUI { class Font { public: - Font(); + Font(std::string fontfile = ":font.png"); void setFace(std::string face); std::string face(); diff --git a/plugingui/label.cc b/plugingui/label.cc index 165f1ed..bcc7005 100644 --- a/plugingui/label.cc +++ b/plugingui/label.cc @@ -46,8 +46,8 @@ void GUI::Label::repaintEvent(GUI::RepaintEvent *e) p.setColour(Colour(1)); - Font font; - p.drawText(10, (height() + font.textHeight()) / 2, font, _text); + Font font(":fontemboss.png"); + p.drawText(10, (height() + font.textHeight()) / 2, font, _text, true); } diff --git a/plugingui/listbox.cc b/plugingui/listbox.cc index 3dfba5c..6c6c6e7 100644 --- a/plugingui/listbox.cc +++ b/plugingui/listbox.cc @@ -44,104 +44,53 @@ GUI::ListBox::ListBox(GUI::Widget *parent) box.bottomRight = new Image(":widget_br.png"); box.center = new Image(":widget_c.png"); - padding = 4; - btn_size = 14; - - scroll_offset = 0; - selected = -1; - marked = -1; - - clk_handler = NULL; - clk_ptr = NULL; - - sel_handler = NULL; - sel_ptr = NULL; - - valch_handler = NULL; - valch_ptr = NULL; + basic = new GUI::ListBoxBasic(this); + basic->move(box.left->width(), box.top->height()); } GUI::ListBox::~ListBox() { } -void GUI::ListBox::setSelection(int index) -{ - selected = index; - if(valch_handler) valch_handler(valch_ptr); -} - void GUI::ListBox::addItem(std::string name, std::string value) { - struct item i; - i.name = name; - i.value = value; - - items.push_back(i); - - // sort - for(int x = 0; x < (int)items.size() - 1; x++) { - for(int y = 0; y < (int)items.size() - 1; y++) { - if(items[x].name < items[y].name) { - - if(x == selected) setSelection(y); - else if(selected == y) setSelection(x); - - struct item tmp = items[x]; - items[x] = items[y]; - items[y] = tmp; - } - } - } - - if(selected == -1) setSelection((int)items.size() - 1); + basic->addItem(name, value); } void GUI::ListBox::clear() { - items.clear(); - setSelection(-1); - scroll_offset = 0; - repaintEvent(NULL); + basic->clear(); } bool GUI::ListBox::selectItem(int index) { - if(index < 0 || index > (int)items.size() - 1) return false; - setSelection(index); - repaintEvent(NULL); - return true; + return basic->selectItem(index); } std::string GUI::ListBox::selectedName() { - if(selected < 0 || selected > (int)items.size() - 1) return ""; - return items[selected].name; + return basic->selectedName(); } std::string GUI::ListBox::selectedValue() { - if(selected < 0 || selected > (int)items.size() - 1) return ""; - return items[selected].value; + return basic->selectedValue(); } void GUI::ListBox::registerClickHandler(void (*handler)(void *), void *ptr) { - this->clk_handler = handler; - this->clk_ptr = ptr; + basic->registerClickHandler(handler, ptr); } void GUI::ListBox::registerSelectHandler(void (*handler)(void *), void *ptr) -{ - this->sel_handler = handler; - this->sel_ptr = ptr; +{ + basic->registerSelectHandler(handler, ptr); } void GUI::ListBox::registerValueChangeHandler(void (*handler)(void *), void *ptr) { - this->valch_handler = handler; - this->valch_ptr = ptr; + basic->registerValueChangeHandler(handler, ptr); } void GUI::ListBox::repaintEvent(GUI::RepaintEvent *e) @@ -154,164 +103,11 @@ void GUI::ListBox::repaintEvent(GUI::RepaintEvent *e) int h = height(); if(w == 0 || h == 0) return; p.drawBox(0, 0, &box, w, h); - - int yoffset = padding / 2; - int skip = scroll_offset; - for(int idx = skip; idx < (int)items.size(); idx++) { - struct item *i = &items[idx]; - if(idx == selected) { - p.setColour(Colour(0.6, 0.9)); - p.drawFilledRectangle(1, - yoffset - (padding / 2), - width() - 1, - yoffset + (font.textHeight() + 1)); - } - - if(idx == marked) { - p.setColour(Colour(1, 0.9)); - p.drawRectangle(1, - yoffset - (padding / 2), - width() - 1, - yoffset + (font.textHeight() + 1)); - } - - p.setColour(Colour(1, 1)); - p.drawText(2, yoffset + font.textHeight(), font, i->name); - yoffset += font.textHeight() + padding; - } - - p.drawRectangle(width() - btn_size, 0, width() - 1, btn_size); - p.drawRectangle(width() - btn_size, height() - btn_size, - width() - 1, height() - 1); } -void GUI::ListBox::scrollEvent(ScrollEvent *e) +void GUI::ListBox::resize(int width, int height) { - scroll_offset += e->delta; - if(scroll_offset < 0) scroll_offset = 0; - if(scroll_offset > ((int)items.size() - 1)) - scroll_offset = ((int)items.size() - 1); - repaintEvent(NULL); -} - -void GUI::ListBox::keyEvent(GUI::KeyEvent *e) -{ - if(e->direction != -1) return; - - switch(e->keycode) { - case GUI::KeyEvent::KEY_UP: - { - marked--; - if(marked < 0) marked = 0; - - if(marked < scroll_offset) { - scroll_offset = marked; - if(scroll_offset < 0) scroll_offset = 0; - } - } - break; - case GUI::KeyEvent::KEY_DOWN: - { - // Number of items that can be displayed at a time. - int numitems = height() / (font.textHeight() + padding); - - marked++; - if(marked > ((int)items.size() - 1)) marked = (int)items.size() - 1; - - if(marked > (scroll_offset + numitems - 1)) { - scroll_offset = marked - numitems + 1; - if(scroll_offset > ((int)items.size() - 1)) - scroll_offset = ((int)items.size() - 1); - } - } - break; - case GUI::KeyEvent::KEY_HOME: - marked = 0; - if(marked < scroll_offset) { - scroll_offset = marked; - if(scroll_offset < 0) scroll_offset = 0; - } - break; - case GUI::KeyEvent::KEY_END: - { - // Number of items that can be displayed at a time. - int numitems = height() / (font.textHeight() + padding); - - marked = (int)items.size() - 1; - if(marked > (scroll_offset + numitems - 1)) { - scroll_offset = marked - numitems + 1; - if(scroll_offset > ((int)items.size() - 1)) - scroll_offset = ((int)items.size() - 1); - } - } - break; - case GUI::KeyEvent::KEY_CHARACTER: - if(e->text == " ") { - setSelection(marked); - // if(sel_handler) sel_handler(sel_ptr); - } - break; - case GUI::KeyEvent::KEY_ENTER: - setSelection(marked); - if(sel_handler) sel_handler(sel_ptr); - break; - default: - break; - } - - repaintEvent(NULL); -} - -void GUI::ListBox::buttonEvent(ButtonEvent *e) -{ - if(e->x > ((int)width() - btn_size) && e->y < ((int)width() - 1)) { - if(e->y > 0 && e->y < btn_size) { - if(e->direction == -1) return; - scroll_offset--; - if(scroll_offset < 0) scroll_offset = 0; - repaintEvent(NULL); - return; - } - - if(e->y > ((int)height() - btn_size) && e->y < ((int)height() - 1)) { - if(e->direction == -1) return; - scroll_offset++; - if(scroll_offset > ((int)items.size() - 1)) - scroll_offset = ((int)items.size() - 1); - repaintEvent(NULL); - return; - } - } - - if(e->direction == -1) { - int skip = scroll_offset; - size_t yoffset = padding / 2; - for(int idx = skip; idx < (int)items.size(); idx++) { - yoffset += font.textHeight() + padding; - if(e->y < (int)yoffset - (padding / 2)) { - setSelection(idx); - marked = selected; - if(clk_handler) clk_handler(clk_ptr); - break; - } - } - - repaintEvent(NULL); - } - - if(e->direction != -1) { - int skip = scroll_offset; - size_t yoffset = padding / 2; - for(int idx = skip; idx < (int)items.size(); idx++) { - yoffset += font.textHeight() + padding; - if(e->y < (int)yoffset - (padding / 2)) { - marked = idx; - break; - } - } - - repaintEvent(NULL); - } - - if(e->doubleclick && sel_handler) sel_handler(sel_ptr); + GUI::Widget::resize(width, height); + basic->resize(width - (box.left->width() + box.right->width()), + height - (box.top->height() + box.bottom->height())); } diff --git a/plugingui/listbox.h b/plugingui/listbox.h index e85d3d2..9a702df 100644 --- a/plugingui/listbox.h +++ b/plugingui/listbox.h @@ -31,8 +31,8 @@ #include #include "widget.h" -#include "font.h" #include "painter.h" +#include "listboxbasic.h" namespace GUI { @@ -41,8 +41,6 @@ public: ListBox(Widget *parent); ~ListBox(); - bool isFocusable() { return true; } - void addItem(std::string name, std::string value); void clear(); @@ -54,37 +52,13 @@ public: void registerClickHandler(void (*handler)(void *), void *ptr); void registerValueChangeHandler(void (*handler)(void *), void *ptr); - virtual void repaintEvent(RepaintEvent *e); - virtual void buttonEvent(ButtonEvent *e); - virtual void scrollEvent(ScrollEvent *e); - virtual void keyEvent(KeyEvent *e); + virtual void repaintEvent(GUI::RepaintEvent *e); + virtual void resize(int w, int h); private: - Painter::Box box; - - void setSelection(int index); - - struct item { - std::string name; - std::string value; - }; + ListBoxBasic *basic; - std::vector items; - int selected; - int marked; - GUI::Font font; - int padding; - int btn_size; - int scroll_offset; - - void (*sel_handler)(void *); - void *sel_ptr; - - void (*clk_handler)(void *); - void *clk_ptr; - - void (*valch_handler)(void *); - void *valch_ptr; + Painter::Box box; }; }; diff --git a/plugingui/listboxbasic.cc b/plugingui/listboxbasic.cc new file mode 100644 index 0000000..25b3daf --- /dev/null +++ b/plugingui/listboxbasic.cc @@ -0,0 +1,311 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * listboxbasic.cc + * + * Thu Apr 4 20:28:10 CEST 2013 + * Copyright 2013 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of DrumGizmo. + * + * DrumGizmo 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. + * + * DrumGizmo 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 DrumGizmo; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include "listboxbasic.h" + +#include "painter.h" +#include "font.h" + +#include + +GUI::ListBoxBasic::ListBoxBasic(GUI::Widget *parent) + : GUI::Widget(parent) +{ + padding = 4; + btn_size = 14; + + scroll_offset = 0; + selected = -1; + marked = -1; + + clk_handler = NULL; + clk_ptr = NULL; + + sel_handler = NULL; + sel_ptr = NULL; + + valch_handler = NULL; + valch_ptr = NULL; + + bg_img = new GUI::Image(":widget_c.png"); +} + +GUI::ListBoxBasic::~ListBoxBasic() +{ + delete bg_img; +} + +void GUI::ListBoxBasic::setSelection(int index) +{ + selected = index; + if(valch_handler) valch_handler(valch_ptr); +} + +void GUI::ListBoxBasic::addItem(std::string name, std::string value) +{ + struct item i; + i.name = name; + i.value = value; + + items.push_back(i); + + // sort + for(int x = 0; x < (int)items.size() - 1; x++) { + for(int y = 0; y < (int)items.size() - 1; y++) { + if(items[x].name < items[y].name) { + + if(x == selected) setSelection(y); + else if(selected == y) setSelection(x); + + struct item tmp = items[x]; + items[x] = items[y]; + items[y] = tmp; + } + } + } + + if(selected == -1) setSelection((int)items.size() - 1); +} + +void GUI::ListBoxBasic::clear() +{ + items.clear(); + setSelection(-1); + scroll_offset = 0; + repaintEvent(NULL); +} + +bool GUI::ListBoxBasic::selectItem(int index) +{ + if(index < 0 || index > (int)items.size() - 1) return false; + setSelection(index); + repaintEvent(NULL); + return true; +} + +std::string GUI::ListBoxBasic::selectedName() +{ + if(selected < 0 || selected > (int)items.size() - 1) return ""; + return items[selected].name; +} + +std::string GUI::ListBoxBasic::selectedValue() +{ + if(selected < 0 || selected > (int)items.size() - 1) return ""; + return items[selected].value; +} + +void GUI::ListBoxBasic::registerClickHandler(void (*handler)(void *), void *ptr) +{ + this->clk_handler = handler; + this->clk_ptr = ptr; +} + +void GUI::ListBoxBasic::registerSelectHandler(void (*handler)(void *), void *ptr) +{ + this->sel_handler = handler; + this->sel_ptr = ptr; +} + +void GUI::ListBoxBasic::registerValueChangeHandler(void (*handler)(void *), + void *ptr) +{ + this->valch_handler = handler; + this->valch_ptr = ptr; +} + +void GUI::ListBoxBasic::repaintEvent(GUI::RepaintEvent *e) +{ + GUI::Painter p(this); + + p.clear(); + + int w = width(); + int h = height(); + if(w == 0 || h == 0) return; + + p.drawImageStretched(0, 0, bg_img, w, h); + + int yoffset = padding / 2; + int skip = scroll_offset; + for(int idx = skip; idx < (int)items.size(); idx++) { + struct item *i = &items[idx]; + if(idx == selected) { + p.setColour(Colour(0.6, 0.9)); + p.drawFilledRectangle(1, + yoffset - (padding / 2), + width() - 1, + yoffset + (font.textHeight() + 1)); + } + + if(idx == marked) { + p.setColour(Colour(1, 0.9)); + p.drawRectangle(1, + yoffset - (padding / 2), + width() - 1, + yoffset + (font.textHeight() + 1)); + } + + p.setColour(Colour(1, 1)); + p.drawText(2, yoffset + font.textHeight(), font, i->name); + yoffset += font.textHeight() + padding; + } + + p.drawRectangle(width() - btn_size, 0, width() - 1, btn_size); + p.drawRectangle(width() - btn_size, height() - btn_size, + width() - 1, height() - 1); +} + +void GUI::ListBoxBasic::scrollEvent(ScrollEvent *e) +{ + scroll_offset += e->delta; + if(scroll_offset < 0) scroll_offset = 0; + if(scroll_offset > ((int)items.size() - 1)) + scroll_offset = ((int)items.size() - 1); + repaintEvent(NULL); +} + +void GUI::ListBoxBasic::keyEvent(GUI::KeyEvent *e) +{ + if(e->direction != -1) return; + + switch(e->keycode) { + case GUI::KeyEvent::KEY_UP: + { + marked--; + if(marked < 0) marked = 0; + + if(marked < scroll_offset) { + scroll_offset = marked; + if(scroll_offset < 0) scroll_offset = 0; + } + } + break; + case GUI::KeyEvent::KEY_DOWN: + { + // Number of items that can be displayed at a time. + int numitems = height() / (font.textHeight() + padding); + + marked++; + if(marked > ((int)items.size() - 1)) marked = (int)items.size() - 1; + + if(marked > (scroll_offset + numitems - 1)) { + scroll_offset = marked - numitems + 1; + if(scroll_offset > ((int)items.size() - 1)) + scroll_offset = ((int)items.size() - 1); + } + } + break; + case GUI::KeyEvent::KEY_HOME: + marked = 0; + if(marked < scroll_offset) { + scroll_offset = marked; + if(scroll_offset < 0) scroll_offset = 0; + } + break; + case GUI::KeyEvent::KEY_END: + { + // Number of items that can be displayed at a time. + int numitems = height() / (font.textHeight() + padding); + + marked = (int)items.size() - 1; + if(marked > (scroll_offset + numitems - 1)) { + scroll_offset = marked - numitems + 1; + if(scroll_offset > ((int)items.size() - 1)) + scroll_offset = ((int)items.size() - 1); + } + } + break; + case GUI::KeyEvent::KEY_CHARACTER: + if(e->text == " ") { + setSelection(marked); + // if(sel_handler) sel_handler(sel_ptr); + } + break; + case GUI::KeyEvent::KEY_ENTER: + setSelection(marked); + if(sel_handler) sel_handler(sel_ptr); + break; + default: + break; + } + + repaintEvent(NULL); +} + +void GUI::ListBoxBasic::buttonEvent(ButtonEvent *e) +{ + if(e->x > ((int)width() - btn_size) && e->y < ((int)width() - 1)) { + if(e->y > 0 && e->y < btn_size) { + if(e->direction == -1) return; + scroll_offset--; + if(scroll_offset < 0) scroll_offset = 0; + repaintEvent(NULL); + return; + } + + if(e->y > ((int)height() - btn_size) && e->y < ((int)height() - 1)) { + if(e->direction == -1) return; + scroll_offset++; + if(scroll_offset > ((int)items.size() - 1)) + scroll_offset = ((int)items.size() - 1); + repaintEvent(NULL); + return; + } + } + + if(e->direction == -1) { + int skip = scroll_offset; + size_t yoffset = padding / 2; + for(int idx = skip; idx < (int)items.size(); idx++) { + yoffset += font.textHeight() + padding; + if(e->y < (int)yoffset - (padding / 2)) { + setSelection(idx); + marked = selected; + if(clk_handler) clk_handler(clk_ptr); + break; + } + } + + repaintEvent(NULL); + } + + if(e->direction != -1) { + int skip = scroll_offset; + size_t yoffset = padding / 2; + for(int idx = skip; idx < (int)items.size(); idx++) { + yoffset += font.textHeight() + padding; + if(e->y < (int)yoffset - (padding / 2)) { + marked = idx; + break; + } + } + + repaintEvent(NULL); + } + + if(e->doubleclick && sel_handler) sel_handler(sel_ptr); +} diff --git a/plugingui/listboxbasic.h b/plugingui/listboxbasic.h new file mode 100644 index 0000000..1b7644e --- /dev/null +++ b/plugingui/listboxbasic.h @@ -0,0 +1,92 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * listboxbasic.h + * + * Thu Apr 4 20:28:10 CEST 2013 + * Copyright 2013 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of DrumGizmo. + * + * DrumGizmo 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. + * + * DrumGizmo 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 DrumGizmo; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#ifndef __DRUMGIZMO_LISTBOXBASIC_H__ +#define __DRUMGIZMO_LISTBOXBASIC_H__ + +#include +#include + +#include "widget.h" +#include "font.h" +#include "painter.h" + +namespace GUI { + +class ListBoxBasic : public Widget { +public: + ListBoxBasic(Widget *parent); + ~ListBoxBasic(); + + bool isFocusable() { return true; } + + void addItem(std::string name, std::string value); + + void clear(); + bool selectItem(int index); + std::string selectedName(); + std::string selectedValue(); + + void registerSelectHandler(void (*handler)(void *), void *ptr); + void registerClickHandler(void (*handler)(void *), void *ptr); + void registerValueChangeHandler(void (*handler)(void *), void *ptr); + + virtual void repaintEvent(RepaintEvent *e); + virtual void buttonEvent(ButtonEvent *e); + virtual void scrollEvent(ScrollEvent *e); + virtual void keyEvent(KeyEvent *e); + +private: + Image *bg_img; + + void setSelection(int index); + + struct item { + std::string name; + std::string value; + }; + + std::vector items; + int selected; + int marked; + GUI::Font font; + int padding; + int btn_size; + int scroll_offset; + + void (*sel_handler)(void *); + void *sel_ptr; + + void (*clk_handler)(void *); + void *clk_ptr; + + void (*valch_handler)(void *); + void *valch_ptr; +}; + +}; + +#endif/*__DRUMGIZMO_LISTBOXBASIC_H__*/ diff --git a/plugingui/painter.cc b/plugingui/painter.cc index 5a88b7c..9e5b052 100644 --- a/plugingui/painter.cc +++ b/plugingui/painter.cc @@ -103,7 +103,7 @@ void GUI::Painter::drawLine(int x0, int y0, int x1, int y1) // Handle first endpoint: double xend = round(x0); double yend = y0 + gradient * (xend - x0); - double xgap = rfpart(x0 + 0.5); + //double xgap = rfpart(x0 + 0.5); double xpxl1 = xend; //this will be used in the main loop double ypxl1 = ipart(yend); @@ -122,7 +122,7 @@ void GUI::Painter::drawLine(int x0, int y0, int x1, int y1) // Handle second endpoint: xend = round(x1); yend = y1 + gradient * (xend - x1); - xgap = fpart(x1 + 0.5); + //xgap = fpart(x1 + 0.5); double xpxl2 = xend; //this will be used in the main loop double ypxl2 = ipart(yend); @@ -173,19 +173,29 @@ void GUI::Painter::clear() } } -void GUI::Painter::drawText(int x0, int y0, GUI::Font &font, std::string text) +void GUI::Painter::drawText(int x0, int y0, GUI::Font &font, std::string text, + bool nocolour) { PixelBufferAlpha *textbuf = font.render(widget->window()->gctx, text); - - for(size_t x = 0; x < textbuf->width; x++) { - for(size_t y = 0; y < textbuf->height; y++) { - unsigned char r,g,b,a; - textbuf->pixel(x, y, &r, &g, &b, &a); - pixbuf->addPixel(x + x0, y + y0 - textbuf->height, - colour.red * 255, - colour.green * 255, - colour.blue * 255, - colour.alpha * a); + if(nocolour) { + for(size_t x = 0; x < textbuf->width; x++) { + for(size_t y = 0; y < textbuf->height; y++) { + unsigned char r,g,b,a; + textbuf->pixel(x, y, &r, &g, &b, &a); + pixbuf->addPixel(x + x0, y + y0 - textbuf->height, r,g,b,a); + } + } + } else { + for(size_t x = 0; x < textbuf->width; x++) { + for(size_t y = 0; y < textbuf->height; y++) { + unsigned char r,g,b,a; + textbuf->pixel(x, y, &r, &g, &b, &a); + pixbuf->addPixel(x + x0, y + y0 - textbuf->height, + colour.red * 255, + colour.green * 255, + colour.blue * 255, + colour.alpha * a); + } } } @@ -436,7 +446,7 @@ void GUI::Painter::drawBox(int x, int y, Box *box, int width, int height) void GUI::Painter::drawBar(int x, int y, Bar *bar, int width, int height) { - if(width < (bar->left->width() + bar->right->width() + 1)) { + if(width < ((int)bar->left->width() + (int)bar->right->width() + 1)) { width = bar->left->width() + bar->right->width() + 1; } drawImageStretched(x, y, diff --git a/plugingui/painter.h b/plugingui/painter.h index 6d5c297..0a93f50 100644 --- a/plugingui/painter.h +++ b/plugingui/painter.h @@ -47,7 +47,8 @@ public: void setColour(Colour colour); void drawLine(int x1, int y1, int x2, int y2); - void drawText(int x, int y, Font &font, std::string text); + void drawText(int x, int y, Font &font, std::string text, + bool nocolour = false); void drawRectangle(int x1, int y1, int x2, int y2); void drawFilledRectangle(int x1, int y1, int x2, int y2); void drawPoint(int x, int y); diff --git a/plugingui/plugingui.cc b/plugingui/plugingui.cc index 10632ee..08412ef 100644 --- a/plugingui/plugingui.cc +++ b/plugingui/plugingui.cc @@ -43,8 +43,9 @@ public: bool init(bool) { return true; } std::string drumkitfile() { return ""; } std::string midimapfile; - Message *receiveMessage() { return NULL; } - Message *peekMessage() { return NULL; } + Message *receiveGUIMessage() { return NULL; } + Message *peekGUIMessage() { return NULL; } + void sendEngineMessage(Message *msg) { delete msg; } }; namespace Conf { @@ -95,8 +96,12 @@ static void selectKitFile(void *ptr, std::string filename) std::string drumkit = gui->lineedit->text(); - gui->progress->setProgress(1); + gui->progress->setProgress(0); + LoadDrumKitMessage *msg = new LoadDrumKitMessage(); + msg->drumkitfile = drumkit; + gui->drumgizmo->sendEngineMessage(msg); + /* if(!gui->drumgizmo || !gui->drumgizmo->loadkit(drumkit) || !gui->drumgizmo->init(true)) { @@ -104,6 +109,7 @@ static void selectKitFile(void *ptr, std::string filename) } else { gui->progress->setState(GUI::ProgressBar::blue); } + */ } static void kitBrowseClick(void *ptr) @@ -123,9 +129,16 @@ static void selectMapFile(void *ptr, std::string filename) fb->hide(); std::string midimap = gui->lineedit2->text(); + + LoadMidimapMessage *msg = new LoadMidimapMessage(); + msg->midimapfile = midimap; + gui->drumgizmo->sendEngineMessage(msg); + + /* if(gui->changeMidimapHandler) gui->changeMidimapHandler(gui->changeMidimapPtr, midimap.c_str()); gui->progress2->setState(GUI::ProgressBar::green); + */ } static void midimapBrowseClick(void *ptr) @@ -193,17 +206,17 @@ void PluginGUI::thread_main() usleep(50); #endif/*WIN32*/ Message *msg; - while((msg = drumgizmo->receiveMessage()) != NULL) { + while((msg = drumgizmo->receiveGUIMessage()) != NULL) { switch(msg->type()) { case Message::LoadStatus: { Message *pmsg; - while( (pmsg = drumgizmo->peekMessage()) != NULL) { + while( (pmsg = drumgizmo->peekGUIMessage()) != NULL) { if(pmsg->type() != Message::LoadStatus) break; delete msg; - msg = drumgizmo->receiveMessage(); + msg = drumgizmo->receiveGUIMessage(); } - LoadStatus *ls = (LoadStatus*)msg; + LoadStatusMessage *ls = (LoadStatusMessage*)msg; DEBUG(gui, "%d of %d (%s)\n", ls->numer_of_files_loaded, ls->number_of_files, @@ -343,7 +356,6 @@ void PluginGUI::init() lbl_version->move(270, 279); lbl_version->resize(70, 20); - /* { GUI::ComboBox *cmb = new GUI::ComboBox(window); cmb->addItem("Foo", "Bar"); @@ -351,7 +363,7 @@ void PluginGUI::init() cmb->move(10,100); cmb->resize(70, 30); } - */ + // Create filebrowser filebrowser = new GUI::FileBrowser(window); filebrowser->move(0, 0); diff --git a/plugingui/resource_data.cc b/plugingui/resource_data.cc index 70bfde2..44da337 100644 --- a/plugingui/resource_data.cc +++ b/plugingui/resource_data.cc @@ -386,6 +386,637 @@ const rc_data_t rc_data[] = "\74\10\262\205\52\173\113\103\375\127\200\1\0\171\345\227" "\360\256\353\154\61\0\0\0\0\111\105\116\104\256\102\140" "\202" }, + { ":fontemboss.png", 10069, + "\211\120\116\107\15\12\32\12\0\0\0\15\111\110\104\122" + "\0\0\3\40\0\0\0\17\10\6\0\0\0\34\142\253" + "\26\0\0\0\4\147\101\115\101\0\0\257\310\67\5\212" + "\351\0\0\0\31\164\105\130\164\123\157\146\164\167\141\162" + "\145\0\101\144\157\142\145\40\111\155\141\147\145\122\145\141" + "\144\171\161\311\145\74\0\0\46\347\111\104\101\124\170\332" + "\354\135\11\174\115\107\27\177\241\366\204\306\232\215\252\324" + "\256\110\55\265\26\265\253\45\372\121\112\325\322\306\122\113" + "\133\37\102\211\274\104\204\10\265\66\326\332\227\330\142\55" + "\211\135\252\202\326\362\331\65\15\211\330\367\40\104\225\367" + "\375\317\163\156\72\231\334\373\336\175\131\124\333\274\374\116" + "\356\334\131\316\314\234\231\71\163\316\314\231\271\6\223\311" + "\144\300\237\311\200\337\277\374\151\224\335\222\237\356\237\336" + "\370\226\342\245\47\117\301\335\20\320\111\360\353\14\150\220" + "\121\371\153\344\251\73\134\117\76\351\51\343\277\51\134\17" + "\255\63\243\237\146\126\177\316\310\362\245\67\74\263\373\151" + "\146\214\267\314\152\237\314\250\313\277\41\37\315\166\244\371" + "\127\5\376\352\376\255\227\137\147\140\33\320\274\324\21\140" + "\247\370\151\321\103\145\236\116\31\46\310\64\66\226\307\150" + "\43\75\313\1\6\333\230\316\230\226\361\155\261\276\251\345" + "\27\303\253\300\67\323\32\236\226\266\173\131\343\74\75\174" + "\64\43\302\154\305\241\312\137\224\261\365\12\74\355\314\203" + "\333\316\140\262\63\330\331\231\75\376\275\117\152\257\24\156" + "\163\233\376\351\127\12\356\366\334\256\353\0\27\330\355\16" + "\370\0\360\35\340\231\322\21\10\257\236\216\54\304\63\212" + "\14\46\215\171\372\21\16\166\347\203\173\3\340\21\240\35" + "\373\155\206\73\27\240\55\40\111\107\376\166\172\313\257\26" + "\337\102\270\63\240\3\140\72\373\147\203\273\11\240\32\323" + "\374\60\140\247\171\374\374\131\257\24\223\204\200\263\64\234" + "\165\1\305\1\217\1\321\200\35\124\157\16\57\3\167\75" + "\200\53\207\307\160\370\103\225\62\367\4\274\41\62\163\51" + "\357\124\23\25\247\167\2\64\345\62\74\1\354\2\34\265" + "\220\236\342\214\343\360\202\160\267\4\224\340\260\213\200\255" + "\200\273\34\236\207\303\313\60\155\16\1\366\130\242\157\32" + "\373\137\106\305\253\14\347\173\0\107\300\115\256\313\105\11" + "\107\176\100\155\100\131\166\377\16\210\7\34\4\234\267\220" + "\357\100\176\116\127\311\127\244\63\341\273\14\330\102\145\20" + "\360\120\137\151\14\50\2\110\0\104\2\216\111\351\237\3" + "\22\271\35\176\4\134\263\322\27\14\302\230\363\263\20\246" + "\364\223\306\334\326\331\1\127\1\121\200\323\342\370\325\350" + "\157\106\225\61\156\247\25\56\244\245\272\176\104\355\200\360" + "\30\255\74\204\264\233\170\374\211\77\242\133\127\51\17\242" + "\357\134\13\345\264\343\76\113\343\272\20\340\66\217\273\137" + "\65\350\371\210\373\100\270\320\367\325\160\20\137\70\147\1" + "\307\45\100\4\307\125\342\70\360\370\44\276\231\233\313\376" + "\23\225\305\112\273\32\54\320\365\317\160\223\311\310\163\150" + "\165\274\23\317\136\255\201\213\4\354\363\300\367\13\343\233" + "\313\145\61\160\177\30\2\230\250\360\164\346\131\155\21\77" + "\4\361\151\361\350\6\140\267\200\357\175\152\137\204\207\42" + "\274\7\334\7\24\332\360\217\306\327\273\10\137\144\251\216" + "\102\371\375\244\367\101\170\135\303\375\124\155\254\311\375\360" + "\15\145\301\13\277\225\200\270\144\301\310\144\110\36\307\166" + "\22\53\141\34\243\341\154\4\230\100\175\40\171\156\146\231" + "\112\43\215\62\117\247\22\272\24\231\306\106\176\46\316\367" + "\166\72\370\341\74\100\53\236\317\364\246\123\55\263\306\34" + "\156\47\215\51\365\372\246\226\137\254\362\152\75\174\375\257" + "\12\267\224\116\246\113\106\225\45\243\346\303\14\12\253\316" + "\163\250\75\300\137\245\137\30\171\216\212\144\171\40\115\345" + "\27\237\346\361\151\147\320\375\114\153\372\324\351\262\166\100" + "\224\147\52\267\344\67\225\31\61\301\24\16\47\301\171\6" + "\63\332\234\26\64\321\376\200\274\200\67\171\22\22\343\275" + "\5\370\212\363\42\1\353\355\164\344\51\226\267\105\366\354" + "\331\23\167\357\336\335\127\361\333\261\143\307\27\344\307\102" + "\220\22\317\223\205\100\23\77\75\137\302\16\210\27\13\12" + "\212\177\15\26\32\356\221\360\301\102\153\65\251\136\142\273" + "\210\70\203\131\210\173\314\164\332\6\350\55\204\117\2\374" + "\114\12\27\207\157\125\4\131\251\114\125\171\362\66\251\320" + "\124\265\14\34\136\210\313\260\237\224\32\316\343\73\53\351" + "\23\205\360\341\134\376\173\14\121\354\247\204\167\145\205\343" + "\16\340\26\140\25\300\343\25\336\1\231\301\102\46\265\307" + "\31\356\303\42\16\22\320\2\0\153\131\331\110\342\172\355" + "\142\305\242\271\106\276\305\131\0\273\301\156\203\205\166\172" + "\300\102\264\257\20\116\302\377\367\134\246\47\234\367\64\225" + "\364\117\271\15\167\161\331\135\254\264\245\311\132\137\341\260" + "\242\200\311\200\175\200\373\114\237\137\0\337\252\360\35\65" + "\301\110\155\214\153\206\363\217\24\235\100\156\217\306\226\362" + "\20\302\226\60\217\21\177\337\252\344\361\33\240\222\205\162" + "\22\275\347\363\202\300\23\56\3\275\27\323\240\327\155\36" + "\103\303\254\340\130\300\376\132\70\150\374\174\43\325\153\0" + "\53\77\327\270\277\35\142\101\337\132\273\232\154\154\33\342" + "\265\307\0\257\253\304\173\235\303\372\12\370\276\22\126\370" + "\337\344\76\121\122\130\361\247\171\41\206\343\323\142\322\166" + "\205\176\374\244\72\155\340\360\175\74\366\304\37\275\377\150" + "\143\35\305\167\342\321\237\133\30\153\142\77\254\310\371\335" + "\141\36\116\356\12\172\127\247\361\153\320\254\131\263\245\342" + "\170\320\261\3\142\312\340\35\20\223\55\253\351\230\113\23" + "\146\317\236\75\335\254\260\351\117\147\322\23\56\340\262\332" + "\7\55\360\205\177\362\16\210\51\43\313\362\212\355\200\320" + "\334\170\205\347\42\265\366\175\306\213\173\353\376\356\73\40" + "\131\12\210\116\5\4\314\346\226\237\237\337\367\76\76\76" + "\13\340\276\311\341\165\136\173\355\265\153\243\107\217\236\3" + "\72\146\327\350\10\5\271\63\25\6\170\263\200\54\306\233" + "\305\214\336\304\253\363\223\323\221\147\162\171\163\344\310\261" + "\322\303\303\343\30\342\70\10\14\75\177\345\312\225\217\43" + "\375\122\41\15\271\373\160\332\76\374\256\326\231\215\31\245" + "\200\344\315\233\67\242\146\315\232\121\311\332\270\235\335\222" + "\374\371\363\307\106\106\106\6\21\70\70\70\304\302\157\241" + "\120\156\43\63\371\124\114\7\161\367\215\34\71\162\322\325" + "\253\127\375\117\234\70\341\133\261\142\305\155\331\262\145\113" + "\136\41\265\267\267\217\32\74\170\360\364\330\330\330\200\113" + "\227\56\175\123\267\156\335\120\204\237\227\312\104\273\14\313" + "\235\234\234\316\253\51\40\112\376\102\71\304\360\201\300\167" + "\303\313\313\153\346\371\363\347\307\374\364\323\117\143\200\147" + "\253\134\166\5\32\65\152\364\163\343\306\215\177\122\302\221" + "\366\122\375\372\365\67\136\270\160\301\110\200\362\155\42\77" + "\41\374\260\273\273\373\376\343\307\217\217\1\370\273\271\271" + "\105\262\120\226\26\5\304\205\225\317\1\151\140\270\3\70" + "\255\213\245\170\216\216\216\221\213\27\57\36\167\367\356\135" + "\343\47\237\174\262\14\345\277\47\340\40\41\154\16\332\366" + "\66\372\341\332\320\320\320\240\233\67\157\372\235\72\165\312" + "\17\364\233\226\63\147\316\30\26\262\52\251\224\157\50\372" + "\310\155\300\35\136\51\66\150\265\323\345\313\227\375\232\67" + "\157\36\206\274\257\12\341\103\360\236\60\174\370\360\231\327" + "\256\135\33\263\155\333\66\177\27\27\227\15\162\372\304\304" + "\104\277\355\333\267\217\153\332\264\351\162\224\223\24\312\21" + "\226\372\202\44\174\230\54\204\15\46\132\164\354\330\161\301" + "\221\43\107\314\364\231\72\165\152\140\301\202\5\267\147\222" + "\2\102\253\337\123\300\67\342\346\316\235\73\1\145\51\245" + "\107\210\311\223\47\117\34\53\343\312\257\114\356\334\271\317" + "\311\171\274\361\306\33\147\131\31\310\256\121\216\41\44\240" + "\201\167\315\304\270\13\0\277\12\41\372\303\377\277\152\364" + "\72\163\346\214\137\355\332\265\67\43\316\105\113\70\350\235" + "\372\202\32\216\163\347\316\31\33\64\150\260\1\161\56\211" + "\365\2\316\230\167\336\171\147\43\306\217\137\102\102\202\61" + "\50\50\150\174\201\2\5\366\250\215\121\271\15\365\264\215" + "\62\207\106\107\107\327\316\225\53\27\51\227\335\125\342\165" + "\247\60\212\103\161\333\264\151\263\17\164\75\244\50\173\340" + "\311\146\36\214\247\227\262\320\104\341\37\174\360\301\146\212" + "\277\167\357\336\76\340\351\367\231\17\23\315\215\364\276\157" + "\337\276\76\24\76\175\372\164\177\214\237\70\336\345\241\337" + "\133\364\16\177\243\32\37\332\270\161\143\110\365\352\325\117" + "\172\172\172\106\12\62\200\22\317\374\136\243\106\215\250\174" + "\371\362\205\253\50\13\106\251\255\151\67\163\46\350\176\155" + "\322\244\111\163\1\363\310\15\277\20\100\55\235\312\4\205" + "\325\3\64\227\26\167\76\342\171\163\4\357\256\344\225\332" + "\244\56\367\7\157\336\215\310\56\324\47\33\357\252\174\315" + "\213\72\165\204\264\331\331\212\300\233\371\111\135\251\116\166" + "\274\12\375\25\307\151\247\54\370\11\46\117\317\235\235\235" + "\277\225\314\237\136\3\264\226\360\312\375\250\72\343\35\305" + "\12\136\121\45\34\374\141\217\110\23\351\335\44\361\362\301" + "\12\175\245\262\33\271\354\303\271\14\304\13\352\163\231\276" + "\346\235\52\61\256\146\171\270\76\55\30\317\20\166\277\46" + "\245\117\325\6\126\350\154\224\322\327\346\272\210\13\106\245" + "\130\36\31\305\145\173\107\112\143\22\167\101\54\230\250\31" + "\245\5\215\57\245\135\44\73\366\163\22\160\24\26\166\352" + "\251\114\16\374\116\376\203\70\136\67\136\74\126\176\45\1" + "\237\161\330\60\245\237\12\273\233\103\5\374\62\244\340\347" + "\340\127\217\102\102\102\146\74\175\372\324\127\215\357\303\337" + "\70\163\346\314\357\50\136\172\24\50\361\151\263\342\220\306" + "\364\251\362\317\122\100\122\67\160\362\304\43\114\100\150\354" + "\147\3\6\14\150\71\160\340\300\17\340\376\203\204\126\10" + "\50\33\112\224\50\361\53\342\225\125\151\340\112\334\271\246" + "\102\110\276\3\241\173\54\46\367\43\245\112\225\72\50\166" + "\72\232\120\107\215\32\105\53\263\246\55\133\266\370\27\53" + "\126\154\123\72\362\114\256\3\362\212\357\335\273\367\130\271" + "\323\365\352\325\153\74\13\31\146\277\5\13\26\14\300\244" + "\167\200\47\277\3\213\26\55\352\257\321\231\115\31\244\200" + "\344\303\304\172\175\320\240\101\311\253\374\230\230\257\222\140" + "\210\72\71\22\170\173\173\317\202\337\25\55\101\113\232\14" + "\273\1\112\3\162\2\362\5\7\7\177\5\232\76\25\302" + "\273\3\312\3\162\103\360\160\200\240\373\137\320\362\251\204" + "\273\63\46\363\133\141\141\141\43\65\166\100\210\241\120\330" + "\27\144\322\240\10\15\24\16\232\35\157\330\260\341\136\10" + "\324\23\321\306\243\240\40\164\205\200\333\131\203\46\145\121" + "\257\130\114\376\135\204\366\177\212\66\31\341\353\353\373\72" + "\101\317\236\75\107\211\345\207\73\151\303\206\15\375\120\176" + "\173\202\365\353\327\367\7\216\313\62\323\325\260\3\316\306" + "\214\261\45\117\74\144\336\260\234\127\224\155\145\130\321\234" + "\66\210\161\265\140\334\331\244\366\350\12\160\6\75\212\226" + "\55\133\166\66\4\230\373\2\216\136\44\204\202\171\206\154" + "\335\272\365\143\364\343\21\20\222\106\25\57\136\274\131\351" + "\322\245\103\40\144\376\27\202\341\171\66\155\20\313\367\32" + "\372\314\321\326\255\133\377\0\201\154\13\334\107\224\111\120" + "\155\162\6\35\363\177\376\371\347\203\171\314\50\12\371\311" + "\156\335\272\155\104\331\312\161\137\51\10\360\114\65\166\100" + "\162\16\253\17\341\154\47\322\235\263\165\365\122\55\14\170" + "\116\165\350\320\41\34\170\153\320\242\0\340\65\100\161\100" + "\247\114\120\100\150\262\236\215\276\171\161\355\332\265\201\310" + "\303\125\357\52\152\235\72\165\166\263\362\257\114\322\323\252" + "\124\251\362\243\234\7\370\304\160\324\351\6\13\72\251\312" + "\201\260\23\135\273\166\335\104\174\12\220\13\120\246\113\227" + "\56\233\341\177\134\243\315\12\367\350\321\143\264\330\367\265" + "\160\240\317\234\124\303\21\30\30\130\10\70\106\50\355\56" + "\216\261\117\77\375\324\17\143\253\70\323\235\166\31\272\332" + "\310\347\254\52\40\204\33\175\164\73\312\275\237\115\275\224" + "\137\156\362\243\60\163\376\210\273\144\311\222\217\321\76\264" + "\23\112\347\10\14\350\367\153\211\337\343\271\206\323\224\107" + "\232\104\304\373\17\343\166\350\337\277\377\152\244\211\245\135" + "\24\324\51\26\363\302\112\63\137\170\21\356\206\271\345\244" + "\262\263\103\73\277\170\77\101\155\257\122\107\332\31\233\205" + "\161\267\33\302\114\143\225\61\140\176\7\217\376\206\170\65" + "\361\154\255\25\150\176\377\332\336\336\376\330\376\375\373\375" + "\221\326\235\200\334\30\373\107\315\273\74\222\2\242\347\214" + "\13\373\371\362\216\365\155\66\231\44\272\176\42\225\167\45" + "\357\212\336\341\305\213\46\202\114\323\210\167\216\342\171\167" + "\171\256\220\266\11\357\40\121\72\252\143\250\124\247\272\154" + "\176\26\307\73\72\73\131\11\321\332\65\123\374\233\133\301" + "\153\142\376\166\221\167\274\116\1\174\154\334\1\51\303\273" + "\263\244\344\175\251\261\200\272\204\313\175\213\335\13\231\216" + "\327\170\307\136\157\171\232\261\165\302\165\206\10\366\263\330" + "\6\66\320\231\140\61\57\302\76\227\26\146\117\163\231\56" + "\52\146\267\126\150\157\262\302\73\253\360\316\201\273\20\356" + "\316\176\125\4\34\377\341\260\126\134\246\26\202\11\345\145" + "\216\267\207\167\371\262\363\34\110\226\26\7\71\54\201\225" + "\120\321\24\62\101\307\56\271\62\147\323\170\171\303\104\226" + "\112\352\362\251\335\343\307\217\337\140\277\154\66\50\40\331" + "\262\24\220\127\364\11\306\376\324\22\63\54\124\250\320\55" + "\114\20\363\10\12\27\56\114\35\266\23\46\201\7\120\36" + "\202\131\173\377\232\5\62\361\300\267\325\155\157\312\327\335" + "\335\235\4\103\123\223\46\115\352\375\361\307\37\377\111\153" + "\236\242\302\4\274\111\323\246\115\253\43\167\316\251\123\247" + "\326\243\60\305\257\110\221\42\3\220\277\131\1\301\63\12" + "\357\231\255\200\274\217\374\237\304\304\304\224\26\5\204\71" + "\163\346\324\126\342\102\100\255\3\277\337\365\50\40\122\226" + "\316\300\75\277\144\311\222\261\52\341\104\233\261\240\145\70" + "\4\143\121\0\167\103\136\221\235\73\167\46\341\264\260\206" + "\2\162\223\315\246\316\260\20\336\112\240\363\143\47\47\247" + "\35\154\266\163\207\31\223\226\160\63\343\355\267\337\76\110" + "\73\121\112\70\4\365\323\310\237\166\305\306\1\306\303\275" + "\235\374\224\160\10\133\111\257\277\376\172\37\26\2\362\71" + "\72\72\366\223\150\243\45\234\266\345\125\247\111\74\221\136" + "\202\100\363\233\207\207\307\212\371\363\347\7\113\112\213\45" + "\60\307\243\64\224\226\160\360\144\261\232\161\173\163\136\162" + "\175\107\323\152\366\127\137\175\265\124\20\50\17\266\154\331" + "\162\67\61\127\66\303\72\317\346\110\63\231\351\346\204\222" + "\370\55\150\172\123\302\347\101\164\136\261\142\105\373\320\320" + "\320\17\311\255\230\241\111\165\127\312\34\210\274\267\101\300" + "\212\27\350\370\160\306\214\31\155\155\121\36\246\114\231\322" + "\205\24\100\215\74\324\126\260\114\132\141\64\346\220\177\107" + "\251\77\352\111\157\114\203\2\262\1\365\275\270\153\327\56" + "\77\320\264\250\136\45\211\36\313\226\55\373\24\151\257\261" + "\111\115\131\302\363\375\367\337\367\225\363\40\274\264\102\16" + "\145\145\275\40\154\233\104\172\207\204\204\264\23\363\300\270" + "\366\44\177\215\372\372\203\326\233\321\146\27\323\201\43\10" + "\70\166\272\272\272\136\26\353\105\374\0\375\141\63\233\243" + "\15\147\1\303\41\243\24\20\21\17\150\336\26\375\374\201" + "\150\112\110\156\362\243\60\201\127\277\16\276\161\5\364\243" + "\62\31\40\300\307\324\255\133\367\60\236\277\231\227\145\355" + "\354\306\41\374\22\342\25\20\166\10\336\101\335\314\343\317" + "\315\315\55\32\357\51\114\61\27\56\134\70\54\127\256\134" + "\144\246\326\20\317\350\5\13\26\14\325\330\221\17\312\237" + "\77\377\341\153\327\256\175\254\52\344\260\114\0\36\135\206" + "\170\265\341\305\131\23\115\5\4\277\332\200\317\250\254\202" + "\126\126\200\375\152\151\35\272\267\66\167\40\357\223\120\114" + "\375\156\335\272\65\52\56\56\316\17\374\147\33\332\367\220" + "\270\143\123\260\140\301\243\77\377\374\163\0\140\154\321\242" + "\105\117\240\235\267\46\37\160\265\263\333\214\360\23\333\267" + "\157\17\100\135\374\312\224\51\23\52\54\356\205\123\174\112" + "\167\340\300\201\61\340\261\377\23\225\111\244\15\303\374\173" + "\154\367\356\335\143\220\326\210\271\61\22\151\366\310\273\100" + "\362\116\31\322\155\163\166\166\76\166\370\360\341\261\277\374" + "\362\213\77\160\34\221\307\16\346\362\310\75\173\366\370\137" + "\277\176\335\277\171\363\346\33\121\247\170\33\24\220\232\144" + "\112\212\262\334\1\155\346\13\364\115\21\257\164\351\322\33" + "\343\343\343\175\373\364\351\263\32\145\372\375\255\267\336\132" + "\217\367\321\275\173\367\136\111\26\24\172\313\203\264\21\220" + "\11\216\23\215\10\120\237\223\360\13\27\323\253\265\201\65" + "\72\213\351\201\377\47\204\23\35\175\205\164\17\74\75\75" + "\327\235\76\175\172\334\276\175\373\374\320\337\327\131\243\275" + "\226\2\42\10\301\116\50\377\165\224\337\77\171\373\3\156" + "\362\243\60\212\123\273\166\355\143\30\203\146\353\13\50\337" + "\113\101\213\77\360\134\304\143\164\111\265\152\325\314\112\306" + "\334\271\163\107\202\216\127\170\1\246\36\306\67\55\54\176" + "\103\141\365\352\325\73\210\260\160\145\47\10\70\174\301\203" + "\142\304\235\110\324\367\133\214\367\243\165\352\324\71\46\224" + "\77\33\233\340\233\254\231\330\361\270\65\161\174\121\261\240" + "\367\176\154\206\332\235\27\302\163\361\356\115\367\54\5\344" + "\25\175\142\20\334\264\304\14\307\217\37\77\15\235\352\52" + "\201\267\267\367\34\164\252\250\367\336\173\57\12\3\152\36" + "\13\237\127\104\363\51\374\52\121\107\53\121\242\304\145\177" + "\177\377\225\353\327\257\237\211\16\374\120\36\64\215\32\65" + "\212\142\223\41\23\13\142\37\246\65\117\261\274\30\130\317" + "\273\167\357\356\52\63\371\36\75\172\270\121\230\342\107\203" + "\154\333\266\155\346\355\177\172\342\175\231\206\160\152\262\264" + "\155\250\22\137\125\1\301\304\70\7\23\101\264\142\76\306" + "\376\317\301\30\235\225\270\175\373\366\165\25\313\250\123\1" + "\41\105\154\42\30\301\225\260\260\260\341\32\151\151\122\273" + "\17\41\170\205\20\76\26\14\350\334\243\107\217\352\311\171" + "\10\14\143\130\102\102\202\57\4\61\62\335\40\6\274\117" + "\244\63\332\170\47\231\177\235\74\171\162\14\231\113\221\331" + "\224\112\376\245\311\44\2\70\372\213\370\333\264\151\263\0" + "\376\167\224\362\221\273\155\333\266\13\224\160\60\274\243\150" + "\167\312\157\14\321\25\345\337\51\321\106\113\70\245\225\250" + "\207\210\177\31\12\127\70\4\267\151\250\307\0\100\23\225" + "\25\161\253\212\262\171\45\365\105\332\1\20\12\247\243\15" + "\303\231\1\77\344\274\344\155\344\33\350\263\337\43\176\145" + "\101\1\111\104\71\76\141\246\174\365\343\217\77\136\203\111" + "\317\27\14\173\272\222\327\220\41\103\352\242\176\317\44\133" + "\353\31\240\161\34\51\156\4\20\122\343\340\67\335\302\31" + "\20\232\300\222\60\231\256\27\167\23\275\274\274\112\331\242" + "\200\364\352\325\253\242\12\255\323\164\6\204\360\364\354\331" + "\263\214\334\37\165\244\67\245\101\1\171\136\277\176\375\275" + "\203\6\15\52\155\313\56\15\117\326\216\245\112\225\72\213" + "\362\316\306\373\167\240\365\257\242\142\56\342\200\320\322\15" + "\375\365\266\302\263\304\70\104\157\320\317\135\242\247\273\270" + "\53\45\326\17\371\335\161\161\161\211\372\341\207\37\206\353" + "\300\361\114\213\146\350\223\17\3\3\3\277\25\353\165\350" + "\320\241\57\53\124\250\360\3\322\135\341\325\311\135\154\326" + "\141\253\2\222\135\12\312\256\42\30\344\205\20\163\210\224" + "\51\26\14\262\221\233\374\50\114\214\333\241\103\207\25\340" + "\267\264\250\341\14\72\46\102\200\351\301\312\225\23\374\317" + "\166\352\324\51\225\71\54\370\77\355\220\233\370\51\233\60" + "\25\55\127\256\234\371\222\212\362\345\313\37\122\224\117\311" + "\324\164\4\170\360\111\10\307\203\150\67\106\125\310\371\123" + "\150\310\16\101\66\232\170\266\232\2\42\237\265\60\151\54" + "\300\246\305\76\237\374\40\260\16\257\134\271\362\20\320\204" + "\166\142\2\252\127\257\276\212\166\215\104\5\144\321\242\105" + "\43\25\276\0\5\154\24\231\245\51\341\160\47\100\11\363" + "\341\35\315\74\200\26\2\57\272\57\246\245\170\142\235\20" + "\176\367\335\167\337\335\346\350\350\70\56\157\336\274\1\65" + "\153\326\334\0\277\207\326\316\41\20\336\305\213\27\173\363" + "\56\247\3\312\364\215\74\166\40\120\367\45\5\224\26\134" + "\242\243\243\233\253\214\11\113\12\310\152\364\247\273\310\203" + "\370\171\71\255\171\0\2\156\147\332\65\274\160\341\102\55" + "\172\307\30\350\244\274\113\374\325\142\171\324\350\304\246\200" + "\26\333\300\32\235\305\364\233\67\157\36\250\230\212\13\246" + "\325\11\305\212\25\133\207\272\216\303\374\74\154\351\322\245" + "\175\165\234\1\261\266\3\142\300\230\132\205\376\174\226\115" + "\244\362\222\233\374\224\70\120\330\214\310\233\306\144\316\74" + "\171\362\304\266\150\321\142\37\236\164\371\117\16\310\157\347" + "\40\233\370\52\312\14\306\332\161\320\152\35\55\302\100\231" + "\240\205\265\102\24\266\142\305\212\136\250\367\75\136\44\263" + "\103\377\371\31\174\353\73\241\354\16\274\10\360\277\33\67" + "\156\164\24\312\347\17\134\53\221\317\3\75\147\174\50\36" + "\305\247\164\102\130\60\357\142\121\137\75\310\146\220\24\156" + "\104\334\375\351\125\40\262\24\220\114\172\266\156\335\172\213" + "\45\146\150\266\241\66\231\6\23\100\233\15\246\25\55\32" + "\324\312\71\15\137\137\337\171\312\71\15\121\30\7\363\174" + "\200\111\234\224\207\145\120\162\256\260\177\45\1\157\253\311" + "\223\47\323\112\62\15\72\132\55\71\232\216\74\15\342\312" + "\71\72\150\135\231\311\303\257\36\6\135\222\220\207\47\257" + "\310\233\230\111\170\332\50\20\151\11\201\152\341\331\61\230" + "\243\73\166\354\70\107\132\351\172\212\162\325\26\6\126\35" + "\324\325\226\35\20\242\47\331\207\137\205\200\77\211\30\101" + "\252\374\137\234\15\30\207\166\336\1\246\21\47\354\276\134" + "\251\125\253\326\116\25\105\113\116\117\246\33\56\241\241\241" + "\144\42\365\104\54\73\4\207\76\144\376\105\0\105\363\13" + "\151\325\74\171\101\35\155\170\32\161\212\110\366\351\347\233" + "\65\153\266\63\56\56\156\74\1\271\305\63\52\107\216\34" + "\351\6\141\77\22\314\343\56\340\172\325\252\125\303\101\303" + "\307\152\273\136\242\33\2\310\166\60\276\207\205\13\27\276" + "\204\174\303\61\221\116\223\317\161\50\66\307\226\100\250\107" + "\362\371\21\302\5\234\21\300\175\205\362\240\274\124\352\373" + "\34\345\251\40\51\305\144\122\130\226\25\224\77\276\370\342" + "\213\336\301\301\301\371\76\377\374\363\176\114\367\302\350\233" + "\376\30\7\17\4\174\366\144\266\6\101\350\147\245\215\340" + "\376\205\374\14\57\156\11\111\165\26\340\316\235\73\1\135" + "\273\166\335\112\46\110\112\170\276\174\371\36\202\156\255\155" + "\121\100\120\267\256\342\130\111\317\31\20\302\3\41\252\203" + "\330\37\125\154\351\265\360\333\244\200\100\361\240\125\314\133" + "\74\31\71\333\242\200\220\333\307\307\147\54\306\337\125\122" + "\346\107\216\34\71\101\323\14\314\144\262\367\364\364\334\202" + "\274\166\363\371\36\223\104\357\24\273\27\250\277\47\371\153" + "\324\227\204\266\56\44\54\132\303\1\170\54\343\170\366\354" + "\231\161\357\336\275\123\301\153\143\221\146\71\257\372\51\343" + "\202\314\27\133\23\37\75\171\362\144\0\224\172\72\153\22" + "\153\213\2\302\212\250\233\24\124\34\170\122\55\224\54\131" + "\262\344\163\22\140\131\0\361\40\67\371\311\174\13\312\126" + "\123\346\45\243\171\25\266\0\236\144\312\342\103\74\44\42" + "\42\342\175\11\367\73\340\353\321\120\20\343\360\374\115\262" + "\213\67\377\326\254\131\143\36\113\374\64\110\266\370\175\61" + "\46\116\40\154\64\361\52\113\143\100\70\203\60\7\343\40" + "\132\262\353\177\51\12\10\233\223\35\144\123\42\105\121\115" + "\261\40\340\345\345\125\105\111\3\341\261\52\361\25\245\134" + "\344\106\270\207\32\156\16\113\116\313\361\114\142\132\274\53" + "\360\114\45\157\325\371\210\322\365\356\335\273\222\200\267\212" + "\312\30\267\27\150\226\303\312\370\116\21\206\276\177\5\374" + "\357\134\343\306\215\75\55\10\250\224\107\36\145\336\122\173" + "\327\133\36\65\72\311\12\223\132\33\130\243\263\230\376\336" + "\275\173\216\62\35\227\55\133\66\11\12\310\36\72\57\10" + "\257\130\25\263\134\55\5\44\207\340\155\57\323\63\62\62" + "\262\61\217\71\62\113\156\111\156\362\123\342\100\61\177\33" + "\64\46\345\241\51\355\132\37\76\174\270\75\133\214\64\1" + "\17\117\70\166\354\130\105\5\227\207\207\307\146\360\232\53" + "\264\10\203\171\173\272\300\157\34\313\226\55\173\12\165\47" + "\223\277\22\210\163\353\370\361\343\325\204\63\65\137\43\315" + "\271\37\177\374\161\260\262\10\40\56\36\141\216\77\242\107" + "\1\341\170\317\305\60\127\127\327\325\141\141\141\176\361\361" + "\361\176\375\372\365\13\201\222\103\326\55\211\144\202\14\345" + "\51\44\353\20\272\341\157\161\10\335\22\203\54\207\16\31" + "\335\263\147\317\365\64\250\225\163\32\375\373\367\157\245\265" + "\272\247\2\342\31\201\17\266\157\337\136\236\136\347\316\235" + "\153\224\160\330\232\247\101\350\210\361\230\70\306\313\165\40" + "\77\67\67\267\70\65\1\135\355\260\241\216\303\231\106\215" + "\370\152\347\22\312\320\200\137\265\152\125\212\55\175\60\232" + "\253\30\334\264\373\103\214\310\21\14\140\226\263\263\363\25" + "\235\12\10\51\56\213\200\367\6\46\371\111\312\352\276\20" + "\116\327\30\223\320\237\275\175\373\366\105\61\241\246\260\63" + "\327\241\140\165\340\103\171\64\1\27\201\360\75\34\345\173" + "\244\204\273\270\270\134\21\115\244\340\376\102\22\132\351\127" + "\212\166\77\202\202\202\174\325\46\254\136\275\172\215\124\316" + "\200\364\350\321\143\224\170\106\5\371\165\76\173\366\354\47" + "\20\252\107\256\133\267\156\42\362\333\103\27\11\130\73\3" + "\202\137\273\47\117\236\170\117\230\60\141\142\271\162\345\326" + "\362\301\166\345\34\307\4\133\167\100\204\363\43\277\1\127" + "\74\160\256\201\362\60\211\362\240\274\344\266\352\320\241\303" + "\156\271\256\140\304\217\300\10\315\175\337\311\311\351\52\332" + "\201\126\157\174\341\67\203\363\32\101\214\22\64\130\43\216" + "\17\136\261\223\127\314\237\361\341\106\265\363\4\171\61\321" + "\365\27\307\6\224\244\223\150\227\365\154\163\237\223\115\121" + "\332\251\244\317\306\141\365\21\177\47\352\171\66\43\316\200" + "\40\377\323\300\247\334\356\146\317\23\145\51\35\66\314\66" + "\237\1\301\257\32\224\220\25\144\246\301\266\342\305\155\121" + "\100\150\341\3\202\360\125\202\244\244\244\322\26\154\321\15" + "\61\61\61\115\320\256\144\333\235\302\114\213\351\275\211\355" + "\325\111\31\50\203\61\260\31\376\47\364\322\223\342\252\341" + "\100\233\234\121\51\63\135\331\132\160\347\316\235\164\160\375" + "\276\162\66\205\343\164\341\35\322\327\2\3\3\213\174\366" + "\331\147\276\22\17\260\252\200\140\42\117\40\123\12\346\5" + "\44\64\24\305\273\261\100\201\2\367\124\170\151\301\62\145" + "\312\234\101\37\235\117\100\156\105\261\222\167\113\336\174\363" + "\315\130\360\366\270\32\65\152\320\345\22\206\352\325\253\107" + "\322\273\273\273\173\114\262\320\370\42\76\255\232\256\2\257" + "\214\111\114\114\374\254\150\321\242\27\330\14\322\101\312\333" + "\121\331\311\222\362\373\17\372\303\241\200\200\200\111\342\42" + "\210\270\343\241\246\200\20\257\146\201\255\364\313\126\100\250" + "\377\266\156\335\172\325\251\123\247\374\177\375\365\327\240\301" + "\203\7\157\220\362\245\25\166\332\141\240\5\264\374\344\166" + "\160\160\110\336\1\101\233\335\103\331\175\170\136\311\243\330" + "\362\363\12\373\175\51\355\50\21\67\370\370\135\314\267\341" + "\340\275\101\340\161\164\121\106\260\321\150\134\151\115\10\146" + "\274\336\334\136\16\160\217\260\361\234\202\105\5\44\52\52" + "\312\27\163\70\315\215\144\222\124\337\322\116\270\205\76\255" + "\273\74\134\237\221\2\235\174\310\117\114\257\326\6\326\350" + "\54\361\253\124\327\367\127\254\130\321\353\320\241\103\275\37" + "\77\176\74\2\343\225\170\231\332\356\123\21\351\254\327\63" + "\66\175\314\311\155\336\117\145\207\62\167\245\112\225\316\240" + "\34\233\10\310\115\176\302\274\231\3\362\321\5\344\27\201" + "\347\105\12\303\63\236\336\213\27\57\176\101\71\303\105\374" + "\4\274\50\26\145\133\376\351\247\237\256\203\233\166\36\213" + "\51\371\114\234\70\361\33\360\56\112\67\26\171\34\45\274" + "\34\326\21\345\374\337\264\151\323\46\50\246\330\112\336\30" + "\327\376\76\76\76\253\231\177\131\125\100\50\36\305\247\164" + "\102\371\333\320\370\346\63\163\225\370\14\54\355\100\321\56" + "\327\333\131\12\310\337\133\1\41\41\164\56\46\235\153\267" + "\157\337\66\257\330\253\234\323\110\26\306\233\67\157\36\105" + "\66\176\264\42\213\170\167\302\303\303\147\260\200\56\336\362" + "\103\114\155\44\233\337\314\43\246\231\326\74\305\362\202\161" + "\257\204\140\160\234\7\276\22\236\237\374\74\75\75\227\133" + "\233\30\154\265\215\266\100\67\361\46\261\157\212\24\51\162" + "\135\134\175\43\377\256\135\273\56\241\301\154\170\161\300\71" + "\210\334\335\273\167\137\250\142\332\245\166\363\105\4\235\213" + "\151\320\240\301\76\10\265\223\204\360\234\34\276\21\240\334" + "\341\357\207\270\77\100\200\71\247\246\64\211\212\226\200\177" + "\13\233\77\221\360\61\26\351\217\122\136\112\70\46\251\371" + "\20\30\166\361\66\347\30\270\367\103\230\370\105\242\111\60" + "\4\6\62\41\52\41\323\7\114\355\22\160\156\124\312\15" + "\367\246\22\45\112\210\66\301\77\50\270\311\44\6\264\271" + "\261\164\351\322\201\72\114\260\250\42\331\370\300\155\113\300" + "\327\174\216\143\71\30\157\264\126\375\265\126\360\51\15\245" + "\135\260\140\1\61\316\257\31\47\341\326\72\4\227\152\162" + "\256\132\265\352\121\224\237\316\313\270\100\331\246\113\31\150" + "\247\347\101\225\52\125\146\223\162\202\260\50\157\157\157\32" + "\43\65\205\235\274\365\310\367\224\134\256\152\325\252\235\104" + "\330\72\255\363\23\244\334\240\77\44\333\72\317\232\65\153" + "\10\332\346\56\233\71\216\141\232\256\327\72\103\102\312\26" + "\342\77\10\11\11\361\266\361\14\210\352\130\232\75\173\366" + "\120\340\243\261\75\237\361\33\131\251\113\257\2\222\123\143" + "\167\242\352\260\141\303\226\362\315\123\264\15\137\312\332\71" + "\225\24\2\250\311\324\237\301\316\222\320\102\23\353\227\137" + "\176\271\30\165\373\105\214\3\272\121\175\23\230\336\164\336" + "\147\46\275\223\277\136\5\104\302\101\27\152\54\243\367\311" + "\223\47\217\320\302\101\273\10\145\313\226\75\203\170\242\231" + "\45\51\303\343\205\276\261\261\144\311\222\161\266\360\271\266" + "\155\333\156\241\213\4\204\266\13\244\367\166\355\332\155\122" + "\303\23\24\24\344\203\376\111\253\243\127\310\255\305\133\241" + "\154\223\251\233\251\127\257\136\44\230\31\300\117\314\46\52" + "\20\154\146\110\361\373\120\377\131\263\146\15\11\23\331\240" + "\30\214\146\101\245\217\265\72\160\370\261\122\245\112\35\1" + "\157\231\52\267\277\45\5\204\170\65\361\154\344\65\374\145" + "\53\40\340\11\17\134\135\135\327\342\71\26\212\34\361\336" + "\75\262\2\2\372\36\341\376\105\273\166\307\133\266\154\31" + "\256\204\143\236\243\113\17\116\162\337\241\272\46\237\1\101" + "\274\10\276\20\201\302\2\200\347\250\210\273\113\227\56\153" + "\101\357\303\214\333\227\171\306\26\153\12\110\213\26\55\350" + "\22\202\143\214\167\14\227\57\303\24\20\22\132\41\230\373" + "\200\46\264\273\113\12\131\203\314\124\100\270\76\307\271\376" + "\143\210\236\220\153\42\304\364\152\155\140\215\316\226\362\27" + "\346\335\0\360\57\243\263\263\363\322\174\371\362\211\273\342" + "\6\336\5\115\161\3\31\235\371\103\374\215\302\134\274\117" + "\115\76\31\61\142\204\77\355\112\22\220\133\356\207\50\363" + "\112\340\171\322\244\111\223\60\172\157\334\270\361\72\172\157" + "\325\252\125\250\20\157\74\144\265\233\367\356\335\253\16\271" + "\254\16\334\64\147\217\20\306\215\33\346\174\132\134\210\35" + "\76\174\370\150\141\47\365\230\273\273\373\61\364\353\311\62" + "\377\45\223\107\310\212\272\316\200\30\370\73\165\24\137\62" + "\147\267\372\313\62\301\172\5\237\226\356\362\26\47\173\150" + "\265\161\201\201\201\323\24\301\113\74\247\21\34\34\234\342" + "\233\7\350\200\133\6\15\32\104\312\205\43\176\127\122\255" + "\74\275\60\201\231\204\116\171\201\7\162\354\204\11\23\102" + "\322\223\247\342\336\265\153\127\163\276\145\245\237\20\336\217" + "\374\166\357\336\335\344\257\120\100\300\104\242\32\66\154\230" + "\352\132\307\337\177\377\275\106\243\106\215\42\100\207\173\4" + "\30\360\341\360\253\246\307\266\336\302\312\275\371\166\30\114" + "\344\301\54\70\74\241\135\200\12\25\52\154\71\176\374\170" + "\157\13\365\117\101\107\57\57\257\111\234\76\11\23\340\5" + "\224\163\303\345\313\227\333\11\375\306\243\176\375\372\253\120" + "\356\133\144\46\125\276\174\371\275\300\337\105\332\165\72\10" + "\141\160\272\32\175\350\340\32\4\145\132\75\61\177\7\4" + "\356\203\242\35\374\107\37\175\64\3\170\151\305\53\21\112" + "\350\376\345\313\227\117\144\233\174\253\12\210\312\151\74\72" + "\307\321\230\316\161\330\312\260\370\374\10\245\165\321\331\147" + "\122\61\321\105\213\26\321\215\153\44\64\115\173\357\275\367" + "\76\74\173\366\354\320\47\117\236\214\72\172\364\150\53\10" + "\350\263\372\367\357\77\113\261\153\126\322\330\333\333\107\217" + "\34\71\162\224\234\27\374\150\245\55\132\243\37\74\242\303" + "\216\120\324\306\10\345\167\302\30\232\307\66\367\117\320\226" + "\347\73\167\356\74\125\45\375\37\350\47\327\334\334\334\166" + "\205\205\205\115\241\33\275\154\74\3\242\105\77\247\205\13" + "\27\116\107\271\16\241\75\151\134\46\242\137\34\200\220\275" + "\50\35\12\10\115\74\15\245\13\64\104\201\260\322\350\321" + "\243\27\363\125\310\115\164\216\45\203\336\62\50\77\214\325" + "\52\20\122\243\245\63\103\116\376\376\376\13\350\60\64\105" + "\241\147\100\100\300\2\362\327\253\200\110\70\150\67\213\306" + "\303\26\153\267\172\141\302\17\100\277\111\336\45\31\72\164" + "\150\60\150\115\143\54\11\264\277\11\101\45\222\166\112\154" + "\341\163\267\156\335\152\14\141\54\214\372\15\274\36\323\23" + "\202\112\330\335\273\167\33\252\341\241\33\316\40\144\304\20" + "\220\133\153\234\34\70\160\240\26\372\144\322\216\35\73\314" + "\147\245\300\267\253\220\211\45\231\154\110\46\265\33\72\164" + "\350\260\65\171\354\143\56\151\337\276\375\66\362\327\251\200" + "\150\202\45\5\204\176\340\331\21\304\273\137\266\2\102\343" + "\25\155\117\364\376\235\166\135\241\354\315\227\313\333\272\165" + "\353\120\264\351\15\342\275\325\253\127\337\1\336\334\114\11" + "\277\171\363\146\243\367\337\177\237\256\65\277\114\341\230\127" + "\146\53\270\51\136\265\152\325\166\262\151\353\215\66\155\332" + "\204\212\270\37\75\172\124\7\364\136\202\261\105\207\372\223" + "\60\7\234\36\60\140\100\220\65\5\44\76\76\276\205\207" + "\207\107\62\136\314\15\233\45\63\75\133\24\220\154\32\213" + "\13\16\207\17\37\376\6\155\102\213\166\76\231\251\200\120" + "\175\350\54\14\231\377\22\324\252\125\153\73\371\211\351\325" + "\332\300\32\235\255\51\40\120\310\47\143\214\321\270\177\214" + "\361\161\152\352\324\251\63\105\332\167\353\326\155\23\311\12" + "\42\256\145\313\226\371\100\316\242\271\372\61\135\200\202\366" + "\373\136\155\116\114\112\112\162\307\134\172\233\200\334\162\77" + "\234\74\171\62\131\75\230\300\173\76\345\35\165\172\232\246" + "\114\231\222\174\101\20\361\156\314\351\363\170\221\57\333\304" + "\211\23\277\105\71\167\211\371\174\370\341\207\53\341\167\37" + "\112\212\273\116\131\306\300\62\36\271\113\260\222\241\326\57" + "\310\377\15\356\257\266\334\202\365\312\51\40\131\137\102\27" + "\236\311\104\321\370\242\67\153\232\164\210\370\7\164\376\30" + "\305\134\301\300\37\357\243\155\121\122\46\204\370\324\141\151" + "\65\204\4\310\317\20\66\43\125\107\60\231\357\334\157\210" + "\60\22\166\276\124\160\247\65\117\1\157\136\14\200\15\20" + "\146\223\40\40\264\65\333\241\347\314\265\11\314\42\367\332" + "\265\153\333\41\315\143\133\276\332\111\12\32\322\30\125\342" + "\230\265\161\55\272\341\237\37\245\63\13\223\371\354\57\173" + "\173\173\33\41\24\315\223\342\210\137\102\247\37\255\246\22" + "\323\62\51\70\344\362\51\70\325\302\370\27\210\242\75\101" + "\170\45\66\307\50\314\7\263\242\31\267\152\375\305\172\62" + "\176\45\75\235\53\41\341\231\126\324\350\114\306\37\102\33" + "\321\165\217\65\230\61\320\204\265\25\341\111\102\70\175\141" + "\235\156\14\72\253\102\237\302\154\217\252\330\227\307\163\372" + "\73\34\116\166\336\144\262\106\333\304\264\352\265\3\141\127" + "\325\350\153\353\327\160\63\63\236\334\137\270\254\105\374\374" + "\374\46\201\261\267\171\376\374\371\126\266\355\175\312\46\55" + "\356\154\372\324\134\112\363\5\323\43\126\152\47\62\251\151" + "\1\377\131\52\375\100\371\230\340\26\204\137\23\332\41\325" + "\227\320\151\105\112\112\57\176\11\235\302\257\213\264\126\253" + "\267\330\27\345\61\42\361\17\67\316\337\225\373\12\335\326" + "\264\127\31\277\232\351\231\226\52\355\115\67\107\125\160\161" + "\161\251\5\241\240\270\32\16\272\202\332\360\342\226\262\325" + "\310\61\306\332\130\122\313\137\253\14\102\30\325\205\316\70" + "\270\12\145\263\343\253\302\233\160\273\336\341\276\173\116\356" + "\273\226\372\222\200\243\120\345\312\225\273\136\274\170\361\172" + "\102\102\2\231\336\75\320\302\101\327\300\122\32\72\110\317" + "\161\10\107\135\246\73\231\23\321\356\7\55\170\44\350\345" + "\163\370\107\175\224\56\252\250\302\273\312\367\231\267\357\243" + "\263\1\32\274\344\63\246\357\367\26\306\11\355\140\321\215" + "\206\337\322\155\105\374\376\65\277\77\25\362\47\323\305\253" + "\360\213\24\360\223\362\123\14\355\32\152\251\16\126\370\244" + "\301\274\12\373\102\6\40\267\237\360\45\364\27\36\176\176" + "\136\23\46\114\360\115\114\114\164\23\276\312\354\153\172\301" + "\162\304\272\244\372\142\271\36\376\141\141\356\50\303\374\300" + "\221\171\367\176\346\225\106\376\272\62\225\203\316\237\325\141" + "\141\235\170\163\204\131\131\175\21\116\155\326\220\333\54\7" + "\217\347\50\306\235\203\115\262\52\362\230\47\334\115\5\334" + "\204\257\46\363\165\72\337\104\147\21\350\212\352\263\102\337" + "\124\243\63\355\10\216\34\61\142\304\163\10\267\166\235\72" + "\165\52\161\372\364\351\116\17\37\76\164\260\320\137\265\306" + "\167\11\270\343\314\102\256\224\226\317\155\164\67\327\331\316" + "\260\107\114\247\62\76\215\152\357\72\313\223\203\351\122\221" + "\203\111\300\337\56\314\177\346\357\267\310\155\240\204\253\321" + "\231\57\161\261\323\314\377\205\377\333\334\166\104\173\262\362" + "\330\46\311\126\144\15\322\200\346\105\241\254\305\230\327\71" + "\161\177\371\211\115\170\215\322\230\123\276\375\101\277\251\44" + "\147\110\74\207\346\172\262\62\230\111\374\237\27\115\310\304" + "\164\232\60\57\323\234\116\213\111\247\205\371\250\36\310\261" + "\204\363\311\135\250\120\241\260\52\125\252\344\333\271\163\147" + "\103\75\262\214\122\76\132\200\300\217\144\244\133\346\361\230" + "\172\156\47\232\25\205\162\336\3\175\54\157\132\347\351\254" + "\57\241\277\142\117\235\147\100\164\153\230\66\306\63\145\124" + "\236\202\66\335\120\374\316\0\271\351\213\263\172\362\320\373" + "\345\120\235\73\107\112\334\201\312\212\162\172\126\307\62\42" + "\355\77\55\334\132\133\144\140\77\115\127\133\321\16\107\104" + "\104\304\204\222\45\113\156\341\133\211\176\247\225\61\127\127" + "\327\75\143\307\216\65\146\106\371\136\306\127\162\63\142\54" + "\351\136\271\372\223\147\323\345\15\347\346\315\233\347\367\62" + "\312\230\31\165\261\45\174\343\306\215\3\371\166\31\347\227" + "\321\156\31\35\107\165\334\252\175\251\130\307\167\62\62\251" + "\216\352\27\210\200\147\23\357\226\343\331\270\3\142\64\350" + "\370\10\333\313\250\363\113\370\202\167\50\233\155\221\231\336" + "\111\372\116\124\132\370\71\370\142\210\164\41\207\356\271\377" + "\45\362\315\14\377\342\174\132\332\356\25\373\22\72\365\353" + "\161\364\175\63\360\254\217\155\255\227\227\227\127\30\177\310" + "\123\353\166\264\347\164\311\10\235\11\116\117\371\263\114\260" + "\262\24\20\213\207\300\323\253\200\350\331\346\316\250\1\153" + "\313\227\320\263\24\220\314\121\100\376\12\305\42\55\155\145" + "\276\256\360\305\355\153\164\13\10\135\223\71\24\360\21\177" + "\37\44\113\1\321\251\200\340\67\232\17\27\72\277\214\62" + "\376\325\12\10\177\250\164\230\162\145\147\226\2\222\261\165" + "\124\271\100\104\167\74\255\257\234\253\50\67\26\157\113\374" + "\47\50\40\115\233\66\235\5\345\341\22\55\254\170\170\170" + "\354\76\177\376\174\333\64\52\40\17\173\365\352\265\72\113" + "\1\371\333\51\40\4\317\172\364\350\261\112\76\150\256\223" + "\47\320\307\152\377\113\374\135\115\1\241\357\245\360\234\371" + "\356\337\135\1\371\327\233\140\245\330\42\242\237\350\126\176" + "\152\176\226\176\172\343\13\333\327\152\235\104\317\166\232\132" + "\174\113\146\144\172\363\320\223\277\55\171\152\341\113\313\366" + "\174\106\244\375\247\205\353\241\165\132\373\130\106\304\263\265" + "\77\147\144\371\322\33\236\331\375\64\63\306\133\146\265\117" + "\146\324\345\337\220\217\146\73\152\310\14\242\51\323\137\321" + "\277\365\362\153\275\270\55\230\200\31\265\346\334\314\252\163" + "\146\321\123\60\341\241\157\157\220\111\22\231\117\223\331\155" + "\70\231\323\331\312\317\361\217\316\217\222\271\323\317\172\353" + "\223\326\176\230\326\160\75\146\224\52\13\11\106\331\354\50" + "\275\155\367\262\306\271\236\362\161\137\67\37\244\247\266\113" + "\157\237\124\61\315\313\20\36\376\52\230\140\375\137\200\1" + "\0\143\140\4\2\356\332\116\327\0\0\0\0\111\105\116" + "\104\256\102\140\202" }, { ":knob.png", 3597, "\211\120\116\107\15\12\32\12\0\0\0\15\111\110\104\122" "\0\0\0\71\0\0\0\71\10\6\0\0\0\214\30\203" @@ -815,174 +1446,177 @@ const rc_data_t rc_data[] = { ":pushbutton_b.png", 203, "\211\120\116\107\15\12\32\12\0\0\0\15\111\110\104\122" "\0\0\0\1\0\0\0\14\10\6\0\0\0\243\213\327" - "\127\0\0\0\6\142\113\107\104\0\377\0\377\0\377\240" - "\275\247\223\0\0\0\11\160\110\131\163\0\0\15\327\0" + "\127\0\0\0\6\142\113\107\104\0\377\0\0\0\377\36" + "\45\223\176\0\0\0\11\160\110\131\163\0\0\15\327\0" "\0\15\327\1\102\50\233\170\0\0\0\7\164\111\115\105" - "\7\335\3\33\12\22\21\275\37\332\350\0\0\0\31\164" + "\7\335\4\4\22\37\56\26\270\340\211\0\0\0\31\164" "\105\130\164\103\157\155\155\145\156\164\0\103\162\145\141\164" "\145\144\40\167\151\164\150\40\107\111\115\120\127\201\16\27" "\0\0\0\63\111\104\101\124\10\327\45\306\61\21\200\0" - "\14\4\260\334\167\304\277\4\34\324\104\125\260\43\200\211" + "\14\4\260\334\167\306\277\4\14\324\104\125\140\200\235\205" "\273\62\220\51\272\173\263\273\2\377\146\6\234\301\23\334" - "\301\125\70\12\12\357\7\174\326\17\363\36\64\324\31\0" + "\301\125\70\12\12\357\7\175\156\17\372\347\52\207\250\0" "\0\0\0\111\105\116\104\256\102\140\202" }, - { ":pushbutton_bl.png", 371, + { ":pushbutton_bl.png", 397, "\211\120\116\107\15\12\32\12\0\0\0\15\111\110\104\122" - "\0\0\0\11\0\0\0\14\10\6\0\0\0\260\134\227" - "\243\0\0\0\6\142\113\107\104\0\377\0\377\0\377\240" - "\275\247\223\0\0\0\11\160\110\131\163\0\0\15\327\0" + "\0\0\0\13\0\0\0\14\10\6\0\0\0\264\251\107" + "\236\0\0\0\6\142\113\107\104\0\377\0\0\0\377\36" + "\45\223\176\0\0\0\11\160\110\131\163\0\0\15\327\0" "\0\15\327\1\102\50\233\170\0\0\0\7\164\111\115\105" - "\7\335\3\34\22\21\3\352\151\62\22\0\0\0\35\151" - "\124\130\164\103\157\155\155\145\156\164\0\0\0\0\0\103" - "\162\145\141\164\145\144\40\167\151\164\150\40\107\111\115\120" - "\144\56\145\7\0\0\0\327\111\104\101\124\30\323\135\320" - "\315\112\303\120\20\100\341\57\367\336\246\12\375\161\221\105" - "\165\43\372\12\335\371\152\175\50\237\247\24\264\40\6\212" - "\324\46\56\264\142\44\156\156\212\164\140\26\63\234\71\63" - "\114\201\210\113\124\270\133\255\126\217\313\345\162\136\226\245" - "\41\202\263\150\232\146\333\266\255\276\357\117\31\63\70\312" - "\266\53\204\305\142\361\120\125\125\21\143\44\257\12\110\31" - "\232\325\165\135\114\247\323\131\10\341\66\245\124\244\224\116" - "\120\304\30\23\314\327\353\165\273\333\355\232\256\353\46\373" - "\375\276\54\62\124\142\206\33\334\347\274\306\34\145\314\367" - "\26\331\66\312\3\343\174\102\100\37\63\60\200\203\71\240" - "\107\207\237\260\331\154\372\177\215\117\274\343\25\133\74\343" - "\51\145\313\0\35\163\375\213\57\34\160\21\340\314\166\104" - "\213\67\324\170\71\175\374\14\374\316\253\77\160\370\3\27" - "\353\115\7\65\0\373\153\0\0\0\0\111\105\116\104\256" - "\102\140\202" }, - { ":pushbutton_br.png", 371, + "\7\335\4\4\22\37\23\116\320\254\230\0\0\0\31\164" + "\105\130\164\103\157\155\155\145\156\164\0\103\162\145\141\164" + "\145\144\40\167\151\164\150\40\107\111\115\120\127\201\16\27" + "\0\0\0\365\111\104\101\124\50\317\145\221\73\116\304\60" + "\24\105\217\77\361\200\230\144\246\110\21\150\20\110\136\101" + "\72\266\226\105\261\236\310\15\115\42\271\10\44\24\20\104" + "\6\323\74\43\30\54\335\302\357\176\336\265\254\0\3\134" + "\2\65\160\327\165\335\143\333\266\7\347\34\347\107\237\17" + "\346\171\176\132\226\205\224\322\77\30\61\24\222\176\4\164" + "\323\64\17\165\135\53\143\314\237\240\54\266\42\256\306\161" + "\124\145\131\126\132\353\133\153\255\262\326\222\115\131\154\200" + "\35\260\7\16\175\337\57\61\306\171\333\266\375\64\115\56" + "\306\130\14\303\200\22\261\3\52\340\6\270\27\134\3\7" + "\341\14\240\162\51\45\203\102\310\235\124\323\100\2\276\200" + "\223\21\141\66\344\115\131\264\1\237\300\12\254\66\204\220" + "\274\367\231\170\3\236\305\274\2\13\160\45\233\214\25\42" + "\213\127\271\237\200\167\340\5\270\220\172\106\205\20\0\360" + "\336\347\32\126\340\4\105\176\340\317\17\206\20\322\257\15" + "\37\122\351\125\322\47\140\372\6\376\164\126\55\226\0\10" + "\320\0\0\0\0\111\105\116\104\256\102\140\202" }, + { ":pushbutton_br.png", 388, "\211\120\116\107\15\12\32\12\0\0\0\15\111\110\104\122" - "\0\0\0\11\0\0\0\14\10\6\0\0\0\260\134\227" - "\243\0\0\0\6\142\113\107\104\0\377\0\377\0\377\240" - "\275\247\223\0\0\0\11\160\110\131\163\0\0\15\327\0" + "\0\0\0\13\0\0\0\14\10\6\0\0\0\264\251\107" + "\236\0\0\0\6\142\113\107\104\0\377\0\0\0\377\36" + "\45\223\176\0\0\0\11\160\110\131\163\0\0\15\327\0" "\0\15\327\1\102\50\233\170\0\0\0\7\164\111\115\105" - "\7\335\3\34\22\21\25\36\275\207\103\0\0\0\35\151" - "\124\130\164\103\157\155\155\145\156\164\0\0\0\0\0\103" - "\162\145\141\164\145\144\40\167\151\164\150\40\107\111\115\120" - "\144\56\145\7\0\0\0\327\111\104\101\124\30\323\135\320" - "\115\116\2\101\20\6\320\207\316\312\333\171\50\56\342\31" - "\130\271\163\303\142\20\22\127\44\166\202\46\223\370\223\70" - "\100\53\2\63\3\264\233\206\114\254\244\322\265\170\225\257" - "\273\7\243\321\50\311\325\266\255\351\164\32\207\303\341\55" - "\136\360\25\102\330\24\51\135\214\30\243\365\172\375\352\137" - "\135\235\207\256\353\124\125\225\312\262\274\107\312\15\212\246" - "\151\304\30\125\125\225\146\263\331\303\144\62\171\306\261\17" - "\213\361\170\274\253\353\372\253\54\313\307\371\174\376\204\6" - "\135\17\32\340\16\55\42\336\261\310\375\206\357\20\302\276" - "\300\6\73\54\121\143\205\337\274\170\204\2\237\31\56\361" - "\221\341\117\106\247\63\132\344\315\125\6\113\154\161\270\134" - "\34\1\373\14\67\371\334\367\321\165\36\142\216\330\346\230" - "\3\122\10\341\362\272\233\234\175\352\377\317\31\300\37\46" - "\315\205\366\5\205\205\232\0\0\0\0\111\105\116\104\256" - "\102\140\202" }, - { ":pushbutton_c.png", 187, + "\7\335\4\4\22\36\53\177\311\45\107\0\0\0\31\164" + "\105\130\164\103\157\155\155\145\156\164\0\103\162\145\141\164" + "\145\144\40\167\151\164\150\40\107\111\115\120\127\201\16\27" + "\0\0\0\354\111\104\101\124\50\317\145\220\101\116\205\60" + "\24\105\17\206\241\173\160\115\56\212\255\270\2\106\316\34" + "\122\204\304\21\321\46\137\223\46\352\0\376\247\212\226\337" + "\176\250\223\7\41\330\344\246\351\315\271\367\245\57\311\363" + "\74\262\73\336\173\252\252\262\131\226\335\2\257\100\253\265" + "\36\322\30\377\261\130\153\351\373\376\155\357\137\355\215\20" + "\2\306\230\250\224\272\7\242\10\200\265\331\173\217\265\26" + "\143\114\254\353\372\241\54\313\27\140\332\6\322\242\50\0" + "\160\316\271\256\353\132\245\324\143\323\64\117\300\31\10\233" + "\0\11\160\47\217\11\360\200\5\76\200\203\350\35\370\322" + "\132\217\51\340\200\131\132\34\160\4\72\340\4\374\110\301" + "\4\220\2\55\160\21\163\20\370\123\2\337\342\317\13\174" + "\220\344\131\232\116\2\36\201\137\51\212\13\374\54\160\0" + "\106\11\14\162\217\133\70\1\156\66\37\14\62\326\13\164" + "\1\242\326\172\205\257\67\273\234\105\353\176\27\20\340\17" + "\135\206\230\366\33\115\352\110\0\0\0\0\111\105\116\104" + "\256\102\140\202" }, + { ":pushbutton_c.png", 188, "\211\120\116\107\15\12\32\12\0\0\0\15\111\110\104\122" - "\0\0\0\1\0\0\0\113\10\6\0\0\0\261\326\355" - "\203\0\0\0\6\142\113\107\104\0\377\0\377\0\377\240" - "\275\247\223\0\0\0\11\160\110\131\163\0\0\15\327\0" + "\0\0\0\1\0\0\0\110\10\6\0\0\0\67\102\237" + "\55\0\0\0\6\142\113\107\104\0\377\0\0\0\377\36" + "\45\223\176\0\0\0\11\160\110\131\163\0\0\15\327\0" "\0\15\327\1\102\50\233\170\0\0\0\7\164\111\115\105" - "\7\335\3\33\12\24\71\336\360\325\224\0\0\0\31\164" + "\7\335\4\4\22\41\26\177\177\103\152\0\0\0\31\164" "\105\130\164\103\157\155\155\145\156\164\0\103\162\145\141\164" "\145\144\40\167\151\164\150\40\107\111\115\120\127\201\16\27" - "\0\0\0\43\111\104\101\124\30\323\143\170\371\362\345\177" - "\246\377\377\377\63\60\61\60\60\60\100\130\330\270\104\50" - "\41\135\307\210\65\24\0\171\301\237\263\327\100\36\246\0" - "\0\0\0\111\105\116\104\256\102\140\202" }, - { ":pushbutton_l.png", 325, + "\0\0\0\44\111\104\101\124\30\323\143\170\376\374\371\177" + "\246\377\377\377\63\60\61\60\60\60\100\130\10\2\115\14" + "\77\227\72\112\206\247\241\0\266\325\231\255\347\272\327\152" + "\0\0\0\0\111\105\116\104\256\102\140\202" }, + { ":pushbutton_l.png", 303, "\211\120\116\107\15\12\32\12\0\0\0\15\111\110\104\122" - "\0\0\0\11\0\0\0\113\10\6\0\0\0\242\1\255" - "\167\0\0\0\6\142\113\107\104\0\377\0\377\0\377\240" - "\275\247\223\0\0\0\11\160\110\131\163\0\0\15\327\0" + "\0\0\0\13\0\0\0\110\10\6\0\0\0\40\140\17" + "\344\0\0\0\6\142\113\107\104\0\377\0\0\0\377\36" + "\45\223\176\0\0\0\11\160\110\131\163\0\0\15\327\0" "\0\15\327\1\102\50\233\170\0\0\0\7\164\111\115\105" - "\7\335\3\34\22\22\5\50\47\304\344\0\0\0\35\151" - "\124\130\164\103\157\155\155\145\156\164\0\0\0\0\0\103" - "\162\145\141\164\145\144\40\167\151\164\150\40\107\111\115\120" - "\144\56\145\7\0\0\0\251\111\104\101\124\110\307\355\225" - "\313\16\302\40\20\105\17\123\252\46\106\377\377\17\375\0" - "\22\226\203\33\60\210\324\66\244\76\320\316\206\315\345\334" - "\311\5\6\3\30\100\200\75\160\366\336\137\234\163\344\145" - "\343\52\300\16\70\205\20\10\41\334\211\44\222\206\50\72" - "\252\52\145\331\314\156\4\16\65\122\262\113\264\121\125\253" - "\166\111\144\200\241\24\344\244\233\260\106\262\345\256\105\242" - "\251\10\36\110\317\172\232\44\55\352\111\152\244\131\273\346" - "\10\332\355\214\61\363\21\54\42\211\310\112\75\225\244\27" - "\36\160\363\175\372\364\55\370\202\10\336\374\244\272\170\346" - "\133\4\375\16\326\55\202\77\370\357\272\234\164\77\25\301" - "\25\42\163\164\67\333\211\312\21\0\0\0\0\111\105\116" - "\104\256\102\140\202" }, - { ":pushbutton_r.png", 312, + "\7\335\4\4\22\40\40\251\336\347\262\0\0\0\31\164" + "\105\130\164\103\157\155\155\145\156\164\0\103\162\145\141\164" + "\145\144\40\167\151\164\150\40\107\111\115\120\127\201\16\27" + "\0\0\0\227\111\104\101\124\110\307\355\226\113\12\303\60" + "\14\104\237\224\204\256\173\200\334\377\50\275\217\301\133\253" + "\233\120\322\340\64\66\371\340\24\171\143\60\243\141\170\210" + "\301\2\164\300\3\170\2\143\10\341\25\143\44\167\372\351" + "\226\151\150\110\51\141\146\131\261\316\304\2\164\153\302\271" + "\363\147\340\227\163\277\174\250\22\233\331\146\346\57\347\222" + "\314\233\316\125\231\65\347\134\34\343\60\164\373\143\210\110" + "\71\272\52\147\125\75\51\363\232\363\205\213\164\330\76\267" + "\272\165\67\100\327\110\25\374\105\175\71\272\233\241\153\244" + "\12\34\235\377\67\274\371\35\35\360\6\177\141\144\377\377" + "\366\363\344\0\0\0\0\111\105\116\104\256\102\140\202" }, + { ":pushbutton_r.png", 288, "\211\120\116\107\15\12\32\12\0\0\0\15\111\110\104\122" - "\0\0\0\11\0\0\0\113\10\6\0\0\0\242\1\255" - "\167\0\0\0\6\142\113\107\104\0\377\0\377\0\377\240" - "\275\247\223\0\0\0\11\160\110\131\163\0\0\15\327\0" + "\0\0\0\13\0\0\0\110\10\6\0\0\0\40\140\17" + "\344\0\0\0\6\142\113\107\104\0\377\0\0\0\377\36" + "\45\223\176\0\0\0\11\160\110\131\163\0\0\15\327\0" "\0\15\327\1\102\50\233\170\0\0\0\7\164\111\115\105" - "\7\335\3\34\22\22\24\102\227\344\26\0\0\0\35\151" - "\124\130\164\103\157\155\155\145\156\164\0\0\0\0\0\103" - "\162\145\141\164\145\144\40\167\151\164\150\40\107\111\115\120" - "\144\56\145\7\0\0\0\234\111\104\101\124\110\307\355\225" - "\315\12\204\40\30\105\217\375\14\141\370\0\275\377\143\371" - "\4\156\147\125\14\151\33\213\161\310\50\250\30\245\273\23" - "\56\307\217\253\127\205\61\306\361\45\245\24\122\312\16\170" - "\3\203\326\172\254\234\13\74\370\265\2\172\340\3\214\5" - "\77\262\326\2\264\300\13\50\1\142\244\6\250\201\142\325" - "\344\111\265\247\10\146\347\12\151\66\210\55\322\142\330\62" - "\5\212\15\36\50\26\301\161\322\256\231\142\21\34\47\135" - "\270\335\171\246\233\43\70\357\200\223\275\5\177\20\301\315" - "\225\112\242\346\117\4\171\125\352\211\40\243\377\56\331\227" - "\56\253\10\46\371\206\205\334\51\373\235\147\0\0\0\0" - "\111\105\116\104\256\102\140\202" }, - { ":pushbutton_t.png", 193, + "\7\335\4\4\22\40\70\272\262\177\344\0\0\0\31\164" + "\105\130\164\103\157\155\155\145\156\164\0\103\162\145\141\164" + "\145\144\40\167\151\164\150\40\107\111\115\120\127\201\16\27" + "\0\0\0\210\111\104\101\124\110\307\355\226\313\12\200\40" + "\24\104\217\75\126\202\377\323\377\177\206\313\26\56\333\265" + "\324\66\25\5\212\75\210\314\234\245\14\303\160\270\14\12" + "\143\214\303\43\51\45\112\251\16\350\201\101\153\75\66\316" + "\171\275\130\153\1\132\240\6\4\100\105\100\163\310\142\24" + "\0\261\344\325\170\304\274\123\320\354\173\17\166\276\235\174" + "\252\163\14\335\365\344\27\152\74\147\116\4\335\163\207\224" + "\375\325\45\214\56\221\51\310\152\276\12\272\217\240\113\144" + "\12\12\272\362\337\370\355\24\24\164\133\115\61\322\163\304" + "\255\217\130\313\0\0\0\0\111\105\116\104\256\102\140\202" }, + { ":pushbutton_t.png", 191, "\211\120\116\107\15\12\32\12\0\0\0\15\111\110\104\122" "\0\0\0\1\0\0\0\12\10\6\0\0\0\165\322\64" - "\112\0\0\0\6\142\113\107\104\0\377\0\377\0\377\240" - "\275\247\223\0\0\0\11\160\110\131\163\0\0\15\327\0" + "\112\0\0\0\6\142\113\107\104\0\377\0\0\0\377\36" + "\45\223\176\0\0\0\11\160\110\131\163\0\0\15\327\0" "\0\15\327\1\102\50\233\170\0\0\0\7\164\111\115\105" - "\7\335\3\33\12\23\62\6\143\232\333\0\0\0\31\164" + "\7\335\4\4\22\40\7\14\324\122\331\0\0\0\31\164" "\105\130\164\103\157\155\155\145\156\164\0\103\162\145\141\164" "\145\144\40\167\151\164\150\40\107\111\115\120\127\201\16\27" - "\0\0\0\51\111\104\101\124\10\327\115\311\241\1\0\60" - "\14\303\60\57\377\177\330\37\172\102\74\62\60\42\42\146" - "\206\0\37\0\207\266\146\167\211\372\126\345\2\70\104\17" - "\136\250\47\301\15\0\0\0\0\111\105\116\104\256\102\140" - "\202" }, - { ":pushbutton_tl.png", 267, + "\0\0\0\47\111\104\101\124\10\327\105\306\101\15\0\60" + "\10\4\260\16\377\16\361\200\4\156\237\45\373\64\325\335" + "\340\330\335\324\314\250\44\12\157\37\270\65\372\25\130\10" + "\200\277\321\0\0\0\0\111\105\116\104\256\102\140\202" }, + { ":pushbutton_tl.png", 305, "\211\120\116\107\15\12\32\12\0\0\0\15\111\110\104\122" - "\0\0\0\12\0\0\0\12\10\6\0\0\0\215\62\317" - "\275\0\0\0\6\142\113\107\104\0\377\0\377\0\377\240" - "\275\247\223\0\0\0\11\160\110\131\163\0\0\15\327\0" + "\0\0\0\13\0\0\0\12\10\6\0\0\0\142\360\244" + "\203\0\0\0\6\142\113\107\104\0\377\0\0\0\377\36" + "\45\223\176\0\0\0\11\160\110\131\163\0\0\15\327\0" "\0\15\327\1\102\50\233\170\0\0\0\7\164\111\115\105" - "\7\335\3\33\12\24\13\26\47\204\24\0\0\0\31\164" + "\7\335\4\4\22\35\41\264\61\237\232\0\0\0\31\164" "\105\130\164\103\157\155\155\145\156\164\0\103\162\145\141\164" "\145\144\40\167\151\164\150\40\107\111\115\120\127\201\16\27" - "\0\0\0\163\111\104\101\124\30\323\305\316\61\12\205\60" - "\20\4\320\331\45\305\57\162\215\34\301\346\303\277\325\27" - "\354\75\146\56\220\72\105\10\31\310\332\250\50\210\330\71" - "\335\62\217\145\44\306\210\47\121\74\314\113\60\204\40\356" - "\256\44\371\125\325\261\367\76\270\53\0\100\132\153\23\200" - "\271\224\242\44\341\256\120\112\351\147\146\163\316\131\315\354" - "\274\161\103\0\234\367\376\137\153\335\21\200\323\107\131\357" - "\217\210\14\44\161\204\13\73\106\56\163\141\43\263\272\0" - "\0\0\0\111\105\116\104\256\102\140\202" }, - { ":pushbutton_tr.png", 286, + "\0\0\0\231\111\104\101\124\30\323\215\320\101\12\302\100" + "\14\100\321\237\130\124\260\172\0\367\163\4\67\202\267\122" + "\160\337\143\366\0\166\335\302\120\32\230\270\351\100\113\113" + "\65\253\131\74\376\220\110\135\327\374\73\305\57\20\102\220" + "\115\34\102\20\63\273\253\352\53\245\164\3\256\13\74\126" + "\144\30\206\67\120\305\30\325\314\110\51\315\313\31\66\115" + "\363\160\367\252\155\133\165\367\331\217\72\205\100\121\226\345" + "\263\357\373\5\234\226\145\174\37\105\344\146\146\254\341\134" + "\124\340\0\134\142\214\237\256\353\66\117\247\300\36\70\273" + "\373\152\65\43\1\166\43\76\345\315\327\346\13\364\354\101" + "\142\251\63\303\12\0\0\0\0\111\105\116\104\256\102\140" + "\202" }, + { ":pushbutton_tr.png", 333, "\211\120\116\107\15\12\32\12\0\0\0\15\111\110\104\122" - "\0\0\0\12\0\0\0\12\10\6\0\0\0\215\62\317" - "\275\0\0\0\6\142\113\107\104\0\377\0\377\0\377\240" - "\275\247\223\0\0\0\11\160\110\131\163\0\0\15\327\0" + "\0\0\0\13\0\0\0\12\10\6\0\0\0\142\360\244" + "\203\0\0\0\6\142\113\107\104\0\377\0\0\0\377\36" + "\45\223\176\0\0\0\11\160\110\131\163\0\0\15\327\0" "\0\15\327\1\102\50\233\170\0\0\0\7\164\111\115\105" - "\7\335\3\33\12\23\37\103\274\306\256\0\0\0\31\164" + "\7\335\4\4\22\36\0\323\165\334\7\0\0\0\31\164" "\105\130\164\103\157\155\155\145\156\164\0\103\162\145\141\164" "\145\144\40\167\151\164\150\40\107\111\115\120\127\201\16\27" - "\0\0\0\206\111\104\101\124\30\323\265\317\61\12\103\41" - "\20\4\320\131\211\142\341\65\74\102\312\334\52\155\252\64" - "\201\177\257\64\71\202\165\300\112\260\23\304\235\124\246\220" - "\24\66\31\230\356\55\354\110\112\11\73\61\330\314\37\140" - "\214\121\166\240\250\352\233\344\113\125\17\153\355\63\245\304" - "\237\260\224\102\153\55\274\367\112\362\346\234\173\0\340\172" - "\140\306\30\150\255\241\326\152\110\336\163\316\27\0\262\276" - "\364\35\103\22\255\65\23\102\270\2\70\255\330\220\304\154" - "\357\35\42\162\6\340\47\236\360\3\234\263\102\360\377\322" - "\316\30\0\0\0\0\111\105\116\104\256\102\140\202" }, + "\0\0\0\265\111\104\101\124\30\323\215\220\73\156\303\60" + "\20\104\337\322\246\100\304\112\235\23\350\10\51\175\253\264" + "\251\322\30\360\275\334\344\10\354\3\25\152\324\21\140\270" + "\223\46\62\4\377\340\5\246\233\67\73\30\313\71\363\354" + "\331\277\0\310\71\353\241\331\335\27\303\217\244\157\167\77" + "\306\30\117\267\100\233\246\111\0\41\4\142\214\244\224\134" + "\322\147\327\165\7\100\153\50\110\102\22\255\65\112\51\314" + "\363\34\44\175\215\343\270\7\154\30\206\163\315\160\371\112" + "\22\245\224\320\367\375\7\260\135\3\347\344\265\152\255\230" + "\331\73\220\26\0\140\53\135\17\320\132\303\314\336\200\27" + "\340\27\150\167\315\113\35\340\25\50\100\5\132\270\267\251" + "\273\3\354\200\16\330\0\374\1\33\160\147\36\316\322\163" + "\44\0\0\0\0\111\105\116\104\256\102\140\202" }, { ":pushbuttondown_b.png", 196, "\211\120\116\107\15\12\32\12\0\0\0\15\111\110\104\122" "\0\0\0\1\0\0\0\14\10\6\0\0\0\243\213\327" diff --git a/plugingui/resources/pushbutton_b.png b/plugingui/resources/pushbutton_b.png index c06eb04..b3f24a6 100644 Binary files a/plugingui/resources/pushbutton_b.png and b/plugingui/resources/pushbutton_b.png differ diff --git a/plugingui/resources/pushbutton_bl.png b/plugingui/resources/pushbutton_bl.png index 3d92a1c..340e8b8 100644 Binary files a/plugingui/resources/pushbutton_bl.png and b/plugingui/resources/pushbutton_bl.png differ diff --git a/plugingui/resources/pushbutton_br.png b/plugingui/resources/pushbutton_br.png index 50519f1..f5814f2 100644 Binary files a/plugingui/resources/pushbutton_br.png and b/plugingui/resources/pushbutton_br.png differ diff --git a/plugingui/resources/pushbutton_c.png b/plugingui/resources/pushbutton_c.png index 557a233..1eaf142 100644 Binary files a/plugingui/resources/pushbutton_c.png and b/plugingui/resources/pushbutton_c.png differ diff --git a/plugingui/resources/pushbutton_l.png b/plugingui/resources/pushbutton_l.png index 87c6212..896764f 100644 Binary files a/plugingui/resources/pushbutton_l.png and b/plugingui/resources/pushbutton_l.png differ diff --git a/plugingui/resources/pushbutton_r.png b/plugingui/resources/pushbutton_r.png index fc0b986..6b0c4b9 100644 Binary files a/plugingui/resources/pushbutton_r.png and b/plugingui/resources/pushbutton_r.png differ diff --git a/plugingui/resources/pushbutton_t.png b/plugingui/resources/pushbutton_t.png index c70093e..358f4fa 100644 Binary files a/plugingui/resources/pushbutton_t.png and b/plugingui/resources/pushbutton_t.png differ diff --git a/plugingui/resources/pushbutton_tl.png b/plugingui/resources/pushbutton_tl.png index 51967c2..7a60b77 100644 Binary files a/plugingui/resources/pushbutton_tl.png and b/plugingui/resources/pushbutton_tl.png differ diff --git a/plugingui/resources/pushbutton_tr.png b/plugingui/resources/pushbutton_tr.png index 752c62e..aa13465 100644 Binary files a/plugingui/resources/pushbutton_tr.png and b/plugingui/resources/pushbutton_tr.png differ diff --git a/src/Makefile.am b/src/Makefile.am index 258c68d..386d373 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -28,6 +28,7 @@ EXTRA_DIST = \ audiofile.cc \ audioinputengine.cc \ audiooutputengine.cc \ + audioinputenginemidi.cc \ beatmapper.cc \ channel.cc \ channelmixer.cc \ diff --git a/src/Makefile.am.drumgizmo b/src/Makefile.am.drumgizmo index 54de5e3..428d2a7 100644 --- a/src/Makefile.am.drumgizmo +++ b/src/Makefile.am.drumgizmo @@ -1,4 +1,5 @@ DRUMGIZMO_SOURCES = \ + $(top_srcdir)/src/audioinputenginemidi.cc \ $(top_srcdir)/src/audiofile.cc \ $(top_srcdir)/src/channel.cc \ $(top_srcdir)/src/channelmixer.cc \ diff --git a/src/audioinputengine.h b/src/audioinputengine.h index c2d2e24..f2b49c0 100644 --- a/src/audioinputengine.h +++ b/src/audioinputengine.h @@ -37,6 +37,8 @@ class AudioInputEngine { public: virtual ~AudioInputEngine() {} + virtual bool isMidiEngine() { return false; } + virtual bool init(Instruments &instruments) = 0; virtual void setParm(std::string parm, std::string value) = 0; diff --git a/src/audioinputenginemidi.cc b/src/audioinputenginemidi.cc index 5986471..6aa9d45 100644 --- a/src/audioinputenginemidi.cc +++ b/src/audioinputenginemidi.cc @@ -26,15 +26,23 @@ */ #include "audioinputenginemidi.h" -void InputLV2::loadMidiMap(std::string f) +#include "midimapparser.h" + +#include + +void AudioInputEngineMidi::loadMidiMap(std::string f, Instruments &instruments) { + DEBUG(mmap, "loadMidiMap(%s, i.size() == %d)\n", f.c_str(), + instruments.size()); if(f == "") return; MidiMapParser p(f); if(p.parse()) {/*return false;*/} + + mmap.clear(); mmap.midimap = p.midimap; - for(size_t i = 0; i < instruments->size(); i++) { - mmap.instrmap[(*instruments)[i]->name()] = i; + for(size_t i = 0; i < instruments.size(); i++) { + mmap.instrmap[instruments[i]->name()] = i; } } diff --git a/src/audioinputenginemidi.h b/src/audioinputenginemidi.h index e52a54f..4cae78b 100644 --- a/src/audioinputenginemidi.h +++ b/src/audioinputenginemidi.h @@ -29,10 +29,17 @@ #include "audioinputengine.h" -class AudioInputEngineMidi { +#include + +#include "midimapper.h" +#include "instrument.h" + +class AudioInputEngineMidi : public AudioInputEngine { public: virtual ~AudioInputEngineMidi() {} + bool isMidiEngine() { return true; } + virtual bool init(Instruments &instruments) = 0; virtual void setParm(std::string parm, std::string value) = 0; @@ -44,10 +51,9 @@ public: virtual event_t *run(size_t pos, size_t len, size_t *nevents) = 0; virtual void post() = 0; - void loadMidiMap(std::string file); + void loadMidiMap(std::string file, Instruments &i); protected: - MidiMapper mmap; }; diff --git a/src/drumgizmo.cc b/src/drumgizmo.cc index 71346d4..219ec7b 100644 --- a/src/drumgizmo.cc +++ b/src/drumgizmo.cc @@ -37,6 +37,7 @@ #include #include "drumkitparser.h" +#include "audioinputenginemidi.h" DrumGizmo::DrumGizmo(AudioOutputEngine *o, AudioInputEngine *i) : loader(this), oe(o), ie(i) @@ -59,22 +60,22 @@ DrumGizmo::~DrumGizmo() /* * Add a message to the GUI message queue. */ -void DrumGizmo::sendMessage(Message *msg) +void DrumGizmo::sendGUIMessage(Message *msg) { - MutexAutolock l(message_mutex); - message_queue.push_back(msg); + MutexAutolock l(gui_message_mutex); + gui_message_queue.push_back(msg); } /* * Receive message from the engine. The caller takes over the memory. */ -Message *DrumGizmo::receiveMessage() +Message *DrumGizmo::receiveGUIMessage() { - MutexAutolock l(message_mutex); + MutexAutolock l(gui_message_mutex); Message *msg = NULL; - if(message_queue.size()) { - msg = message_queue.front(); - message_queue.pop_front(); + if(gui_message_queue.size()) { + msg = gui_message_queue.front(); + gui_message_queue.pop_front(); } return msg; } @@ -82,12 +83,48 @@ Message *DrumGizmo::receiveMessage() /* * Receive message from the engine without removing it from the queue. */ -Message *DrumGizmo::peekMessage() +Message *DrumGizmo::peekGUIMessage() { - MutexAutolock l(message_mutex); + MutexAutolock l(gui_message_mutex); Message *msg = NULL; - if(message_queue.size()) { - msg = message_queue.front(); + if(gui_message_queue.size()) { + msg = gui_message_queue.front(); + } + return msg; +} + +/* + * Add a message to the GUI message queue. + */ +void DrumGizmo::sendEngineMessage(Message *msg) +{ + MutexAutolock l(engine_message_mutex); + engine_message_queue.push_back(msg); +} + +/* + * Receive message from the engine. The caller takes over the memory. + */ +Message *DrumGizmo::receiveEngineMessage() +{ + MutexAutolock l(engine_message_mutex); + Message *msg = NULL; + if(engine_message_queue.size()) { + msg = engine_message_queue.front(); + engine_message_queue.pop_front(); + } + return msg; +} + +/* + * Receive message from the engine without removing it from the queue. + */ +Message *DrumGizmo::peekEngineMessage() +{ + MutexAutolock l(engine_message_mutex); + Message *msg = NULL; + if(engine_message_queue.size()) { + msg = engine_message_queue.front(); } return msg; } @@ -99,6 +136,9 @@ std::string DrumGizmo::drumkitfile() bool DrumGizmo::loadkit(std::string file) { + if(file == this->kitfile) return 1; + if(file == "") return 1; + this->kitfile = file; DEBUG(drumgizmo, "loadkit(%s)\n", kitfile.c_str()); @@ -111,6 +151,8 @@ bool DrumGizmo::loadkit(std::string file) loader.loadKit(&kit); + DEBUG(loadkit, "loadkit: Success\n"); + return true; } @@ -133,6 +175,38 @@ bool DrumGizmo::init(bool preload) return true; } +void DrumGizmo::handleEngineEvents() +{ + // DEBUG(msg, "handle?"); + + Message *msg = receiveEngineMessage(); + if(msg) { + DEBUG(msg, "got message."); + switch(msg->type()) { + case Message::LoadDrumKit: + { + DEBUG(msg, "got LoadDrumKitMessage message."); + LoadDrumKitMessage *m = (LoadDrumKitMessage*)msg; + loadkit(m->drumkitfile); + //init(true); + } + break; + case Message::LoadMidimap: + DEBUG(msg, "got LoadMidimapMessage message."); + if(!ie->isMidiEngine()) break; + { + AudioInputEngineMidi *aim = (AudioInputEngineMidi*)ie; + LoadMidimapMessage *m = (LoadMidimapMessage*)msg; + aim->loadMidiMap(m->midimapfile, kit.instruments); + } + break; + default: + break; + } + // delete msg; + } +} + bool DrumGizmo::run(size_t pos, sample_t *samples, size_t nsamples) { #if 0 @@ -156,6 +230,9 @@ bool DrumGizmo::run(size_t pos, sample_t *samples, size_t nsamples) } #endif + // Handle engine messages, at most one in each iteration: + handleEngineEvents(); + ie->pre(); oe->pre(nsamples); @@ -418,8 +495,6 @@ bool DrumGizmo::setConfigString(std::string cfg) return false; } - midimapfile = p.value("midimapfile"); - if(p.value("enable_velocity_modifier") != "") { Conf::enable_velocity_modifier = p.value("enable_velocity_modifier") == "true"; @@ -447,8 +522,21 @@ bool DrumGizmo::setConfigString(std::string cfg) std::string newkit = p.value("drumkitfile"); if(newkit != "" && drumkitfile() != newkit) { + /* if(!loadkit(p.values["drumkitfile"])) return false; init(true); + */ + LoadDrumKitMessage *msg = new LoadDrumKitMessage(); + msg->drumkitfile = newkit; + sendEngineMessage(msg); + } + + std::string newmidimap = p.value("midimapfile"); + if(midimapfile != newmidimap && newmidimap != "") { + midimapfile = newmidimap; + LoadMidimapMessage *msg = new LoadMidimapMessage(); + msg->midimapfile = midimapfile; + sendEngineMessage(msg); } return true; diff --git a/src/drumgizmo.h b/src/drumgizmo.h index b7df7b9..c03fd95 100644 --- a/src/drumgizmo.h +++ b/src/drumgizmo.h @@ -73,21 +73,41 @@ public: /* * Receive message from the engine. The caller takes over the memory. */ - Message *receiveMessage(); + Message *receiveGUIMessage(); /* * Receive message from the engine without removing it from the queue. */ - Message *peekMessage(); + Message *peekGUIMessage(); /* * Add a message to the GUI message queue. */ - void sendMessage(Message *msg); + void sendEngineMessage(Message *msg); + + /* + * Receive message from the engine. The caller takes over the memory. + */ + Message *receiveEngineMessage(); + + /* + * Receive message from the engine without removing it from the queue. + */ + Message *peekEngineMessage(); + + /* + * Add a message to the GUI message queue. + */ + void sendGUIMessage(Message *msg); private: - Mutex message_mutex; - std::list message_queue; + void handleEngineEvents(); + + Mutex gui_message_mutex; + std::list gui_message_queue; + + Mutex engine_message_mutex; + std::list engine_message_queue; DrumKitLoader loader; diff --git a/src/drumkitloader.cc b/src/drumkitloader.cc index c8d1cac..ed1a187 100644 --- a/src/drumkitloader.cc +++ b/src/drumkitloader.cc @@ -74,6 +74,7 @@ void DrumKitLoader::thread_main() DEBUG(loader, "before sem\n"); semaphore.wait(); DEBUG(loader, "after sem\n"); + fflush(stdout); if(quitit) return; @@ -107,11 +108,11 @@ void DrumKitLoader::thread_main() af->load(); loaded++; - LoadStatus *ls = new LoadStatus(); + LoadStatusMessage *ls = new LoadStatusMessage(); ls->number_of_files = count; ls->numer_of_files_loaded = loaded; ls->current_file = af->filename; - drumgizmo->sendMessage(ls); + drumgizmo->sendGUIMessage(ls); a++; } diff --git a/src/message.h b/src/message.h index 050162a..c37db12 100644 --- a/src/message.h +++ b/src/message.h @@ -30,13 +30,19 @@ class Message { public: typedef enum { - LoadStatus, + // Engine -> GUI Messages: + LoadStatus, // Signal GUI the current load status. + + // GUI -> Engine, Engine -> Engine Messages: + LoadDrumKit, // Signal engine to load drumkit. + LoadMidimap, // Signal engine to load midimap. } type_t; + virtual ~Message() {} virtual type_t type() = 0; }; -class LoadStatus : public Message { +class LoadStatusMessage : public Message { public: type_t type() { return Message::LoadStatus; } unsigned int number_of_files; @@ -44,4 +50,16 @@ public: std::string current_file; }; +class LoadDrumKitMessage : public Message { +public: + type_t type() { return Message::LoadDrumKit; } + std::string drumkitfile; +}; + +class LoadMidimapMessage : public Message { +public: + type_t type() { return Message::LoadMidimap; } + std::string midimapfile; +}; + #endif/*__DRUMGIZMO_MESSAGE_H__*/ diff --git a/src/midimapper.cc b/src/midimapper.cc index ca0cc21..d4ff94e 100644 --- a/src/midimapper.cc +++ b/src/midimapper.cc @@ -33,3 +33,9 @@ int MidiMapper::lookup(int note) if(instrmap.find(instr) == instrmap.end()) return -1; return instrmap[instr]; } + +void MidiMapper::clear() +{ + midimap.clear(); + instrmap.clear(); +} diff --git a/src/midimapper.h b/src/midimapper.h index 74c268c..7439c4b 100644 --- a/src/midimapper.h +++ b/src/midimapper.h @@ -35,6 +35,8 @@ typedef std::map instrmap_t; class MidiMapper { public: + void clear(); + int lookup(int note); instrmap_t instrmap; diff --git a/vst/Makefile.mingw32 b/vst/Makefile.mingw32 index d90f5c3..44b2ae2 100644 --- a/vst/Makefile.mingw32 +++ b/vst/Makefile.mingw32 @@ -10,6 +10,7 @@ top_srcdir=.. DG_BASE = .. DG_SRC = \ ${DG_BASE}/src/audiofile.cc \ + ${DG_BASE}/src/audioinputenginemidi.cc \ ${DG_BASE}/src/configuration.cc \ ${DG_BASE}/src/channel.cc \ ${DG_BASE}/src/channelmixer.cc \ diff --git a/vst/drumgizmo_vst.cc b/vst/drumgizmo_vst.cc index 8a24a0f..06e90bd 100644 --- a/vst/drumgizmo_vst.cc +++ b/vst/drumgizmo_vst.cc @@ -35,7 +35,7 @@ #define NUM_PROGRAMS 0 #define NUM_PARAMS 0 - +/* static void midimapHandler(void *ptr, const char* file) { DEBUG(vst, "midimapHandler\n"); @@ -45,7 +45,7 @@ static void midimapHandler(void *ptr, const char* file) drumgizmo->midimapfile = file; input->loadMidiMap(file); } - +*/ DGEditor::DGEditor(AudioEffect* effect) { DEBUG(dgeditor, "Create DGEditor\n"); @@ -60,7 +60,7 @@ bool DGEditor::open(void* ptr) if(plugingui) delete plugingui; plugingui = new PluginGUI(drumgizmo); - plugingui->setChangeMidimapCallback(midimapHandler, dgeff); + // plugingui->setChangeMidimapCallback(midimapHandler, dgeff); // plugingui->show(); return true; @@ -196,7 +196,7 @@ VstInt32 DrumGizmoVst::setChunk(void *data, VstInt32 byteSize, bool isPreset) DEBUG(vst, "Using Drumkit: %s\n", drumgizmo->kitfile.c_str()); DEBUG(vst, "Using Midimap: %s\n", drumgizmo->midimapfile.c_str()); - input->loadMidiMap(drumgizmo->midimapfile); + // input->loadMidiMap(drumgizmo->midimapfile); /* drumgizmo->loadkit("z:/c/drumgizmo/kits/test/test.xml"); diff --git a/vst/input_vst.cc b/vst/input_vst.cc index 5cc73f9..53de387 100644 --- a/vst/input_vst.cc +++ b/vst/input_vst.cc @@ -106,20 +106,3 @@ void InputVST::processEvents(VstEvents* ev) event++; } } - -void InputVST::loadMidiMap(std::string f) -{ - DEBUG(inputvst, "load midi map %s\n", f.c_str()); - - MidiMapParser p(f); - if(p.parse()) { - ERR(inputvst, "Error loading midimap: %s\n", f.c_str()); - return; - } - mmap.midimap = p.midimap; - - for(size_t i = 0; i < instruments->size(); i++) { - DEBUG(inputvst, "Mapping %s to %d\n", (*instruments)[i]->name().c_str(), i); - mmap.instrmap[(*instruments)[i]->name()] = i; - } -} diff --git a/vst/input_vst.h b/vst/input_vst.h index 668f39c..612add6 100644 --- a/vst/input_vst.h +++ b/vst/input_vst.h @@ -27,12 +27,11 @@ #ifndef __DRUMGIZMO_INPUT_VST_H__ #define __DRUMGIZMO_INPUT_VST_H__ -#include -#include +#include #include -class InputVST : public AudioInputEngine { +class InputVST : public AudioInputEngineMidi { public: InputVST(); virtual ~InputVST(); @@ -50,9 +49,6 @@ public: void processEvents(VstEvents* ev); - void loadMidiMap(std::string file); - MidiMapper mmap; - private: event_t *list; size_t listsize; -- cgit v1.2.3