diff options
author | Bent Bisballe Nyeng <deva@aasimon.org> | 2013-04-04 21:19:58 +0200 |
---|---|---|
committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2013-04-04 21:19:58 +0200 |
commit | 77b3943b751bed43d230de6db322a750bfd1fc8e (patch) | |
tree | cd7d98bc8c06c660558a52f2b6b6ed73982efdf2 | |
parent | 0e436ebcd7faacb557ab94952765cb6bcfd7d259 (diff) |
New message system. New common midi input class. Some compiler warning fixes. New ListBoxBasic class used by both LustBox and ComboBox. New embossed font.
44 files changed, 1448 insertions, 497 deletions
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 <audioinputengine.h> -#include <midimapper.h> +#include <audioinputenginemidi.h> #include <lv2/lv2plug.in/ns/ext/event/event-helpers.h> -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; }; @@ -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 <X11/Xlib.h> #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 <vector> #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<struct item> 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 <stdio.h> + +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 <string.h> +#include <vector> + +#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<struct item> 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 Binary files differindex c06eb04..b3f24a6 100644 --- a/plugingui/resources/pushbutton_b.png +++ b/plugingui/resources/pushbutton_b.png diff --git a/plugingui/resources/pushbutton_bl.png b/plugingui/resources/pushbutton_bl.png Binary files differindex 3d92a1c..340e8b8 100644 --- a/plugingui/resources/pushbutton_bl.png +++ b/plugingui/resources/pushbutton_bl.png diff --git a/plugingui/resources/pushbutton_br.png b/plugingui/resources/pushbutton_br.png Binary files differindex 50519f1..f5814f2 100644 --- a/plugingui/resources/pushbutton_br.png +++ b/plugingui/resources/pushbutton_br.png diff --git a/plugingui/resources/pushbutton_c.png b/plugingui/resources/pushbutton_c.png Binary files differindex 557a233..1eaf142 100644 --- a/plugingui/resources/pushbutton_c.png +++ b/plugingui/resources/pushbutton_c.png diff --git a/plugingui/resources/pushbutton_l.png b/plugingui/resources/pushbutton_l.png Binary files differindex 87c6212..896764f 100644 --- a/plugingui/resources/pushbutton_l.png +++ b/plugingui/resources/pushbutton_l.png diff --git a/plugingui/resources/pushbutton_r.png b/plugingui/resources/pushbutton_r.png Binary files differindex fc0b986..6b0c4b9 100644 --- a/plugingui/resources/pushbutton_r.png +++ b/plugingui/resources/pushbutton_r.png diff --git a/plugingui/resources/pushbutton_t.png b/plugingui/resources/pushbutton_t.png Binary files differindex c70093e..358f4fa 100644 --- a/plugingui/resources/pushbutton_t.png +++ b/plugingui/resources/pushbutton_t.png diff --git a/plugingui/resources/pushbutton_tl.png b/plugingui/resources/pushbutton_tl.png Binary files differindex 51967c2..7a60b77 100644 --- a/plugingui/resources/pushbutton_tl.png +++ b/plugingui/resources/pushbutton_tl.png diff --git a/plugingui/resources/pushbutton_tr.png b/plugingui/resources/pushbutton_tr.png Binary files differindex 752c62e..aa13465 100644 --- a/plugingui/resources/pushbutton_tr.png +++ b/plugingui/resources/pushbutton_tr.png 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 <hugin.hpp> + +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 <string> + +#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 <hugin.hpp> #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 *> message_queue; + void handleEngineEvents(); + + Mutex gui_message_mutex; + std::list<Message *> gui_message_queue; + + Mutex engine_message_mutex; + std::list<Message *> 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<std::string, int> 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 <audioinputengine.h> -#include <midimapper.h> +#include <audioinputenginemidi.h> #include <public.sdk/source/vst2.x/audioeffectx.h> -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; |