Entropy Piano Tuner  1.1.3 (documentation not yet complete)
An open-source experimental software for piano tuning by entropy minimization
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
pianomanager.cpp
Go to the documentation of this file.
1 /*****************************************************************************
2  * Copyright 2015 Haye Hinrichsen, Christoph Wick
3  *
4  * This file is part of Entropy Piano Tuner.
5  *
6  * Entropy Piano Tuner is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by the
8  * Free Software Foundation, either version 3 of the License, or (at your
9  * option) any later version.
10  *
11  * Entropy Piano Tuner is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13  * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14  * more details.
15  *
16  * You should have received a copy of the GNU General Public License along with
17  * Entropy Piano Tuner. If not, see http://www.gnu.org/licenses/.
18  *****************************************************************************/
19 
20 //=============================================================================
21 // Piano-Manager
22 //=============================================================================
23 
24 #include "pianomanager.h"
25 
26 #include <iostream>
27 
28 #include "../system/eptexception.h"
29 #include "../messages/messagehandler.h"
30 #include "../messages/messagefinalkey.h"
31 #include "../messages/messagemodechanged.h"
32 #include "../messages/messagekeyselectionchanged.h"
33 #include "../messages/messagechangetuningcurve.h"
34 #include "../messages/messageprojectfile.h"
35 #include "../messages/messagekeydatachanged.h"
36 #include "../adapters/modeselectoradapter.h"
37 #include "../piano/key.h"
38 
39 //-----------------------------------------------------------------------------
40 // Constructor
41 //-----------------------------------------------------------------------------
42 
46 
48  mPiano(),
49  mSelectedKey(-1),
50  mForcedRecording(false),
51  mOperationMode(OperationMode::MODE_IDLE)
52 {}
53 
54 
55 //-----------------------------------------------------------------------------
56 // Reset recording
57 //-----------------------------------------------------------------------------
58 
68 
70 {
71  switch (mOperationMode)
72  {
73  case MODE_IDLE:
74  case MODE_RECORDING:
76  break;
77  case MODE_CALCULATION:
80  break;
81  case MODE_TUNING:
84  break;
85  default:
86  break;
87  }
89 }
90 
91 
92 //-----------------------------------------------------------------------------
93 // Message listener and dispatcher
94 //-----------------------------------------------------------------------------
95 
100 
102 {
103  EptAssert(m, "Message has to exist!");
104 
105  switch (m->getType())
106  {
108  {
109  auto message(std::static_pointer_cast<MessageProjectFile>(m));
110  switch (message->getFileMessageType())
111  {
114  // on open or create (new file) we select the next nex
115  MessageHandler::sendUnique<MessageKeySelectionChanged>(findNextKey(-1), nullptr);
116  break;
117  default:
118  break;
119  }
120  break;
121  }
123  {
124  auto message(std::static_pointer_cast<MessageModeChanged>(m));
125  mOperationMode = message->getMode();
127  {
128  int nextkey = findNextKey(-1);
129  MessageHandler::send<MessageKeySelectionChanged>(nextkey, mPiano.getKeyPtr(nextkey));
130  }
131  }
132  break;
134  {
135  auto message(std::static_pointer_cast<MessageKeySelectionChanged>(m));
136  mSelectedKey = message->getKeyNumber();
137  mForcedRecording = message->isForced();
138  }
139  break;
141  {
142  auto message(std::static_pointer_cast<MessageFinalKey>(m));
143  auto keyptr = message->getFinalKey(); // get shared pointer to the new key
144  int keynumber = message->getKeyNumber();
145  EptAssert(keynumber >= 0 && keynumber < mPiano.getKeyboard().getNumberOfKeys(),"Range of keynumber");
146  handleNewKey(keynumber,keyptr);
147  }
148  break;
150  {
151  auto message(std::static_pointer_cast<MessageChangeTuningCurve>(m));
152  int keynumber = message->getKeyNumber();
153  double frequency = message->getFrequency();
154  EptAssert(keynumber >= 0 and keynumber < mPiano.getKeyboard().getNumberOfKeys(), "range of keynumber");
155  mPiano.getKey(keynumber).setComputedFrequency(frequency);
156  MessageHandler::send<MessageKeyDataChanged>(keynumber, mPiano.getKeyPtr(keynumber));
157  }
158  break;
159  default:
160  break;
161  }
162 }
163 
164 //-----------------------------------------------------------------------------
165 // Take action of a new key has been identified
166 //-----------------------------------------------------------------------------
167 
176 
177 void PianoManager::handleNewKey (int keynumber, std::shared_ptr<Key> keyptr)
178 {
180  {
181  if (keynumber==mSelectedKey or mForcedRecording)
182  {
183  std::cout << "PianoManager: Sucessfully inserted new key spectrum" << std::endl;
184  mPiano.setKey(mSelectedKey,*keyptr);
185  // notify, that key data changed (e.g. tuning curve will redraw)
186  MessageHandler::send<MessageKeyDataChanged>(mSelectedKey, mPiano.getKeyPtr(mSelectedKey));
187 
188 #if CONFIG_ENABLE_XMGRACE
189  std::ofstream os ("4-quality.dat");
190  for (auto &p : mPiano.getKeyboard().getKeys())
191  os << p.getRecognitionQuality() << std::endl;
192  os.close();
193 #endif
194  }
195  }
196  else if (mOperationMode == MODE_TUNING)
197  {
198  double frequency = keyptr->getTunedFrequency();
199  double overpull = keyptr->getOverpull();
200  double tuned = keyptr->getTunedFrequency();
201  Key* keypointer = mPiano.getKeyPtr(keynumber);
202  if (keynumber==mSelectedKey or mForcedRecording)
203  keypointer->setTunedFrequency(frequency);
204  keypointer->setOverpull(overpull);
205  keypointer->setTunedFrequency(tuned);
206  MessageHandler::send<MessageKeyDataChanged>(keynumber, keypointer);
207 
208  }
209 }
210 
211 
212 //-----------------------------------------------------------------------------
213 // Find next key
214 //-----------------------------------------------------------------------------
215 
224 
225 int PianoManager::findNextKey (int keynumber) // -1 if none
226 {
227  const int K = mPiano.getKeyboard().getNumberOfKeys();
228  if (keynumber < K-1)
229  {
230  if (mPiano.getKey(keynumber+1).isRecorded() == false) return keynumber+1;
231  }
232  // Search for incomplete key from the left
233  for (int k=0; k<K; ++k) {
234  if (mPiano.getKey(k).isRecorded() == false) {
235  return k;
236  }
237  }
238  return -1;
239 }
bool isRecorded() const
Get recorded flag.
Definition: key.h:102
void setTunedFrequency(double f)
Set tuned frequency.
Definition: key.cpp:187
std::shared_ptr< Message > MessagePtr
Global type of a shared message pointer.
Definition: message.h:98
OperationMode
Operation mode of the tuner.
Definition: prerequisites.h:66
called when the recording was cleared
Definition: message.h:50
const Key * getKeyPtr(int i) const
Definition: piano.h:88
void clearOverpulls()
Set all overpull markers to zero.
Definition: keyboard.cpp:54
void setComputedFrequency(double f)
Set computed frequency.
Definition: key.cpp:168
Message that a change was made with the current project file.
Definition: message.h:68
Class describing a single piano key.
Definition: key.h:45
void handleNewKey(int keynumber, std::shared_ptr< Key > keyptr)
Handle the event that a key has been successfully indentified.
Message that the operation mode has changed.
Definition: message.h:65
static void send(Args &&...args)
short function for creating and sending a message
int findNextKey(int keynumber)
Find the next key to be recorded.
Piano mPiano
Instance of the piano.
Definition: pianomanager.h:57
void resetPitches()
Reset all recorded keys and send a message to redraw all elements.
void setOverpull(double cents)
Set overpull in cents.
Definition: key.cpp:204
Mode where the entropy optimization is carried out.
Definition: prerequisites.h:70
void setKey(int i, const Key &key)
Definition: piano.h:91
Mode for recording the piano keys.
Definition: prerequisites.h:69
Message that a key has been selected.
Definition: message.h:63
void clearComputedPitches()
Set all computed pitches to zero.
Definition: keyboard.cpp:48
Keys & getKeys()
Definition: keyboard.h:69
const Keyboard & getKeyboard() const
Definition: piano.h:83
void clearTunedPitches()
Set all tuned pitches to zero.
Definition: keyboard.cpp:51
bool mForcedRecording
Flag for forced recording.
Definition: pianomanager.h:59
void clearAllKeys()
Clear all keys completely.
Definition: keyboard.cpp:45
Message that the tuning curve has been adapted.
Definition: message.h:60
Mode for manually tuning the piano.
Definition: prerequisites.h:71
final key information after recording
Definition: message.h:55
#define EptAssert(a, b)
Definition: eptexception.h:47
OperationMode mOperationMode
Local copy of the operation mode.
Definition: pianomanager.h:60
void handleMessage(MessagePtr m) overridefinal
Message listener and dispatcher.
Do nothing.
Definition: prerequisites.h:68
int getNumberOfKeys() const
Definition: keyboard.h:72
int mSelectedKey
Local copy of the selected key.
Definition: pianomanager.h:58
PianoManager()
Constructor, resets member variables.
const Key & getKey(int i) const
Definition: piano.h:86