1 /*
2 Virtual Piano test using the MIDI Sequencer C++ library
3 Copyright (C) 2006-2021 Pedro Lopez-Cabanillas <plcl@users.sf.net>
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19 #include "vpianosettings.h"
20 #include <QDir>
21 #include <QFileInfo>
22 #include <drumstick/settingsfactory.h>
23
24 using namespace drumstick::rt;
25 using namespace drumstick::widgets;
26
VPianoSettings(QObject * parent)27 VPianoSettings::VPianoSettings(QObject *parent) : QObject(parent)
28 {
29 ResetDefaults();
30 }
31
instance()32 VPianoSettings* VPianoSettings::instance()
33 {
34 static VPianoSettings inst;
35 return &inst;
36 }
37
ResetDefaults()38 void VPianoSettings::ResetDefaults()
39 {
40 m_midiThru = false;
41 m_advanced = false;
42 m_inChannel = 0;
43 m_outChannel = 0;
44 m_velocity = 100;
45 m_baseOctave = 1;
46 m_numKeys = 88;
47 m_startingKey = 9;
48 m_defaultsMap = QVariantMap{
49 { BackendManager::QSTR_DRUMSTICKRT_PUBLICNAMEIN, QStringLiteral("Virtual Piano IN")},
50 { BackendManager::QSTR_DRUMSTICKRT_PUBLICNAMEOUT, QStringLiteral("Virtual Piano OUT")}
51 };
52 emit ValuesChanged();
53 }
54
ReadSettings()55 void VPianoSettings::ReadSettings()
56 {
57 SettingsFactory settings;
58 internalRead(*settings.getQSettings());
59 }
60
SaveSettings()61 void VPianoSettings::SaveSettings()
62 {
63 SettingsFactory settings;
64 internalSave(*settings.getQSettings());
65 }
66
ReadFromFile(const QString & filepath)67 void VPianoSettings::ReadFromFile(const QString &filepath)
68 {
69 QSettings settings(filepath, QSettings::IniFormat);
70 internalRead(settings);
71 }
72
SaveToFile(const QString & filepath)73 void VPianoSettings::SaveToFile(const QString &filepath)
74 {
75 QSettings settings(filepath, QSettings::IniFormat);
76 internalSave(settings);
77 }
78
internalRead(QSettings & settings)79 void VPianoSettings::internalRead(QSettings &settings)
80 {
81 const QStringList STD_NAMES_S{"do", "do♯", "re", "re♯", "mi", "fa", "fa♯", "sol", "sol♯", "la", "la♯", "si"};
82 const QStringList STD_NAMES_F{"do", "re♭", "re", "mi♭", "mi", "fa", "sol♭", "sol", "la♭", "la", "si♭", "si"};
83
84 settings.beginGroup("Window");
85 m_geometry = settings.value("Geometry").toByteArray();
86 m_state = settings.value("State").toByteArray();
87 settings.endGroup();
88
89 settings.beginGroup(BackendManager::QSTR_DRUMSTICKRT_GROUP);
90 QStringList keys = settings.allKeys();
91 for(auto it = m_defaultsMap.begin(); it != m_defaultsMap.end(); ++it) {
92 if (!keys.contains(it.key())) {
93 keys.append(it.key());
94 }
95 }
96 for(const QString& key : qAsConst(keys)) {
97 QVariant defval = m_defaultsMap.contains(key) ? m_defaultsMap[key] : QString();
98 m_settingsMap.insert(key, settings.value(key, defval));
99 }
100 settings.endGroup();
101
102 settings.beginGroup("Connections");
103 m_lastInputBackend = settings.value("inputBackend").toString();
104 m_lastOutputBackend = settings.value("outputBackend").toString();
105 m_lastInputConnection = settings.value("inputConnection").toString();
106 m_lastOutputConnection = settings.value("outputConnection").toString();
107 m_midiThru = settings.value("midiThru", false).toBool();
108 m_advanced = settings.value("advanced", false).toBool();
109 settings.endGroup();
110
111 settings.beginGroup("Preferences");
112 setInChannel(settings.value("inputChannel", 0).toInt());
113 setOutChannel(settings.value("outputChannel", 0).toInt());
114 setVelocity(settings.value("velocity", 100).toInt());
115 setBaseOctave(settings.value("baseOctave", 1).toInt());
116 setNumKeys(settings.value("numKeys", 88).toInt());
117 setStartingKey(settings.value("startingKey", 9).toInt());
118 setBaseOctave(settings.value("baseOctave", 1).toInt());
119 setNumKeys(settings.value("numKeys", 88).toInt());
120 setStartingKey(settings.value("startingKey", 9).toInt());
121 settings.endGroup();
122
123 settings.beginGroup("TextSettings");
124 QFont f = QGuiApplication::font();
125 f.setPointSize(50);
126 if (f.fromString(settings.value("namesFont", f.toString()).toString())) {
127 setNamesFont(f);
128 }
129 setNamesOrientation(static_cast<LabelOrientation>(settings.value("namesOrientation", HorizontalOrientation).toInt()));
130 setNamesVisibility(static_cast<LabelVisibility>(settings.value("namesVisibility", ShowNever).toInt()));
131 setNamesAlterations(static_cast<LabelAlteration>(settings.value("namesAlteration", ShowSharps).toInt()));
132 setNamingPolicy(static_cast<LabelNaming>(settings.value("namingPolicy", StandardNames).toInt()));
133 setNamesOctave(static_cast<LabelCentralOctave>(settings.value("namesOctave", OctaveC4).toInt()));
134 setNames_sharps(settings.value("names_sharps", STD_NAMES_S).toStringList());
135 setNames_flats(settings.value("names_flats", STD_NAMES_F).toStringList());
136 setInvertedKeys(settings.value("inverted_keys", false).toBool());
137 settings.endGroup();
138
139 emit ValuesChanged();
140 }
141
internalSave(QSettings & settings)142 void VPianoSettings::internalSave(QSettings &settings)
143 {
144 settings.beginGroup("Window");
145 settings.setValue("Geometry", m_geometry);
146 settings.setValue("State", m_state);
147 settings.endGroup();
148
149 settings.beginGroup(BackendManager::QSTR_DRUMSTICKRT_GROUP);
150 for (auto it = m_settingsMap.begin(); it != m_settingsMap.end(); ++it) {
151 settings.setValue(it.key(), it.value());
152 }
153 settings.endGroup();
154
155 settings.beginGroup("Connections");
156 settings.setValue("inputBackend", m_lastInputBackend);
157 settings.setValue("outputBackend", m_lastOutputBackend);
158 settings.setValue("inputConnection", m_lastInputConnection);
159 settings.setValue("outputConnection", m_lastOutputConnection);
160 settings.setValue("midiThru", m_midiThru);
161 settings.setValue("advanced", m_advanced);
162 settings.endGroup();
163
164 settings.beginGroup("Preferences");
165 settings.setValue("inputChannel", m_inChannel);
166 settings.setValue("outputChannel", m_outChannel);
167 settings.setValue("velocity", m_velocity);
168 settings.setValue("baseOctave", m_baseOctave);
169 settings.setValue("numKeys", m_numKeys);
170 settings.setValue("startingKey", m_startingKey);
171 settings.endGroup();
172
173 settings.beginGroup("TextSettings");
174 settings.setValue("namesFont", m_namesFont.toString());
175 settings.setValue("namesOrientation", m_namesOrientation);
176 settings.setValue("namesVisibility", m_namesVisibility);
177 settings.setValue("namesAlteration", m_namesAlteration);
178 settings.setValue("namingPolicy", m_namingPolicy);
179 settings.setValue("namesOctave", m_namesOctave);
180 settings.setValue("names_sharps", m_names_sharps);
181 settings.setValue("names_flats", m_names_flats);
182 settings.setValue("inverted_keys", m_invertedKeys);
183 settings.endGroup();
184
185 settings.sync();
186 }
187
invertedKeys() const188 bool VPianoSettings::invertedKeys() const
189 {
190 return m_invertedKeys;
191 }
192
setInvertedKeys(bool newInvertedKeys)193 void VPianoSettings::setInvertedKeys(bool newInvertedKeys)
194 {
195 m_invertedKeys = newInvertedKeys;
196 }
197
names_flats() const198 QStringList VPianoSettings::names_flats() const
199 {
200 return m_names_flats;
201 }
202
setNames_flats(const QStringList & names_flats)203 void VPianoSettings::setNames_flats(const QStringList &names_flats)
204 {
205 m_names_flats = names_flats;
206 }
207
names_sharps() const208 QStringList VPianoSettings::names_sharps() const
209 {
210 return m_names_sharps;
211 }
212
setNames_sharps(const QStringList & names_sharps)213 void VPianoSettings::setNames_sharps(const QStringList &names_sharps)
214 {
215 m_names_sharps = names_sharps;
216 }
217
namingPolicy() const218 LabelNaming VPianoSettings::namingPolicy() const
219 {
220 return m_namingPolicy;
221 }
222
setNamingPolicy(const LabelNaming namingPolicy)223 void VPianoSettings::setNamingPolicy(const LabelNaming namingPolicy)
224 {
225 m_namingPolicy = namingPolicy;
226 }
227
namesOctave() const228 LabelCentralOctave VPianoSettings::namesOctave() const
229 {
230 return m_namesOctave;
231 }
232
setNamesOctave(const LabelCentralOctave namesOctave)233 void VPianoSettings::setNamesOctave(const LabelCentralOctave namesOctave)
234 {
235 m_namesOctave = namesOctave;
236 }
237
namesFont() const238 QFont VPianoSettings::namesFont() const
239 {
240 return m_namesFont;
241 }
242
setNamesFont(const QFont & namesFont)243 void VPianoSettings::setNamesFont(const QFont &namesFont)
244 {
245 m_namesFont = namesFont;
246 }
247
alterations() const248 LabelAlteration VPianoSettings::alterations() const
249 {
250 return m_namesAlteration;
251 }
252
setNamesAlterations(const LabelAlteration alterations)253 void VPianoSettings::setNamesAlterations(const LabelAlteration alterations)
254 {
255 m_namesAlteration = alterations;
256 }
257
namesVisibility() const258 LabelVisibility VPianoSettings::namesVisibility() const
259 {
260 return m_namesVisibility;
261 }
262
setNamesVisibility(const LabelVisibility namesVisibility)263 void VPianoSettings::setNamesVisibility(const LabelVisibility namesVisibility)
264 {
265 m_namesVisibility = namesVisibility;
266 }
267
namesOrientation() const268 LabelOrientation VPianoSettings::namesOrientation() const
269 {
270 return m_namesOrientation;
271 }
272
setNamesOrientation(const LabelOrientation namesOrientation)273 void VPianoSettings::setNamesOrientation(const LabelOrientation namesOrientation)
274 {
275 m_namesOrientation = namesOrientation;
276 }
277
settingsMap() const278 QVariantMap VPianoSettings::settingsMap() const
279 {
280 return m_settingsMap;
281 }
282
startingKey() const283 int VPianoSettings::startingKey() const
284 {
285 return m_startingKey;
286 }
287
setStartingKey(int startingKey)288 void VPianoSettings::setStartingKey(int startingKey)
289 {
290 m_startingKey = startingKey;
291 }
292
numKeys() const293 int VPianoSettings::numKeys() const
294 {
295 return m_numKeys;
296 }
297
setNumKeys(int numKeys)298 void VPianoSettings::setNumKeys(int numKeys)
299 {
300 m_numKeys = numKeys;
301 }
302
baseOctave() const303 int VPianoSettings::baseOctave() const
304 {
305 return m_baseOctave;
306 }
307
setBaseOctave(int baseOctave)308 void VPianoSettings::setBaseOctave(int baseOctave)
309 {
310 m_baseOctave = baseOctave;
311 }
312
velocity() const313 int VPianoSettings::velocity() const
314 {
315 return m_velocity;
316 }
317
setVelocity(int velocity)318 void VPianoSettings::setVelocity(int velocity)
319 {
320 m_velocity = velocity;
321 }
322
outChannel() const323 int VPianoSettings::outChannel() const
324 {
325 return m_outChannel;
326 }
327
setOutChannel(int outChannel)328 void VPianoSettings::setOutChannel(int outChannel)
329 {
330 m_outChannel = outChannel;
331 }
332
inChannel() const333 int VPianoSettings::inChannel() const
334 {
335 return m_inChannel;
336 }
337
setInChannel(int inChannel)338 void VPianoSettings::setInChannel(int inChannel)
339 {
340 m_inChannel = inChannel;
341 }
342
advanced() const343 bool VPianoSettings::advanced() const
344 {
345 return m_advanced;
346 }
347
setAdvanced(bool advanced)348 void VPianoSettings::setAdvanced(bool advanced)
349 {
350 m_advanced = advanced;
351 }
352
midiThru() const353 bool VPianoSettings::midiThru() const
354 {
355 return m_midiThru;
356 }
357
setMidiThru(bool midiThru)358 void VPianoSettings::setMidiThru(bool midiThru)
359 {
360 m_midiThru = midiThru;
361 }
362
lastOutputConnection() const363 QString VPianoSettings::lastOutputConnection() const
364 {
365 return m_lastOutputConnection;
366 }
367
setLastOutputConnection(const QString & lastOutputConnection)368 void VPianoSettings::setLastOutputConnection(const QString &lastOutputConnection)
369 {
370 m_lastOutputConnection = lastOutputConnection;
371 }
372
lastInputConnection() const373 QString VPianoSettings::lastInputConnection() const
374 {
375 return m_lastInputConnection;
376 }
377
setLastInputConnection(const QString & lastInputConnection)378 void VPianoSettings::setLastInputConnection(const QString &lastInputConnection)
379 {
380 m_lastInputConnection = lastInputConnection;
381 }
382
lastOutputBackend() const383 QString VPianoSettings::lastOutputBackend() const
384 {
385 return m_lastOutputBackend;
386 }
387
setLastOutputBackend(const QString & lastOutputBackend)388 void VPianoSettings::setLastOutputBackend(const QString &lastOutputBackend)
389 {
390 m_lastOutputBackend = lastOutputBackend;
391 }
392
lastInputBackend() const393 QString VPianoSettings::lastInputBackend() const
394 {
395 return m_lastInputBackend;
396 }
397
setLastInputBackend(const QString & lastInputBackend)398 void VPianoSettings::setLastInputBackend(const QString &lastInputBackend)
399 {
400 m_lastInputBackend = lastInputBackend;
401 }
402
state() const403 QByteArray VPianoSettings::state() const
404 {
405 return m_state;
406 }
407
setState(const QByteArray & state)408 void VPianoSettings::setState(const QByteArray &state)
409 {
410 m_state = state;
411 }
412
geometry() const413 QByteArray VPianoSettings::geometry() const
414 {
415 return m_geometry;
416 }
417
setGeometry(const QByteArray & geometry)418 void VPianoSettings::setGeometry(const QByteArray &geometry)
419 {
420 m_geometry = geometry;
421 }
422