/[svn]/gigedit/trunk/src/plugin/linuxsamplerplugin.cpp
ViewVC logotype

Contents of /gigedit/trunk/src/plugin/linuxsamplerplugin.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2903 - (show annotations) (download)
Tue May 3 14:08:34 2016 UTC (2 years, 6 months ago) by schoenebeck
File size: 7920 byte(s)
* Script Editor: altered keyboard shortcut Ctrl-X to Ctrl-Q (to avoid
  masking the common cut text shortcut).
* Script Editor: if editor is used in live-mode, inform the sampler that
  it needs to automatically reload the script after the script has been
  altered and applied with the script editor.
* Bumped version (1.0.0.svn13).

1 /*
2 * Copyright (C) 2007 - 2015 Andreas Persson
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2, or (at
7 * your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with program; see the file COPYING. If not, write to the Free
16 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
17 * 02110-1301 USA.
18 */
19
20 #include "linuxsamplerplugin.h"
21
22 #include <linuxsampler/plugins/InstrumentEditorFactory.h>
23 #include <linuxsampler/engines/Engine.h>
24 #include <linuxsampler/engines/EngineChannel.h>
25 #include "../gigedit/gigedit.h"
26 #include "../gigedit/global.h"
27
28 #include <iostream>
29 #include <sigc++/bind.h>
30 #include <glibmm/main.h>
31
32 REGISTER_INSTRUMENT_EDITOR(LinuxSamplerPlugin)
33
34 LinuxSamplerPlugin::LinuxSamplerPlugin() {
35 pApp = new GigEdit;
36 }
37
38 LinuxSamplerPlugin::~LinuxSamplerPlugin() {
39 if (pApp) delete static_cast<GigEdit*>(pApp);
40 }
41
42 int LinuxSamplerPlugin::Main(void* pInstrument, String sTypeName, String sTypeVersion, void* /*pUserData*/) {
43 return Main(pInstrument, sTypeName, sTypeVersion);
44 }
45
46 int LinuxSamplerPlugin::Main(void* pInstrument, String sTypeName, String sTypeVersion) {
47 std::cout << "Entered Gigedit Main() loop :)\n" << std::flush;
48 gig::Instrument* pGigInstr = static_cast<gig::Instrument*>(pInstrument);
49 GigEdit* app = static_cast<GigEdit*>(pApp);
50
51 // connect notification signals
52 app->signal_file_structure_to_be_changed().connect(
53 sigc::bind(
54 sigc::mem_fun(
55 *this, &LinuxSamplerPlugin::NotifyDataStructureToBeChanged
56 ),
57 "gig::File"
58 )
59 );
60 app->signal_file_structure_changed().connect(
61 sigc::bind(
62 sigc::mem_fun(
63 *this, &LinuxSamplerPlugin::NotifyDataStructureChanged
64 ),
65 "gig::File"
66 )
67 );
68 app->signal_samples_to_be_removed().connect(
69 sigc::mem_fun(*this, &LinuxSamplerPlugin::__onSamplesToBeRemoved)
70 );
71 app->signal_samples_removed().connect(
72 sigc::mem_fun(*this, &LinuxSamplerPlugin::NotifySamplesRemoved)
73 );
74 app->signal_region_to_be_changed().connect(
75 sigc::bind(
76 sigc::mem_fun(
77 *this, &LinuxSamplerPlugin::NotifyDataStructureToBeChanged
78 ),
79 "gig::Region"
80 )
81 );
82 app->signal_region_changed().connect(
83 sigc::bind(
84 sigc::mem_fun(
85 *this, &LinuxSamplerPlugin::NotifyDataStructureChanged
86 ),
87 "gig::Region"
88 )
89 );
90 app->signal_dimreg_to_be_changed().connect(
91 sigc::bind(
92 sigc::mem_fun(
93 *this, &LinuxSamplerPlugin::NotifyDataStructureToBeChanged
94 ),
95 "gig::DimensionRegion"
96 )
97 );
98 app->signal_dimreg_changed().connect(
99 sigc::bind(
100 sigc::mem_fun(
101 *this, &LinuxSamplerPlugin::NotifyDataStructureChanged
102 ),
103 "gig::DimensionRegion"
104 )
105 );
106 app->signal_sample_changed().connect(
107 sigc::bind(
108 sigc::mem_fun(
109 *this, &LinuxSamplerPlugin::NotifyDataStructureChanged
110 ),
111 "gig::Sample"
112 )
113 );
114 app->signal_sample_ref_changed().connect(
115 sigc::mem_fun(*this, &LinuxSamplerPlugin::NotifySampleReferenceChanged)
116 );
117
118 app->signal_keyboard_key_hit().connect(
119 sigc::mem_fun(*this, &LinuxSamplerPlugin::__onVirtualKeyboardKeyHit)
120 );
121 app->signal_keyboard_key_released().connect(
122 sigc::mem_fun(*this, &LinuxSamplerPlugin::__onVirtualKeyboardKeyReleased)
123 );
124 app->signal_switch_sampler_instrument().connect(
125 sigc::mem_fun(*this, &LinuxSamplerPlugin::__requestSamplerToSwitchInstrument)
126 );
127 app->signal_script_to_be_changed.connect(
128 sigc::bind(
129 sigc::mem_fun(
130 *this, &LinuxSamplerPlugin::NotifyDataStructureToBeChanged
131 ),
132 "gig::Script"
133 )
134 );
135 app->signal_script_changed.connect(
136 sigc::bind(
137 sigc::mem_fun(
138 *this, &LinuxSamplerPlugin::NotifyDataStructureChanged
139 ),
140 "gig::Script"
141 )
142 );
143
144 // register a timeout job to gigedit's main loop, so we can poll the
145 // the sampler periodically for MIDI events (I HOPE it works on all
146 // archs, because gigedit is actually running in another thread than
147 // the one that is calling this timeout handler register code)
148 const Glib::RefPtr<Glib::TimeoutSource> timeout_source =
149 Glib::TimeoutSource::create(100); // poll every 100ms
150 timeout_source->connect(
151 sigc::mem_fun(this, &LinuxSamplerPlugin::__onPollPeriod)
152 );
153 timeout_source->attach(Glib::MainContext::get_default());
154
155 // run gigedit application
156 return app->run(pGigInstr);
157 }
158
159 bool LinuxSamplerPlugin::__onPollPeriod() {
160 #if HAVE_LINUXSAMPLER_VIRTUAL_MIDI_DEVICE
161 GigEdit* app = static_cast<GigEdit*>(pApp);
162 if (!NotesChanged()) return true;
163 for (int iKey = 0; iKey < 128; iKey++)
164 if (NoteChanged(iKey))
165 NoteIsActive(iKey) ?
166 app->on_note_on_event(iKey, NoteOnVelocity(iKey)) :
167 app->on_note_off_event(iKey, NoteOffVelocity(iKey));
168 return true;
169 #else
170 return false;
171 #endif
172 }
173
174 void LinuxSamplerPlugin::__onSamplesToBeRemoved(std::list<gig::Sample*> lSamples) {
175 // we have to convert the gig::Sample* list to a void* list first
176 std::set<void*> samples;
177 for (
178 std::list<gig::Sample*>::iterator iter = lSamples.begin();
179 iter != lSamples.end(); ++iter
180 ) samples.insert((void*)*iter);
181 // finally send notification to sampler
182 NotifySamplesToBeRemoved(samples);
183 }
184
185 void LinuxSamplerPlugin::__onVirtualKeyboardKeyHit(int Key, int Velocity) {
186 #if HAVE_LINUXSAMPLER_VIRTUAL_MIDI_DEVICE
187 SendNoteOnToSampler(Key, Velocity);
188 #endif
189 }
190
191 void LinuxSamplerPlugin::__onVirtualKeyboardKeyReleased(int Key, int Velocity) {
192 #if HAVE_LINUXSAMPLER_VIRTUAL_MIDI_DEVICE
193 SendNoteOffToSampler(Key, Velocity);
194 #endif
195 }
196
197 void LinuxSamplerPlugin::__requestSamplerToSwitchInstrument(gig::Instrument* pInstrument) {
198 if (!pInstrument) return;
199
200 LinuxSampler::EngineChannel* pEngineChannel = GetEngineChannel();
201 if (!pEngineChannel) return;
202
203 LinuxSampler::Engine* pEngine = pEngineChannel->GetEngine();
204 if (!pEngine) return;
205
206 LinuxSampler::InstrumentManager* pInstrumentManager = pEngine->GetInstrumentManager();
207 if (!pInstrumentManager) return;
208
209 gig::File* pFile = (gig::File*) pInstrument->GetParent();
210
211 // resolve instrument's index number in its gig file
212 int index = -1;
213 for (int i = 0; pFile->GetInstrument(i); ++i) {
214 if (pFile->GetInstrument(i) == pInstrument) {
215 index = i;
216 break;
217 }
218 }
219 if (index < 0) return;
220
221 LinuxSampler::InstrumentManager::instrument_id_t id;
222 id.FileName = pFile->GetFileName();
223 id.Index = index;
224 pInstrumentManager->LoadInstrumentInBackground(id, pEngineChannel);
225 }
226
227 bool LinuxSamplerPlugin::IsTypeSupported(String sTypeName, String sTypeVersion) {
228 return sTypeName == gig::libraryName() &&
229 sTypeVersion == gig::libraryVersion();
230 }
231
232 String LinuxSamplerPlugin::Name() {
233 return "gigedit";
234 }
235
236 String LinuxSamplerPlugin::Version() {
237 return VERSION; // gigedit's version
238 }
239
240 String LinuxSamplerPlugin::Description() {
241 return "Gigedit is an instrument editor for gig files.";
242 }

  ViewVC Help
Powered by ViewVC