/[svn]/linuxsampler/trunk/src/engines/common/Note.h
ViewVC logotype

Contents of /linuxsampler/trunk/src/engines/common/Note.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2962 - (show annotations) (download) (as text)
Sun Jul 17 17:54:04 2016 UTC (2 years, 10 months ago) by schoenebeck
File MIME type: text/x-c++hdr
File size: 6263 byte(s)
* NKSP: Fixed all change_*() built-in script functions to apply their
  synthesis parameter changes immediately in case the respective note
  was triggered at the same time, instead of scheduling the parameter
  change, especially because it would cause some parameter types's
  changes either to be ramped (i.e. change_vol()) or other types even
  to have not effect at all (i.e. change_attack()).
* Bumped version (2.0.0.svn20).

1 /*
2 * Copyright (c) 2016 Christian Schoenebeck
3 *
4 * http://www.linuxsampler.org
5 *
6 * This file is part of LinuxSampler and released under the same terms.
7 * See README file for details.
8 */
9
10 #ifndef LS_NOTE_H
11 #define LS_NOTE_H
12
13 #include "../../common/Pool.h"
14 #include "Event.h"
15
16 namespace LinuxSampler {
17
18 /**
19 * Abstract base class of its deriving @c Note class, this class (NoteBase)
20 * is not intended to be instantiated directly. It just provides access to
21 * the parts of a Note object which do not depend on any C++ template
22 * parameter.
23 */
24 class NoteBase {
25 public:
26 int hostKey; ///< Key on which this is @c Note is allocated on. This is usually the note-on event's note number, however in case of a child note this will rather be the parent note's key instead!
27 note_id_t parentNoteID; ///< If not null: unique ID of the parent note of this note (see comments of field @c pChildNotes).
28 RTList<note_id_t>* pChildNotes; ///< Note ID list of "child" notes of this note. These are special notes that must be released once this note gets released.
29 Event cause; ///< Copy of the original event (usually a note-on event) which caused this note.
30 event_id_t eventID; ///< Unique ID of the actual original @c Event which caused this note.
31 sched_time_t triggerSchedTime; ///< Engine's scheduler time when this note was launched.
32 /// Optional synthesis parameters that might be overridden (by calling real-time instrument script functions like change_vol(), change_pitch(), etc.).
33 struct _Override {
34 float Volume; ///< as linear amplification ratio (1.0 being neutral)
35 float Pitch; ///< as linear frequency ratio (1.0 being neutral)
36 float Pan; ///< between -1.0 (most left) and +1.0 (most right) and 0.0 being neutral.
37 int64_t PanSources; ///< Might be used for calculating an average pan value in differential way: amount of times the Pan value had been changed and shall be calculated relatively upon.
38 float Cutoff; ///< between 0.0 and 1.0
39 float Resonance; ///< between 0.0 and 1.0
40 float Attack; ///< between 0.0 and 1.0
41 float Decay; ///< between 0.0 and 1.0
42 float Release; ///< between 0.0 and 1.0
43 } Override;
44 /// Sampler format specific informations and variables.
45 union _Format {
46 /// Gigasampler/GigaStudio format specifics.
47 struct _Gig {
48 uint8_t DimMask; ///< May be used to override the Dimension zone to be selected for a new voice: each 1 bit means that respective bit shall be overridden by taking the respective bit from DimBits instead.
49 uint8_t DimBits; ///< Used only in conjunction with DimMask: Dimension bits that shall be selected.
50 } Gig;
51 } Format;
52 protected:
53 NoteBase() : hostKey(0), parentNoteID(0), pChildNotes(NULL) {
54 Override.Volume = 1.f;
55 Override.Pitch = 1.f;
56 Override.Pan = 0.f;
57 Override.PanSources = 0;
58 Override.Cutoff = 1.f;
59 Override.Resonance = 1.f;
60 Override.Attack = 1.f;
61 Override.Decay = 1.f;
62 Override.Release = 1.f;
63 Format = _Format();
64 }
65 };
66
67 /**
68 * Contains the voices caused by one specific note, as well as basic
69 * informations about the note itself. You can see a Note object as one
70 * specific event in time where one or more voices were spawned at the same
71 * time and all those voices due to the same cause.
72 *
73 * For example when you press down and hold the sustain pedal, and then
74 * trigger the same note on the keyboard multiple times, for each key
75 * strokes a separate Note instance is created.
76 *
77 * If your instrument contains a real-time instrument script, then that
78 * script might also trigger additional voices programmatically (by
79 * calling the built-in script function play_note()). Each time the script
80 * calls play_note() a new Note instance is created and the script may then
81 * further control the voices of specific notes independently from each
82 * other. For example for each key stroke on your keyboard the instrument
83 * script might trigger 3 additional notes programmatically and assign a
84 * different tuning filter parameters for each one of the 3 notes
85 * independently.
86 */
87 template<class V>
88 class Note : public NoteBase {
89 public:
90 RTList<V>* pActiveVoices; ///< Contains the active voices associated with this note.
91
92 Note() : NoteBase(), pActiveVoices(NULL) {}
93
94 virtual ~Note() {
95 if (pChildNotes) delete pChildNotes;
96 if (pActiveVoices) delete pActiveVoices;
97 }
98
99 void init(Pool<V>* pVoicePool, Pool<note_id_t>* pNoteIDPool) {
100 if (pActiveVoices) delete pActiveVoices;
101 pActiveVoices = new RTList<V>(pVoicePool);
102 if (pChildNotes) delete pChildNotes;
103 pChildNotes = new RTList<note_id_t>(pNoteIDPool);
104 }
105
106 void reset() {
107 hostKey = 0;
108 parentNoteID = 0;
109 if (pChildNotes)
110 pChildNotes->clear();
111 cause = Event();
112 eventID = 0;
113 Override.Volume = 1.f;
114 Override.Pitch = 1.f;
115 Override.Pan = 0.f;
116 Override.PanSources = 0;
117 Override.Cutoff = 1.f;
118 Override.Resonance = 1.f;
119 Override.Attack = 1.f;
120 Override.Decay = 1.f;
121 Override.Release = 1.f;
122 Format = _Format();
123 if (pActiveVoices) {
124 typename RTList<V>::Iterator itVoice = pActiveVoices->first();
125 typename RTList<V>::Iterator itVoicesEnd = pActiveVoices->end();
126 for (; itVoice != itVoicesEnd; ++itVoice) { // iterate through all voices on this key
127 itVoice->VoiceFreed();
128 }
129 pActiveVoices->clear();
130 }
131 }
132 };
133
134 } // namespace LinuxSampler
135
136 #endif // LS_NOTE_H

  ViewVC Help
Powered by ViewVC