comparison data/model/FlexiNoteModel.h @ 852:d6bd5751b8f6 tonioni_multi_transform

Add NoteExportable base class, use it in MIDI export (and also elsewhere in playback)
author Chris Cannam
date Mon, 02 Dec 2013 17:11:20 +0000
parents 5e9ff92ca05e
children 6d07bcc844a1
comparison
equal deleted inserted replaced
850:dba8a02b0413 852:d6bd5751b8f6
14 */ 14 */
15 15
16 #ifndef _FLEXINOTE_MODEL_H_ 16 #ifndef _FLEXINOTE_MODEL_H_
17 #define _FLEXINOTE_MODEL_H_ 17 #define _FLEXINOTE_MODEL_H_
18 18
19 // #include "NotelikeModel.h" // GF: reomved as this is an uncommitted experiment for now
20
21 #include "IntervalModel.h" 19 #include "IntervalModel.h"
20 #include "NoteData.h"
22 #include "base/RealTime.h" 21 #include "base/RealTime.h"
22 #include "base/Pitch.h"
23 #include "base/PlayParameterRepository.h" 23 #include "base/PlayParameterRepository.h"
24 24
25 /** 25 /**
26 * FlexiNoteModel -- a concrete IntervalModel for notes. 26 * FlexiNoteModel -- a concrete IntervalModel for notes.
27 */ 27 */
95 } 95 }
96 }; 96 };
97 }; 97 };
98 98
99 99
100 class FlexiNoteModel : public IntervalModel<FlexiNote> 100 class FlexiNoteModel : public IntervalModel<FlexiNote>, public NoteExportable
101 { 101 {
102 Q_OBJECT 102 Q_OBJECT
103 103
104 public: 104 public:
105 FlexiNoteModel(size_t sampleRate, size_t resolution, 105 FlexiNoteModel(size_t sampleRate, size_t resolution,
225 { 225 {
226 if (column == 5) return SortAlphabetical; 226 if (column == 5) return SortAlphabetical;
227 return SortNumeric; 227 return SortNumeric;
228 } 228 }
229 229
230 /**
231 * NoteExportable methods.
232 */
233
234 NoteList getNotes() const {
235 return getNotes(getStartFrame(), getEndFrame());
236 }
237
238 NoteList getNotes(size_t startFrame, size_t endFrame) const {
239
240 PointList points = getPoints(startFrame, endFrame);
241 NoteList notes;
242
243 for (PointList::iterator pli =
244 points.begin(); pli != points.end(); ++pli) {
245
246 size_t duration = pli->duration;
247 if (duration == 0 || duration == 1) {
248 duration = getSampleRate() / 20;
249 }
250
251 int pitch = lrintf(pli->value);
252
253 int velocity = 100;
254 if (pli->level > 0.f && pli->level <= 1.f) {
255 velocity = lrintf(pli->level * 127);
256 }
257
258 NoteData note(pli->frame, duration, pitch, velocity);
259
260 if (getScaleUnits() == "Hz") {
261 note.frequency = pli->value;
262 note.midiPitch = Pitch::getPitchForFrequency(note.frequency);
263 note.isMidiPitchQuantized = false;
264 }
265
266 notes.push_back(note);
267 }
268
269 return notes;
270 }
271
230 protected: 272 protected:
231 float m_valueQuantization; 273 float m_valueQuantization;
232 }; 274 };
233 275
234 #endif 276 #endif