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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2962 - (hide annotations) (download) (as text)
Sun Jul 17 17:54:04 2016 UTC (7 years, 9 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 schoenebeck 2879 /*
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 schoenebeck 2962 sched_time_t triggerSchedTime; ///< Engine's scheduler time when this note was launched.
32 schoenebeck 2931 /// 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 schoenebeck 2935 float Cutoff; ///< between 0.0 and 1.0
39     float Resonance; ///< between 0.0 and 1.0
40 schoenebeck 2953 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 schoenebeck 2931 } Override;
44 schoenebeck 2879 /// 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 schoenebeck 2931 Override.Volume = 1.f;
55     Override.Pitch = 1.f;
56     Override.Pan = 0.f;
57     Override.PanSources = 0;
58 schoenebeck 2935 Override.Cutoff = 1.f;
59     Override.Resonance = 1.f;
60 schoenebeck 2953 Override.Attack = 1.f;
61     Override.Decay = 1.f;
62     Override.Release = 1.f;
63 schoenebeck 2880 Format = _Format();
64 schoenebeck 2879 }
65     };
66    
67     /**
68     * Contains the voices caused by one specific note, as well as basic
69 schoenebeck 2938 * 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 schoenebeck 2879 */
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 schoenebeck 2931 Override.Volume = 1.f;
114     Override.Pitch = 1.f;
115     Override.Pan = 0.f;
116     Override.PanSources = 0;
117 schoenebeck 2935 Override.Cutoff = 1.f;
118     Override.Resonance = 1.f;
119 schoenebeck 2953 Override.Attack = 1.f;
120     Override.Decay = 1.f;
121     Override.Release = 1.f;
122 schoenebeck 2880 Format = _Format();
123 schoenebeck 2879 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