LMMS
Loading...
Searching...
No Matches
MidiMessageSequence.cpp
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the Water library.
5 Copyright (c) 2016 ROLI Ltd.
6 Copyright (C) 2017-2022 Filipe Coelho <falktx@falktx.com>
7
8 Permission is granted to use this software under the terms of the ISC license
9 http://www.isc.org/downloads/software-support-policy/isc-license/
10
11 Permission to use, copy, modify, and/or distribute this software for any
12 purpose with or without fee is hereby granted, provided that the above
13 copyright notice and this permission notice appear in all copies.
14
15 THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD
16 TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17 FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT,
18 OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
19 USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
20 TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
21 OF THIS SOFTWARE.
22
23 ==============================================================================
24*/
25
26#include "MidiMessageSequence.h"
27
28namespace water {
29
33
39
41{
42 MidiMessageSequence otherCopy (other);
43 swapWith (otherCopy);
44 return *this;
45}
46
48{
49 list.swapWith (other.list);
50}
51
55
57{
58 list.clear();
59}
60
62{
63 return list.size();
64}
65
67{
68 return list [index];
69}
70
71//==============================================================================
76
78{
79 return getEventTime (list.size() - 1);
80}
81
82double MidiMessageSequence::getEventTime (const int index) const noexcept
83{
84 if (const MidiEventHolder* const meh = list [index])
85 return meh->message.getTimeStamp();
86
87 return 0.0;
88}
89
90//==============================================================================
92 double timeAdjustment)
93{
94 MidiEventHolder* const newOne = new MidiEventHolder (newMessage);
95
96 timeAdjustment += newMessage.getTimeStamp();
97 newOne->message.setTimeStamp (timeAdjustment);
98
99 int i;
100 for (i = list.size(); --i >= 0;)
101 if (list.getUnchecked(i)->message.getTimeStamp() <= timeAdjustment)
102 break;
103
104 list.insert (i + 1, newOne);
105 return newOne;
106}
107
109{
111 const MidiMessageSequence::MidiEventHolder* const second) noexcept
112 {
113 const double diff = first->message.getTimeStamp() - second->message.getTimeStamp();
114 return (diff > 0) - (diff < 0);
115 }
116};
117
118void MidiMessageSequence::addSequence (const MidiMessageSequence& other, double timeAdjustment)
119{
120 for (int i = 0; i < static_cast<int>(other.list.size()); ++i)
121 {
122 const MidiMessage& m = other.list.getUnchecked(i)->message;
123
124 MidiEventHolder* const newOne = new MidiEventHolder (m);
125 newOne->message.addToTimeStamp (timeAdjustment);
126 list.add (newOne);
127 }
128
129 sort();
130}
131
132//==============================================================================
134{
136 list.sort (sorter, true);
137}
138
140{
141 for (int i = 0; i < static_cast<int>(list.size()); ++i)
142 {
143 MidiEventHolder* const meh = list.getUnchecked(i);
144 const MidiMessage& m1 = meh->message;
145
146 if (m1.isNoteOn())
147 {
148 meh->noteOffObject = nullptr;
149 const int note = m1.getNoteNumber();
150 const int chan = m1.getChannel();
151 const int len = list.size();
152
153 for (int j = i + 1; j < len; ++j)
154 {
155 const MidiMessage& m = list.getUnchecked(j)->message;
156
157 if (m.getNoteNumber() == note && m.getChannel() == chan)
158 {
159 if (m.isNoteOff())
160 {
161 meh->noteOffObject = list[j];
162 break;
163 }
164 else if (m.isNoteOn())
165 {
166 MidiEventHolder* const newEvent = new MidiEventHolder (MidiMessage::noteOff (chan, note));
167 list.insert (j, newEvent);
168 newEvent->message.setTimeStamp (m.getTimeStamp());
169 meh->noteOffObject = newEvent;
170 break;
171 }
172 }
173 }
174 }
175 }
176}
177
178//==============================================================================
183
187
188}
#define noexcept
Definition DistrhoDefines.h:72
#define nullptr
Definition DistrhoDefines.h:75
Definition MidiMessage.h:40
void setTimeStamp(double newTimestamp) noexcept
Definition MidiMessage.h:150
static MidiMessage noteOff(int channel, int noteNumber, float velocity) noexcept
Definition MidiMessage.cpp:548
void addToTimeStamp(double delta) noexcept
Definition MidiMessage.h:155
double getTimeStamp() const noexcept
Definition MidiMessage.h:144
int getNoteNumber() const noexcept
Definition MidiMessage.cpp:362
int getChannel() const noexcept
Definition MidiMessage.cpp:307
bool isNoteOn(bool returnTrueForVelocity0=false) const noexcept
Definition MidiMessage.cpp:338
Definition MidiMessageSequence.h:69
MidiMessage message
Definition MidiMessageSequence.h:76
MidiEventHolder(const MidiMessage &)
Definition MidiMessageSequence.cpp:179
MidiEventHolder * noteOffObject
Definition MidiMessageSequence.h:86
~MidiEventHolder()
Definition MidiMessageSequence.cpp:184
int getNumEvents() const noexcept
Definition MidiMessageSequence.cpp:61
void sort() noexcept
Definition MidiMessageSequence.cpp:133
MidiMessageSequence & operator=(const MidiMessageSequence &)
Definition MidiMessageSequence.cpp:40
void clear()
Definition MidiMessageSequence.cpp:56
void updateMatchedPairs() noexcept
Definition MidiMessageSequence.cpp:139
MidiEventHolder * addEvent(const MidiMessage &newMessage, double timeAdjustment=0)
Definition MidiMessageSequence.cpp:91
double getEventTime(int index) const noexcept
Definition MidiMessageSequence.cpp:82
void addSequence(const MidiMessageSequence &other, double timeAdjustmentDelta)
Definition MidiMessageSequence.cpp:118
~MidiMessageSequence()
Definition MidiMessageSequence.cpp:52
MidiMessageSequence()
Definition MidiMessageSequence.cpp:30
MidiEventHolder * getEventPointer(int index) const noexcept
Definition MidiMessageSequence.cpp:66
double getStartTime() const noexcept
Definition MidiMessageSequence.cpp:72
double getEndTime() const noexcept
Definition MidiMessageSequence.cpp:77
OwnedArray< MidiEventHolder > list
Definition MidiMessageSequence.h:170
void swapWith(MidiMessageSequence &) noexcept
Definition MidiMessageSequence.cpp:47
unsigned * m
Definition inflate.c:1559
register unsigned j
Definition inflate.c:1576
register unsigned i
Definition inflate.c:1575
Definition AudioSampleBuffer.h:33
static bool diff(const std::string fn1, const std::string fn2)
Definition playertest.cpp:161
Definition MidiMessageSequence.cpp:109
static int compareElements(const MidiMessageSequence::MidiEventHolder *const first, const MidiMessageSequence::MidiEventHolder *const second) noexcept
Definition MidiMessageSequence.cpp:110
mm
Definition zipinfo.c:2291
#define const
Definition zconf.h:137