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