summaryrefslogtreecommitdiff
path: root/plugin/drumgizmo_plugin.cc
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/drumgizmo_plugin.cc')
-rw-r--r--plugin/drumgizmo_plugin.cc305
1 files changed, 305 insertions, 0 deletions
diff --git a/plugin/drumgizmo_plugin.cc b/plugin/drumgizmo_plugin.cc
new file mode 100644
index 0000000..471bacb
--- /dev/null
+++ b/plugin/drumgizmo_plugin.cc
@@ -0,0 +1,305 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * drumgizmo_lv2.cc
+ *
+ * Wed Mar 2 17:31:32 CET 2016
+ * Copyright 2016 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 "drumgizmo_plugin.h"
+
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include <iostream>
+
+#include <midievent.h>
+
+#ifdef LV2
+// Entry point for lv2 plugin instantiation.
+PluginLV2* createEffectInstance()
+{
+ return new DrumGizmoPlugin();
+}
+#endif
+
+#ifdef VST
+// Entry point for vst plugin instantiation.
+AudioEffect* createEffectInstance(audioMasterCallback audioMaster)
+{
+ return new DrumGizmoPlugin(audioMaster);
+}
+
+DrumGizmoPlugin::DrumGizmoPlugin(audioMasterCallback audioMaster)
+ : PluginVST(audioMaster)
+#else
+DrumGizmoPlugin::DrumGizmoPlugin()
+#endif
+{
+ drumgizmo = std::make_shared<DrumGizmo>(&output, &input);
+ resizeWindow(370, 330);
+ drumgizmo->setFreeWheel(true);
+ drumgizmo->setSamplerate(44100);
+ drumgizmo->setFrameSize(2048);
+}
+
+void DrumGizmoPlugin::onFreeWheelChange(bool freewheel)
+{
+ drumgizmo->setFreeWheel(freewheel);
+}
+
+void DrumGizmoPlugin::onSamplerateChange(float samplerate)
+{
+ drumgizmo->setSamplerate(samplerate);
+}
+
+void DrumGizmoPlugin::onFramesizeChange(size_t framesize)
+{
+ drumgizmo->setFrameSize(framesize);
+}
+
+void DrumGizmoPlugin::onActiveChange(bool active)
+{
+}
+
+std::string DrumGizmoPlugin::onStateSave()
+{
+ return drumgizmo->configString();
+}
+
+void DrumGizmoPlugin::onStateRestore(const std::string& config)
+{
+ drumgizmo->setConfigString(config);
+}
+
+size_t DrumGizmoPlugin::getNumberOfMidiInputs()
+{
+ return 1;
+}
+
+size_t DrumGizmoPlugin::getNumberOfMidiOutputs()
+{
+ return 0;
+}
+
+size_t DrumGizmoPlugin::getNumberOfAudioInputs()
+{
+ return 0;
+}
+
+size_t DrumGizmoPlugin::getNumberOfAudioOutputs()
+{
+ return 16;
+}
+
+std::string DrumGizmoPlugin::getId()
+{
+ return "DrumGizmo";
+}
+static float g_samples[16* 4096];
+void DrumGizmoPlugin::process(size_t pos,
+ const std::vector<MidiEvent>& input_events,
+ std::vector<MidiEvent>& output_events,
+ const std::vector<const float*>& input_samples,
+ const std::vector<float*>& output_samples,
+ size_t count)
+{
+ this->input_events = &input_events;
+ this->output_samples = &output_samples;
+
+ drumgizmo->run(pos, g_samples, count);
+
+ this->input_events = nullptr;
+ this->output_samples = nullptr;
+}
+
+bool DrumGizmoPlugin::hasGUI()
+{
+ return true;
+}
+
+void DrumGizmoPlugin::createWindow(void *parent)
+{
+ plugin_gui = std::make_shared<GUI::PluginGUI>(parent);
+ resizeWindow(370, 330);
+ onShowWindow();
+}
+
+void DrumGizmoPlugin::onDestroyWindow()
+{
+ plugin_gui = nullptr;
+}
+
+void DrumGizmoPlugin::onShowWindow()
+{
+ plugin_gui->show();
+}
+
+void DrumGizmoPlugin::onHideWindow()
+{
+ plugin_gui->hide();
+}
+
+void DrumGizmoPlugin::onIdle()
+{
+ plugin_gui->processEvents();
+}
+
+void DrumGizmoPlugin::resizeWindow(size_t width, size_t height)
+{
+}
+
+void DrumGizmoPlugin::closeWindow()
+{
+}
+
+
+//
+// Input Engine
+//
+
+DrumGizmoPlugin::Input::Input(DrumGizmoPlugin& plugin)
+ : plugin(plugin)
+{
+}
+
+bool DrumGizmoPlugin::Input::init(Instruments &instruments)
+{
+ this->instruments = &instruments;
+ return true;
+}
+
+void DrumGizmoPlugin::Input::setParm(std::string parm, std::string value)
+{
+}
+
+bool DrumGizmoPlugin::Input::start()
+{
+ return true;
+}
+
+void DrumGizmoPlugin::Input::stop()
+{
+}
+
+void DrumGizmoPlugin::Input::pre()
+{
+}
+
+event_t *DrumGizmoPlugin::Input::run(size_t pos, size_t len, size_t* nevents)
+{
+
+ assert(plugin.input_events);
+
+ event_t* list;
+ size_t listsize;
+
+ list = (event_t*)malloc(sizeof(event_t) * plugin.input_events->size());
+ listsize = 0;
+
+ for(auto& event : *plugin.input_events)
+ {
+ if(event.type != MidiEventType::NoteOn)
+ {
+ continue;
+ }
+
+ int i = mmap.lookup(event.key);
+ if(event.velocity && (i != -1))
+ {
+ list[listsize].type = TYPE_ONSET;
+ list[listsize].instrument = i;
+ list[listsize].velocity = (float)event.velocity / 127.0f;
+ list[listsize].offset = event.getTime();
+ ++listsize;
+ }
+ }
+
+ *nevents = listsize;
+ return list;
+}
+
+void DrumGizmoPlugin::Input::post()
+{
+}
+
+
+//
+// Output Engine
+//
+
+DrumGizmoPlugin::Output::Output(DrumGizmoPlugin& plugin)
+ : plugin(plugin)
+{
+}
+
+bool DrumGizmoPlugin::Output::init(Channels channels)
+{
+ return true;
+}
+
+void DrumGizmoPlugin::Output::setParm(std::string parm, std::string value)
+{
+}
+
+bool DrumGizmoPlugin::Output::start()
+{
+ return true;
+}
+
+void DrumGizmoPlugin::Output::stop()
+{
+}
+
+void DrumGizmoPlugin::Output::pre(size_t nsamples)
+{
+}
+
+void DrumGizmoPlugin::Output::run(int ch, sample_t *samples, size_t nsamples)
+{
+// assert(false);
+}
+
+void DrumGizmoPlugin::Output::post(size_t nsamples)
+{
+}
+
+sample_t* DrumGizmoPlugin::Output::getBuffer(int ch)
+{
+ assert(plugin.output_samples);
+
+ if((std::size_t)ch >= plugin.output_samples->size())
+ {
+ return nullptr;
+ }
+
+ assert((*plugin.output_samples)[ch]);
+
+ return (*plugin.output_samples)[ch];
+}
+
+size_t DrumGizmoPlugin::Output::getBufferSize()
+{
+ return plugin.getFramesize();
+}