| 
									
										
										
										
											2018-06-17 13:34:53 +01:00
										 |  |  | /*
 | 
					
						
							|  |  |  |   ============================================================================== | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This file is part of the JUCE library. | 
					
						
							|  |  |  |    Copyright (c) 2017 - ROLI Ltd. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    JUCE is an open source library subject to commercial or open-source | 
					
						
							|  |  |  |    licensing. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The code included in this file is provided under the terms of the ISC license | 
					
						
							|  |  |  |    http://www.isc.org/downloads/software-support-policy/isc-license. Permission
 | 
					
						
							|  |  |  |    To use, copy, modify, and/or distribute this software for any purpose with or | 
					
						
							|  |  |  |    without fee is hereby granted provided that the above copyright notice and | 
					
						
							|  |  |  |    this permission notice appear in all copies. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | 
					
						
							|  |  |  |    EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | 
					
						
							|  |  |  |    DISCLAIMED. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ============================================================================== | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace juce | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //==============================================================================
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |     Collects incoming realtime MIDI messages and turns them into blocks suitable for | 
					
						
							|  |  |  |     processing by a block-based audio callback. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The class can also be used as either a MidiKeyboardStateListener or a MidiInputCallback | 
					
						
							|  |  |  |     so it can easily use a midi input or keyboard component as its source. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @see MidiMessage, MidiInput | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @tags{Audio} | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | class JUCE_API  MidiMessageCollector    : public MidiKeyboardStateListener, | 
					
						
							|  |  |  |                                           public MidiInputCallback | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     //==============================================================================
 | 
					
						
							|  |  |  |     /** Creates a MidiMessageCollector. */ | 
					
						
							|  |  |  |     MidiMessageCollector(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** Destructor. */ | 
					
						
							| 
									
										
										
										
											2019-06-22 20:41:38 +01:00
										 |  |  |     ~MidiMessageCollector() override; | 
					
						
							| 
									
										
										
										
											2018-06-17 13:34:53 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     //==============================================================================
 | 
					
						
							|  |  |  |     /** Clears any messages from the queue.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         You need to call this method before starting to use the collector, so that | 
					
						
							|  |  |  |         it knows the correct sample rate to use. | 
					
						
							|  |  |  |     */ | 
					
						
							|  |  |  |     void reset (double sampleRate); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** Takes an incoming real-time message and adds it to the queue.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         The message's timestamp is taken, and it will be ready for retrieval as part | 
					
						
							|  |  |  |         of the block returned by the next call to removeNextBlockOfMessages(). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         This method is fully thread-safe when overlapping calls are made with | 
					
						
							|  |  |  |         removeNextBlockOfMessages(). | 
					
						
							|  |  |  |     */ | 
					
						
							|  |  |  |     void addMessageToQueue (const MidiMessage& message); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** Removes all the pending messages from the queue as a buffer.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         This will also correct the messages' timestamps to make sure they're in | 
					
						
							|  |  |  |         the range 0 to numSamples - 1. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         This call should be made regularly by something like an audio processing | 
					
						
							|  |  |  |         callback, because the time that it happens is used in calculating the | 
					
						
							|  |  |  |         midi event positions. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         This method is fully thread-safe when overlapping calls are made with | 
					
						
							|  |  |  |         addMessageToQueue(). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Precondition: numSamples must be greater than 0. | 
					
						
							|  |  |  |     */ | 
					
						
							|  |  |  |     void removeNextBlockOfMessages (MidiBuffer& destBuffer, int numSamples); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //==============================================================================
 | 
					
						
							|  |  |  |     /** @internal */ | 
					
						
							|  |  |  |     void handleNoteOn (MidiKeyboardState*, int midiChannel, int midiNoteNumber, float velocity) override; | 
					
						
							|  |  |  |     /** @internal */ | 
					
						
							|  |  |  |     void handleNoteOff (MidiKeyboardState*, int midiChannel, int midiNoteNumber, float velocity) override; | 
					
						
							|  |  |  |     /** @internal */ | 
					
						
							|  |  |  |     void handleIncomingMidiMessage (MidiInput*, const MidiMessage&) override; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |     //==============================================================================
 | 
					
						
							|  |  |  |     double lastCallbackTime = 0; | 
					
						
							|  |  |  |     CriticalSection midiCallbackLock; | 
					
						
							|  |  |  |     MidiBuffer incomingMessages; | 
					
						
							|  |  |  |     double sampleRate = 44100.0; | 
					
						
							|  |  |  |    #if JUCE_DEBUG
 | 
					
						
							|  |  |  |     bool hasCalledReset = false; | 
					
						
							|  |  |  |    #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiMessageCollector) | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace juce
 |