- evaluate MidiClock
git-svn-id: http://moon:8086/svn/software/trunk/projects/JaySynth@269 b431acfa-c32f-4a4a-93f1-934dc6c82436
This commit is contained in:
Binary file not shown.
Binary file not shown.
+6
-1
@@ -10,7 +10,12 @@
|
|||||||
pluginAUExportPrefix="JaySynthAU" pluginRTASCategory="" aaxIdentifier="com.yourcompany.JaySynth"
|
pluginAUExportPrefix="JaySynthAU" pluginRTASCategory="" aaxIdentifier="com.yourcompany.JaySynth"
|
||||||
pluginAAXCategory="AAX_ePlugInCategory_Dynamics" jucerVersion="3.1.0">
|
pluginAAXCategory="AAX_ePlugInCategory_Dynamics" jucerVersion="3.1.0">
|
||||||
<MAINGROUP id="JZYYhB" name="JaySynth">
|
<MAINGROUP id="JZYYhB" name="JaySynth">
|
||||||
<GROUP id="{0DB5BC0B-0430-BEF4-A718-904ED25AF98F}" name="Source"/>
|
<GROUP id="{0DB5BC0B-0430-BEF4-A718-904ED25AF98F}" name="Source">
|
||||||
|
<FILE id="GSnFml" name="JaySynthAudioProcessorEditor.cpp" compile="1"
|
||||||
|
resource="0" file="Source/JaySynthAudioProcessorEditor.cpp"/>
|
||||||
|
<FILE id="ImntJQ" name="JaySynthAudioProcessorEditor.h" compile="0"
|
||||||
|
resource="0" file="Source/JaySynthAudioProcessorEditor.h"/>
|
||||||
|
</GROUP>
|
||||||
</MAINGROUP>
|
</MAINGROUP>
|
||||||
<EXPORTFORMATS>
|
<EXPORTFORMATS>
|
||||||
<LINUX_MAKE targetFolder="Builds/Linux">
|
<LINUX_MAKE targetFolder="Builds/Linux">
|
||||||
|
|||||||
@@ -227,7 +227,7 @@
|
|||||||
#define JucePlugin_WantsMidiInput 1
|
#define JucePlugin_WantsMidiInput 1
|
||||||
#endif
|
#endif
|
||||||
#ifndef JucePlugin_ProducesMidiOutput
|
#ifndef JucePlugin_ProducesMidiOutput
|
||||||
#define JucePlugin_ProducesMidiOutput 0
|
#define JucePlugin_ProducesMidiOutput 1
|
||||||
#endif
|
#endif
|
||||||
#ifndef JucePlugin_SilenceInProducesSilenceOut
|
#ifndef JucePlugin_SilenceInProducesSilenceOut
|
||||||
#define JucePlugin_SilenceInProducesSilenceOut 0
|
#define JucePlugin_SilenceInProducesSilenceOut 0
|
||||||
|
|||||||
Binary file not shown.
+13
-2
@@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
ButtonLED::ButtonLED (const String& name)
|
ButtonLED::ButtonLED (const String& name)
|
||||||
: Button (L"Button LED"),
|
: Button (name),
|
||||||
cachedImage_led_23_red_png (0),
|
cachedImage_led_23_red_png (0),
|
||||||
cachedImage_led_23_red1_png (0),
|
cachedImage_led_23_red1_png (0),
|
||||||
triggeredOnMouseDown(0),
|
triggeredOnMouseDown(0),
|
||||||
@@ -50,7 +50,6 @@ ButtonLED::ButtonLED (const String& name)
|
|||||||
|
|
||||||
|
|
||||||
//[Constructor] You can add your own custom stuff here..
|
//[Constructor] You can add your own custom stuff here..
|
||||||
setName(name);
|
|
||||||
//[/Constructor]
|
//[/Constructor]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -197,6 +196,18 @@ void ButtonLED::paintButton (Graphics& g, bool /*isMouseOverButton*/, bool /*isB
|
|||||||
false);
|
false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ButtonLED::flash(uint32_t duration_ms)
|
||||||
|
{
|
||||||
|
setToggleState(true, juce::NotificationType::dontSendNotification);
|
||||||
|
startTimer((uint32_t)duration_ms);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ButtonLED::timerCallback()
|
||||||
|
{
|
||||||
|
setToggleState(false, juce::NotificationType::dontSendNotification);
|
||||||
|
}
|
||||||
|
|
||||||
//[/MiscUserCode]
|
//[/MiscUserCode]
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+3
-1
@@ -36,7 +36,7 @@
|
|||||||
Describe your class and how it works here!
|
Describe your class and how it works here!
|
||||||
//[/Comments]
|
//[/Comments]
|
||||||
*/
|
*/
|
||||||
class ButtonLED : public Button
|
class ButtonLED : public Button, public Timer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
@@ -48,6 +48,8 @@ public:
|
|||||||
void paintButton (Graphics& g, bool isMouseOverButton, bool isButtonDown);
|
void paintButton (Graphics& g, bool isMouseOverButton, bool isButtonDown);
|
||||||
void clicked(const ModifierKeys &modifiers);
|
void clicked(const ModifierKeys &modifiers);
|
||||||
void mouseWheelMove(const MouseEvent &event, const MouseWheelDetails &wheel);
|
void mouseWheelMove(const MouseEvent &event, const MouseWheelDetails &wheel);
|
||||||
|
void timerCallback();
|
||||||
|
void flash(uint32_t duration_ms);
|
||||||
void setTriggeredOnMouseDown (bool triggeredOnMouseDown);
|
void setTriggeredOnMouseDown (bool triggeredOnMouseDown);
|
||||||
bool getClickingTogglesState (void);
|
bool getClickingTogglesState (void);
|
||||||
void setClickingTogglesState (bool clickingTogglesState);
|
void setClickingTogglesState (bool clickingTogglesState);
|
||||||
|
|||||||
@@ -0,0 +1,189 @@
|
|||||||
|
/*
|
||||||
|
|
||||||
|
//#######################################################################################
|
||||||
|
//Class to insert Midiclock messages into a given MidiBuffer, suitable for block
|
||||||
|
//based audio callbacks. The class can act on position jumps e.g. "Loops" by sending a
|
||||||
|
//positioning message.
|
||||||
|
//NOTE: No ballistik came in to play so I wouldn't recommend using it to drive a mechanical
|
||||||
|
//tape deck!!!
|
||||||
|
//
|
||||||
|
//solar3d-software, April- 10- 2012
|
||||||
|
//#######################################################################################
|
||||||
|
|
||||||
|
*/
|
||||||
|
#include "JK_MidiClock.h"
|
||||||
|
|
||||||
|
JK_MidiClock::JK_MidiClock()
|
||||||
|
:wasPlaying(false),
|
||||||
|
syncPpqPosition(-999.0),
|
||||||
|
posChangeThreshold(0.001),
|
||||||
|
ppqToStartSyncAt(0.0),
|
||||||
|
followSongPosition(true),
|
||||||
|
syncFlag(0),
|
||||||
|
ppqOffset(0)
|
||||||
|
{
|
||||||
|
//Prepare Midi messages to avoid blocking the caller of generateMidiclock()!
|
||||||
|
continueMessage = new MidiMessage(MidiMessage::midiContinue());
|
||||||
|
stopMessage = new MidiMessage(MidiMessage::midiStop());
|
||||||
|
clockMessage = new MidiMessage(MidiMessage::midiClock());
|
||||||
|
songPositionMessage = new MidiMessage(MidiMessage::songPositionPointer(0));
|
||||||
|
}
|
||||||
|
//=================================================================================================
|
||||||
|
void JK_MidiClock::generateMidiclock(AudioPlayHead::CurrentPositionInfo &lastPosInfo,
|
||||||
|
MidiBuffer* midiBuffer, const int bufferSize, const double sampleRate)
|
||||||
|
{
|
||||||
|
//###################################Some explanation about musical tempo #################
|
||||||
|
//A Time Signature, is two numbers, one on top of the other. The numerator describes the #
|
||||||
|
//number of Beats in a Bar, while the denominator describes of what note value a Beat is. #
|
||||||
|
//So 4/4 would be four quarter-notes per Bar, while 4/2 would be four half-notes per Bar, #
|
||||||
|
//4/8 would be four eighth-notes per Bar, and 2/4 would be two quarter-notes per Bar. #
|
||||||
|
//#########################################################################################
|
||||||
|
|
||||||
|
|
||||||
|
if (midiBuffer != nullptr)
|
||||||
|
{
|
||||||
|
//PPQ value of one sample
|
||||||
|
const double ppqPerSample = (lastPosInfo.bpm / 60.0) / sampleRate;
|
||||||
|
|
||||||
|
//PPQ offset to compensate Midi interface latency
|
||||||
|
double hostPpqPosition = lastPosInfo.ppqPosition + ppqOffset * ppqPerSample;;
|
||||||
|
|
||||||
|
if (lastPosInfo.isPlaying || lastPosInfo.isRecording)
|
||||||
|
{
|
||||||
|
if (! wasPlaying)
|
||||||
|
{
|
||||||
|
//set the point where to start the slave
|
||||||
|
ppqToStartSyncAt = getNearestSixteenthInPPQ(hostPpqPosition);
|
||||||
|
|
||||||
|
//Special case: Master is set to always start playback from the previous start position...
|
||||||
|
if (positionJumped(syncPpqPosition, hostPpqPosition, sampleRate, ppqPerSample))
|
||||||
|
{
|
||||||
|
//Cue Midiclock slave to the nearest sixteenth note to new start position
|
||||||
|
//because the one calculated in stop mode isn't valid anymore.
|
||||||
|
sendSongPositionPointerMessage(ppqToStartSyncAt, 0, midiBuffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Position jump (loop or manually position change while playing)
|
||||||
|
if (positionJumped(syncPpqPosition, hostPpqPosition, sampleRate, ppqPerSample))
|
||||||
|
{
|
||||||
|
//set the point where to start the slave
|
||||||
|
ppqToStartSyncAt = getNearestSixteenthInPPQ(hostPpqPosition);
|
||||||
|
|
||||||
|
//User has changed position manually while playing
|
||||||
|
if (syncFlag == 0)
|
||||||
|
{
|
||||||
|
midiBuffer->addEvent(*stopMessage, 0);
|
||||||
|
sendSongPositionPointerMessage(hostPpqPosition, 0, midiBuffer);
|
||||||
|
|
||||||
|
syncFlag = startSlave_;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (followSongPosition)
|
||||||
|
{
|
||||||
|
sendSongPositionPointerMessage(hostPpqPosition, 0, midiBuffer);
|
||||||
|
|
||||||
|
syncFlag = startSlave_;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
syncFlag = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int posInBuffer = 0; posInBuffer < bufferSize; ++posInBuffer)
|
||||||
|
{
|
||||||
|
syncPpqPosition = hostPpqPosition + (posInBuffer * ppqPerSample);
|
||||||
|
|
||||||
|
const int clockDistanceInSamples = roundToInt((60.0 * sampleRate) / (lastPosInfo.bpm * 24.0));
|
||||||
|
const int64 hostSamplePos = roundToInt64((hostPpqPosition * (60.0 / lastPosInfo.bpm)) * sampleRate);
|
||||||
|
const int64 syncSamplePos = hostSamplePos + posInBuffer;
|
||||||
|
|
||||||
|
//Some hosts like Cubase come up with a wacky ppqPosition
|
||||||
|
//that could break the timing! Best is to "wait"
|
||||||
|
//here for the right ppqPosition to jump on.
|
||||||
|
if (syncPpqPosition >= ppqToStartSyncAt)
|
||||||
|
{
|
||||||
|
if ((syncFlag & startSlave_) == startSlave_)
|
||||||
|
{
|
||||||
|
midiBuffer->addEvent(*continueMessage, posInBuffer);
|
||||||
|
|
||||||
|
syncFlag &= cycleEnd_;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Cycle mode on
|
||||||
|
if (lastPosInfo.isLooping && lastPosInfo.ppqLoopStart != lastPosInfo.ppqLoopEnd)
|
||||||
|
{
|
||||||
|
const double ppqToCycleEnd = fabs(lastPosInfo.ppqLoopEnd - syncPpqPosition);
|
||||||
|
const int64 samplesToCycleEnd = roundToInt64(ppqToCycleEnd * (60.0 / lastPosInfo.bpm) * sampleRate);
|
||||||
|
|
||||||
|
if ((syncFlag & cycleEnd_) == 0)
|
||||||
|
{
|
||||||
|
if (samplesToCycleEnd <= clockDistanceInSamples) //For fine tuning tweak here
|
||||||
|
{
|
||||||
|
//We have reached the cycle- end position
|
||||||
|
//and must stop the Midiclock slave here
|
||||||
|
if (followSongPosition)
|
||||||
|
midiBuffer->addEvent(*stopMessage, posInBuffer);
|
||||||
|
|
||||||
|
syncFlag |= cycleEnd_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//For best timing we should never interupt Midiclock messages!
|
||||||
|
//Seems that some slaves constantly adjusting their internal clock
|
||||||
|
//to Midiclock even if they are in stop mode.
|
||||||
|
if (syncSamplePos % clockDistanceInSamples == 0)
|
||||||
|
midiBuffer->addEvent(*clockMessage, posInBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
wasPlaying = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Send positioning message if the user has stopped or if he changed the playhead position
|
||||||
|
//manually in stop mode! This will also initially cue slave after loading plugin instance.
|
||||||
|
if (wasPlaying || positionJumped(syncPpqPosition, hostPpqPosition, sampleRate, ppqPerSample))
|
||||||
|
{
|
||||||
|
midiBuffer->addEvent(*stopMessage, 0);
|
||||||
|
sendSongPositionPointerMessage(hostPpqPosition, 0, midiBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
syncPpqPosition = hostPpqPosition;
|
||||||
|
|
||||||
|
syncFlag = startSlave_;
|
||||||
|
|
||||||
|
wasPlaying = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//=================================================================================================
|
||||||
|
bool JK_MidiClock::positionJumped(const double lastPosInPPQ, const double currentPosInPPQ,
|
||||||
|
const double sampleRate, const double ppqPerSample)
|
||||||
|
{
|
||||||
|
//This returns true if the user has changed the playhead position manually or if
|
||||||
|
//a jump has occured! The comperator's default threshold is lastPosInPPQ +- 10ms.
|
||||||
|
if (currentPosInPPQ < lastPosInPPQ - ((posChangeThreshold * sampleRate) * ppqPerSample) ||
|
||||||
|
currentPosInPPQ > lastPosInPPQ + ((posChangeThreshold * sampleRate) * ppqPerSample))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
//=================================================================================================
|
||||||
|
void JK_MidiClock::sendSongPositionPointerMessage(const double ppqPosition, const int posInBuffer, MidiBuffer* buffer)
|
||||||
|
{
|
||||||
|
//This will cue the slave to the NEAREST
|
||||||
|
//16th note to the given ppqPosition.
|
||||||
|
int intBeat = int(ceil(ppqPosition * 4));
|
||||||
|
|
||||||
|
uint8* pSongPositionTime((uint8*)(songPositionMessage->getRawData()));
|
||||||
|
|
||||||
|
*(pSongPositionTime + 1) = (uint8)(intBeat & 0x7f);
|
||||||
|
*(pSongPositionTime + 2) = (uint8)((intBeat & 0x3f80)>>7);
|
||||||
|
|
||||||
|
buffer->addEvent(*songPositionMessage, posInBuffer);
|
||||||
|
}
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
|
||||||
|
//#######################################################################################
|
||||||
|
//Class to insert Midiclock messages into a given MidiBuffer, suitable for block
|
||||||
|
//based audio callbacks. The class can act on position jumps e.g. "Loops" by sending a
|
||||||
|
//positioning message.
|
||||||
|
//NOTE: No ballistik came in to play so I wouldn't recommend using it to drive a mechanical
|
||||||
|
//tape deck!!!
|
||||||
|
//
|
||||||
|
//solar3d-software, April- 10- 2012
|
||||||
|
//#######################################################################################
|
||||||
|
|
||||||
|
*/
|
||||||
|
#ifndef __JK_MIDICLOCK
|
||||||
|
#define __JK_MIDICLOCK
|
||||||
|
|
||||||
|
#include "../JuceLibraryCode/JuceHeader.h"
|
||||||
|
|
||||||
|
//#include "Includes.h"
|
||||||
|
|
||||||
|
class JK_MidiClock
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
JK_MidiClock();
|
||||||
|
|
||||||
|
void setPositionJumpThreshold(const double ms) {posChangeThreshold = ms / 1000.0;}
|
||||||
|
double getPositionJumpThreshold() {return posChangeThreshold;}
|
||||||
|
void setFollowSongPosition(const bool shouldFollow) {followSongPosition = shouldFollow;}
|
||||||
|
bool getFollowSongPosition() {return followSongPosition;}
|
||||||
|
void setOffset(const int offset) {ppqOffset = offset;}
|
||||||
|
int getOffset() {return ppqOffset;}
|
||||||
|
|
||||||
|
void generateMidiclock(AudioPlayHead::CurrentPositionInfo &lastPosInfo,
|
||||||
|
MidiBuffer* midiBuffer,
|
||||||
|
const int bufferSize,
|
||||||
|
const double sampleRate);
|
||||||
|
|
||||||
|
//=================================================================================================
|
||||||
|
juce_UseDebuggingNewOperator
|
||||||
|
|
||||||
|
private:
|
||||||
|
inline int64 roundToInt64 (const double val) noexcept
|
||||||
|
{
|
||||||
|
return (val - floor(val) >= 0.5) ? (int64)(ceil(val)) : (int64)(floor(val));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool wasPlaying;
|
||||||
|
double syncPpqPosition;
|
||||||
|
double posChangeThreshold;
|
||||||
|
double ppqToStartSyncAt;
|
||||||
|
bool followSongPosition;
|
||||||
|
uint8 syncFlag;
|
||||||
|
int ppqOffset;
|
||||||
|
|
||||||
|
static const int cycleEnd_ = 1;
|
||||||
|
static const int startSlave_ = 2;
|
||||||
|
|
||||||
|
ScopedPointer <MidiMessage> clockMessage;
|
||||||
|
ScopedPointer <MidiMessage> continueMessage;
|
||||||
|
ScopedPointer <MidiMessage> stopMessage;
|
||||||
|
ScopedPointer <MidiMessage> songPositionMessage;
|
||||||
|
|
||||||
|
void sendSongPositionPointerMessage(const double ppqPosition, const int posInBuffer, MidiBuffer* buffer);
|
||||||
|
|
||||||
|
bool positionJumped(const double lastPosInPPQ, const double currentPosInPPQ,
|
||||||
|
const double sampleRate, const double ppqPerSample);
|
||||||
|
|
||||||
|
double getNearestSixteenthInPPQ(const double ppqPosition) {return ceil(ppqPosition * 4.0) / 4.0;}
|
||||||
|
|
||||||
|
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(JK_MidiClock);
|
||||||
|
};
|
||||||
|
#endif
|
||||||
+36
-3
@@ -113,6 +113,11 @@ JaySynth::JaySynth (int num_voices, String pathToWaves)
|
|||||||
for (i=0; i < m_num_audiothreads; i++)
|
for (i=0; i < m_num_audiothreads; i++)
|
||||||
m_ppAudioThread[i] = new JaySynthThread(&m_pEventAudioThreadRdy[i], m_pVoices, num_voices, i, m_num_audiothreads);
|
m_ppAudioThread[i] = new JaySynthThread(&m_pEventAudioThreadRdy[i], m_pVoices, num_voices, i, m_num_audiothreads);
|
||||||
|
|
||||||
|
m_clockdiv = 0;
|
||||||
|
m_lastTime_ms = 0;
|
||||||
|
m_lastTimeError_ms = 0;
|
||||||
|
m_estimatedTime_ms = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
JaySynth::~JaySynth()
|
JaySynth::~JaySynth()
|
||||||
@@ -1047,19 +1052,47 @@ void JaySynth::handleMidiEvent (const MidiMessage& m)
|
|||||||
}
|
}
|
||||||
else if (m.isMidiClock())
|
else if (m.isMidiClock())
|
||||||
{
|
{
|
||||||
|
const double alpha_1 = 1.0;
|
||||||
|
const double alpha_2 = 1.0/48;
|
||||||
|
const double currTime_ms = juce::Time::getMillisecondCounterHiRes();
|
||||||
|
|
||||||
|
double deltaTime_ms = currTime_ms - m_lastTime_ms;
|
||||||
|
|
||||||
|
if (m_lastTime_ms)
|
||||||
|
{
|
||||||
|
double timeError_ms = deltaTime_ms - m_estimatedTime_ms;
|
||||||
|
m_lastTimeError_ms = (1-alpha_1)*m_lastTimeError_ms + alpha_1*timeError_ms;
|
||||||
|
|
||||||
|
if (std::abs(timeError_ms) > 5.0)
|
||||||
|
{
|
||||||
|
m_estimatedTime_ms = deltaTime_ms;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_estimatedTime_ms = m_estimatedTime_ms + alpha_2*(m_lastTimeError_ms);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_lastTime_ms = currTime_ms;
|
||||||
|
if (!m_clockdiv)
|
||||||
|
{
|
||||||
|
uint32_t dT = (uint32_t)(24*m_estimatedTime_ms + 0.5);
|
||||||
|
listeners.call (&JaySynthListener::synthChanged, SYNTH_CHANGED_MIDICLOCK, &dT);
|
||||||
|
m_clockdiv = 24;
|
||||||
|
}
|
||||||
|
m_clockdiv--;
|
||||||
}
|
}
|
||||||
else if (m.isSongPositionPointer())
|
else if (m.isSongPositionPointer())
|
||||||
{
|
{
|
||||||
|
SynthDebug("SongPositionPointer\n");
|
||||||
|
m_clockdiv = (6 * m.getSongPositionPointerMidiBeat()) % 24;
|
||||||
}
|
}
|
||||||
else if (m.isQuarterFrame())
|
else if (m.isQuarterFrame())
|
||||||
{
|
{
|
||||||
|
SynthDebug("QuarterFrame\n");
|
||||||
}
|
}
|
||||||
else if (m.isFullFrame())
|
else if (m.isFullFrame())
|
||||||
{
|
{
|
||||||
|
SynthDebug("FullFrame\n");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
+8
-2
@@ -37,8 +37,8 @@ private:
|
|||||||
int m_num_voices;
|
int m_num_voices;
|
||||||
int m_voice_offset, m_voice_step;
|
int m_voice_offset, m_voice_step;
|
||||||
int m_sample_len;
|
int m_sample_len;
|
||||||
WaitableEvent *m_pEventRun;
|
ScopedPointer<WaitableEvent> m_pEventRun;
|
||||||
WaitableEvent *m_pEventRdy;
|
ScopedPointer<WaitableEvent> m_pEventRdy;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -158,6 +158,7 @@ public:
|
|||||||
SYNTH_CHANGED_NUM_VOICES_PLAYING,
|
SYNTH_CHANGED_NUM_VOICES_PLAYING,
|
||||||
SYNTH_CHANGED_NOTE_PRESSED,
|
SYNTH_CHANGED_NOTE_PRESSED,
|
||||||
SYNTH_CHANGED_NOTE_RELEASED,
|
SYNTH_CHANGED_NOTE_RELEASED,
|
||||||
|
SYNTH_CHANGED_MIDICLOCK,
|
||||||
SYNTH_CHANGED_SIZE
|
SYNTH_CHANGED_SIZE
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -246,6 +247,11 @@ private:
|
|||||||
JaySynthThread **m_ppAudioThread;
|
JaySynthThread **m_ppAudioThread;
|
||||||
ScopedPointer <WaitableEvent> m_pEventAudioThreadRdy;
|
ScopedPointer <WaitableEvent> m_pEventAudioThreadRdy;
|
||||||
JaySynthMonophonicMGR m_monoMGR;
|
JaySynthMonophonicMGR m_monoMGR;
|
||||||
|
uint32_t m_clockdiv;
|
||||||
|
double m_lastTime_ms;
|
||||||
|
double m_lastTimeError_ms;
|
||||||
|
double m_estimatedTime_ms;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+1230
-1406
File diff suppressed because it is too large
Load Diff
@@ -1,26 +1,24 @@
|
|||||||
/*
|
/*
|
||||||
==============================================================================
|
==============================================================================
|
||||||
|
|
||||||
This is an automatically generated file created by the Jucer!
|
This is an automatically generated GUI class created by the Introjucer!
|
||||||
|
|
||||||
Creation date: 31 Mar 2014 12:38:24pm
|
|
||||||
|
|
||||||
Be careful when adding custom code to these files, as only the code within
|
Be careful when adding custom code to these files, as only the code within
|
||||||
the "//[xyz]" and "//[/xyz]" sections will be retained when the file is loaded
|
the "//[xyz]" and "//[/xyz]" sections will be retained when the file is loaded
|
||||||
and re-saved.
|
and re-saved.
|
||||||
|
|
||||||
Jucer version: 1.12
|
Created with Introjucer version: 3.1.0
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
The Jucer is part of the JUCE library - "Jules' Utility Class Extensions"
|
The Introjucer is part of the JUCE library - "Jules' Utility Class Extensions"
|
||||||
Copyright 2004-6 by Raw Material Software ltd.
|
Copyright 2004-13 by Raw Material Software Ltd.
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __JUCER_HEADER_JAYSYNTHAUDIOPROCESSOREDITOR_JAYSYNTHAUDIOPROCESSOREDITOR_1F0BC626__
|
#ifndef __JUCE_HEADER_AD3FF14AD0EF4DBE__
|
||||||
#define __JUCER_HEADER_JAYSYNTHAUDIOPROCESSOREDITOR_JAYSYNTHAUDIOPROCESSOREDITOR_1F0BC626__
|
#define __JUCE_HEADER_AD3FF14AD0EF4DBE__
|
||||||
|
|
||||||
//[Headers] -- You can add your own extra header files here --
|
//[Headers] -- You can add your own extra header files here --
|
||||||
#include "../JuceLibraryCode/JuceHeader.h"
|
#include "../JuceLibraryCode/JuceHeader.h"
|
||||||
@@ -90,9 +88,6 @@ public:
|
|||||||
static const int led_23_red1_pngSize;
|
static const int led_23_red1_pngSize;
|
||||||
|
|
||||||
|
|
||||||
//==============================================================================
|
|
||||||
juce_UseDebuggingNewOperator
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
//[UserVariables] -- You can add your own custom variables in this section.
|
//[UserVariables] -- You can add your own custom variables in this section.
|
||||||
JaySynthAudioProcessor* getProcessor() const
|
JaySynthAudioProcessor* getProcessor() const
|
||||||
@@ -110,221 +105,223 @@ private:
|
|||||||
//[/UserVariables]
|
//[/UserVariables]
|
||||||
|
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
Label* m_label_colon;
|
ScopedPointer<Label> m_label_colon;
|
||||||
Slider* m_slider_master_volume;
|
ScopedPointer<Slider> m_slider_master_volume;
|
||||||
Slider* m_slider_vcf_f;
|
ScopedPointer<Slider> m_slider_vcf_f;
|
||||||
Slider* m_slider_vcf_q;
|
ScopedPointer<Slider> m_slider_vcf_q;
|
||||||
Slider* m_slider_osc0_det;
|
ScopedPointer<Slider> m_slider_osc0_det;
|
||||||
Slider* m_slider_osc1_det;
|
ScopedPointer<Slider> m_slider_osc1_det;
|
||||||
Slider* m_slider_osc0_transpose;
|
ScopedPointer<Slider> m_slider_osc0_transpose;
|
||||||
Slider* m_slider_osc1_transpose;
|
ScopedPointer<Slider> m_slider_osc1_transpose;
|
||||||
Slider* m_slider_vca_env_attack;
|
ScopedPointer<Slider> m_slider_vca_env_attack;
|
||||||
Slider* m_slider_vca_env_decay;
|
ScopedPointer<Slider> m_slider_vca_env_decay;
|
||||||
Slider* m_slider_vca_env_release;
|
ScopedPointer<Slider> m_slider_vca_env_release;
|
||||||
Slider* m_slider_vca_env_sustain;
|
ScopedPointer<Slider> m_slider_vca_env_sustain;
|
||||||
Slider* m_slider_vcf_env_attack;
|
ScopedPointer<Slider> m_slider_vcf_env_attack;
|
||||||
Slider* m_slider_vcf_env_decay;
|
ScopedPointer<Slider> m_slider_vcf_env_decay;
|
||||||
Slider* m_slider_vcf_env_release;
|
ScopedPointer<Slider> m_slider_vcf_env_release;
|
||||||
Slider* m_slider_vcf_env_sustain;
|
ScopedPointer<Slider> m_slider_vcf_env_sustain;
|
||||||
Slider* m_slider_vcf_env_amount;
|
ScopedPointer<Slider> m_slider_vcf_env_amount;
|
||||||
Label* m_label_vcf_env_attack;
|
ScopedPointer<Label> m_label_vcf_env_attack;
|
||||||
Label* m_label_vcf_f;
|
ScopedPointer<Label> m_label_vcf_f;
|
||||||
Label* m_label_vca_env_attack;
|
ScopedPointer<Label> m_label_vca_env_attack;
|
||||||
Label* m_label_vca_env_decay;
|
ScopedPointer<Label> m_label_vca_env_decay;
|
||||||
Label* m_label_vca_env_sustain;
|
ScopedPointer<Label> m_label_vca_env_sustain;
|
||||||
Label* m_label_vca_env_release;
|
ScopedPointer<Label> m_label_vca_env_release;
|
||||||
Label* m_label_vcf_env_decay;
|
ScopedPointer<Label> m_label_vcf_env_decay;
|
||||||
Label* m_label_vcf_env_sustain;
|
ScopedPointer<Label> m_label_vcf_env_sustain;
|
||||||
Label* m_label_vcf_env_release;
|
ScopedPointer<Label> m_label_vcf_env_release;
|
||||||
Label* m_label_vcf_q;
|
ScopedPointer<Label> m_label_vcf_q;
|
||||||
Label* m_label_vcf_env_amount;
|
ScopedPointer<Label> m_label_vcf_env_amount;
|
||||||
Label* m_label_master_volume;
|
ScopedPointer<Label> m_label_master_volume;
|
||||||
Label* m_label_osc0_transpose;
|
ScopedPointer<Label> m_label_osc0_transpose;
|
||||||
Label* m_label_osc1_transpose;
|
ScopedPointer<Label> m_label_osc1_transpose;
|
||||||
Label* m_label_osc0_det;
|
ScopedPointer<Label> m_label_osc0_det;
|
||||||
Label* m_label_osc1_det;
|
ScopedPointer<Label> m_label_osc1_det;
|
||||||
Slider* m_slider_vca_env_amount;
|
ScopedPointer<Slider> m_slider_vca_env_amount;
|
||||||
Label* m_label_vca_env_amount;
|
ScopedPointer<Label> m_label_vca_env_amount;
|
||||||
Slider* m_slider_osc0_dutycycle;
|
ScopedPointer<Slider> m_slider_osc0_dutycycle;
|
||||||
Slider* m_slider_osc1_dutycycle;
|
ScopedPointer<Slider> m_slider_osc1_dutycycle;
|
||||||
Label* m_label_osc0_dutycycle;
|
ScopedPointer<Label> m_label_osc0_dutycycle;
|
||||||
Label* m_label_osc1_dutycycle;
|
ScopedPointer<Label> m_label_osc1_dutycycle;
|
||||||
Slider* m_slider_lfo0_speed;
|
ScopedPointer<Slider> m_slider_lfo0_speed;
|
||||||
Slider* m_slider_osc1_fm_amt0;
|
ScopedPointer<Slider> m_slider_osc1_fm_amt0;
|
||||||
Slider* m_slider_osc0_fm_amt0;
|
ScopedPointer<Slider> m_slider_osc0_fm_amt0;
|
||||||
Label* m_label_lfo0_speed;
|
ScopedPointer<Label> m_label_lfo0_speed;
|
||||||
Label* m_label_osc0_fm_amt0;
|
ScopedPointer<Label> m_label_osc0_fm_amt0;
|
||||||
Label* m_label_osc1_fm_amt0;
|
ScopedPointer<Label> m_label_osc1_fm_amt0;
|
||||||
Slider* m_slider_vcf_f_amt0;
|
ScopedPointer<Slider> m_slider_vcf_f_amt0;
|
||||||
Label* m_label_vcf_f_amt0;
|
ScopedPointer<Label> m_label_vcf_f_amt0;
|
||||||
Slider* m_slider_lfo1_speed;
|
ScopedPointer<Slider> m_slider_lfo1_speed;
|
||||||
Label* m_label_lfo1_speed;
|
ScopedPointer<Label> m_label_lfo1_speed;
|
||||||
ComboBox* m_comboBox_osc0_shape;
|
ScopedPointer<ComboBox> m_comboBox_osc0_shape;
|
||||||
ComboBox* m_comboBox_osc1_shape;
|
ScopedPointer<ComboBox> m_comboBox_osc1_shape;
|
||||||
ComboBox* m_comboBox_lfo0_shape;
|
ScopedPointer<ComboBox> m_comboBox_lfo0_shape;
|
||||||
ComboBox* m_comboBox_lfo1_shape;
|
ScopedPointer<ComboBox> m_comboBox_lfo1_shape;
|
||||||
Slider* m_slider_lfo2_speed;
|
ScopedPointer<Slider> m_slider_lfo2_speed;
|
||||||
Slider* m_slider_lfo3_speed;
|
ScopedPointer<Slider> m_slider_lfo3_speed;
|
||||||
ComboBox* m_comboBox_lfo2_shape;
|
ScopedPointer<ComboBox> m_comboBox_lfo2_shape;
|
||||||
ComboBox* m_comboBox_lfo3_shape;
|
ScopedPointer<ComboBox> m_comboBox_lfo3_shape;
|
||||||
Label* m_label_lfo2_speed;
|
ScopedPointer<Label> m_label_lfo2_speed;
|
||||||
Label* m_label_lfo3_speed;
|
ScopedPointer<Label> m_label_lfo3_speed;
|
||||||
ComboBox* m_comboBox_vcf_f_src0;
|
ScopedPointer<ComboBox> m_comboBox_vcf_f_src0;
|
||||||
ComboBox* m_comboBox_osc0_fm_src0;
|
ScopedPointer<ComboBox> m_comboBox_osc0_fm_src0;
|
||||||
ComboBox* m_comboBox_osc1_fm_src0;
|
ScopedPointer<ComboBox> m_comboBox_osc1_fm_src0;
|
||||||
Slider* m_slider_vca_am_amt0;
|
ScopedPointer<Slider> m_slider_vca_am_amt0;
|
||||||
Label* m_label_vca_am_amt0;
|
ScopedPointer<Label> m_label_vca_am_amt0;
|
||||||
ComboBox* m_comboBox_vca_am_src0;
|
ScopedPointer<ComboBox> m_comboBox_vca_am_src0;
|
||||||
Slider* m_slider_vca_pan_amt0;
|
ScopedPointer<Slider> m_slider_vca_pan_amt0;
|
||||||
Label* m_label_vca_pan_amt0;
|
ScopedPointer<Label> m_label_vca_pan_amt0;
|
||||||
ComboBox* m_comboBox_vca_pan_src0;
|
ScopedPointer<ComboBox> m_comboBox_vca_pan_src0;
|
||||||
Label* m_label_synth_name;
|
ScopedPointer<Label> m_label_synth_name;
|
||||||
Label* m_label_synth_version;
|
ScopedPointer<Label> m_label_synth_version;
|
||||||
ComboBox* m_comboBox_vcf_type;
|
ScopedPointer<ComboBox> m_comboBox_vcf_type;
|
||||||
Slider* m_slider_lfo1_smooth;
|
ScopedPointer<Slider> m_slider_lfo1_smooth;
|
||||||
Label* m_label_lfo1_smooth;
|
ScopedPointer<Label> m_label_lfo1_smooth;
|
||||||
Slider* m_slider_lfo0_smooth;
|
ScopedPointer<Slider> m_slider_lfo0_smooth;
|
||||||
Label* m_label_lfo0_smooth;
|
ScopedPointer<Label> m_label_lfo0_smooth;
|
||||||
Slider* m_slider_lfo2_smooth;
|
ScopedPointer<Slider> m_slider_lfo2_smooth;
|
||||||
Label* m_label_lfo2_smooth;
|
ScopedPointer<Label> m_label_lfo2_smooth;
|
||||||
Slider* m_slider_lfo3_smooth;
|
ScopedPointer<Slider> m_slider_lfo3_smooth;
|
||||||
Label* m_label_lfo3_smooth;
|
ScopedPointer<Label> m_label_lfo3_smooth;
|
||||||
Slider* m_slider_osc0_pwm_amt0;
|
ScopedPointer<Slider> m_slider_osc0_pwm_amt0;
|
||||||
Label* m_label_osc0_pwm_amt0;
|
ScopedPointer<Label> m_label_osc0_pwm_amt0;
|
||||||
Slider* m_slider_osc1_pwm_amt0;
|
ScopedPointer<Slider> m_slider_osc1_pwm_amt0;
|
||||||
Label* m_label_osc1_pwm_amt0;
|
ScopedPointer<Label> m_label_osc1_pwm_amt0;
|
||||||
ComboBox* m_comboBox_osc0_pwm_src0;
|
ScopedPointer<ComboBox> m_comboBox_osc0_pwm_src0;
|
||||||
ComboBox* m_comboBox_osc1_pwm_src0;
|
ScopedPointer<ComboBox> m_comboBox_osc1_pwm_src0;
|
||||||
Slider* m_slider_osc0_level;
|
ScopedPointer<Slider> m_slider_osc0_level;
|
||||||
Label* m_label_osc0_level;
|
ScopedPointer<Label> m_label_osc0_level;
|
||||||
Slider* m_slider_osc1_level;
|
ScopedPointer<Slider> m_slider_osc1_level;
|
||||||
Label* m_label_osc1_level;
|
ScopedPointer<Label> m_label_osc1_level;
|
||||||
Slider* m_slider_noise_level;
|
ScopedPointer<Slider> m_slider_noise_level;
|
||||||
Label* m_label_noise_level;
|
ScopedPointer<Label> m_label_noise_level;
|
||||||
ComboBox* m_comboBox_noise_shape;
|
ScopedPointer<ComboBox> m_comboBox_noise_shape;
|
||||||
ButtonLED* m_btn_noise_enable_led;
|
ScopedPointer<ButtonLED> m_btn_noise_enable_led;
|
||||||
ButtonLED* m_btn_osc0_enable;
|
ScopedPointer<ButtonLED> m_btn_osc0_enable;
|
||||||
ButtonLED* m_btn_osc1_enable;
|
ScopedPointer<ButtonLED> m_btn_osc1_enable;
|
||||||
Label* m_label_patch_name;
|
ScopedPointer<Label> m_label_patch_name;
|
||||||
TextButton* m_button_patch_incr;
|
ScopedPointer<TextButton> m_button_patch_incr;
|
||||||
TextButton* m_button_patch_decr;
|
ScopedPointer<TextButton> m_button_patch_decr;
|
||||||
Label* m_label_patch_number;
|
ScopedPointer<Label> m_label_patch_number;
|
||||||
Label* m_label_osc1_pb_min;
|
ScopedPointer<Label> m_label_osc1_pb_min;
|
||||||
Label* m_label_osc1_pb_max;
|
ScopedPointer<Label> m_label_osc1_pb_max;
|
||||||
Label* m_label_osc0_pb_max;
|
ScopedPointer<Label> m_label_osc0_pb_max;
|
||||||
Label* m_label_osc0_pb_min;
|
ScopedPointer<Label> m_label_osc0_pb_min;
|
||||||
Slider* m_slider_master_tune;
|
ScopedPointer<Slider> m_slider_master_tune;
|
||||||
Label* m_label_master_tune;
|
ScopedPointer<Label> m_label_master_tune;
|
||||||
ToggleButton* m_button_humanize_enable;
|
ScopedPointer<ToggleButton> m_button_humanize_enable;
|
||||||
ComboBox* m_comboBox_vcf_order;
|
ScopedPointer<ComboBox> m_comboBox_vcf_order;
|
||||||
Slider* m_slider_portamento_time;
|
ScopedPointer<Slider> m_slider_portamento_time;
|
||||||
Label* m_label_portamento_time;
|
ScopedPointer<Label> m_label_portamento_time;
|
||||||
ToggleButton* m_button_unisono_enable;
|
ScopedPointer<ToggleButton> m_button_unisono_enable;
|
||||||
Slider* m_slider_humanize_var_vco;
|
ScopedPointer<Slider> m_slider_humanize_var_vco;
|
||||||
Slider* m_slider_voice_pan_spread;
|
ScopedPointer<Slider> m_slider_voice_pan_spread;
|
||||||
Label* m_label_voice_pan_spread;
|
ScopedPointer<Label> m_label_voice_pan_spread;
|
||||||
Slider* m_slider_humanize_var_vcf;
|
ScopedPointer<Slider> m_slider_humanize_var_vcf;
|
||||||
Slider* m_slider_humanize_var_env;
|
ScopedPointer<Slider> m_slider_humanize_var_env;
|
||||||
Label* m_label_unisono_num_voices;
|
ScopedPointer<Label> m_label_unisono_num_voices;
|
||||||
ToggleButton* m_button_osc0_restart_enable;
|
ScopedPointer<ToggleButton> m_button_osc0_restart_enable;
|
||||||
ToggleButton* m_button_osc1_restart_enable;
|
ScopedPointer<ToggleButton> m_button_osc1_restart_enable;
|
||||||
ToggleButton* m_button_mono_enable;
|
ScopedPointer<ToggleButton> m_button_mono_enable;
|
||||||
ComboBox* m_comboBox_osc1_fm_src1;
|
ScopedPointer<ComboBox> m_comboBox_osc1_fm_src1;
|
||||||
ComboBox* m_comboBox_osc1_pwm_src1;
|
ScopedPointer<ComboBox> m_comboBox_osc1_pwm_src1;
|
||||||
ComboBox* m_comboBox_osc0_fm_src1;
|
ScopedPointer<ComboBox> m_comboBox_osc0_fm_src1;
|
||||||
ComboBox* m_comboBox_osc0_pwm_src1;
|
ScopedPointer<ComboBox> m_comboBox_osc0_pwm_src1;
|
||||||
ComboBox* m_comboBox_osc1_am_src0;
|
ScopedPointer<ComboBox> m_comboBox_osc1_am_src0;
|
||||||
ComboBox* m_comboBox_osc1_am_src1;
|
ScopedPointer<ComboBox> m_comboBox_osc1_am_src1;
|
||||||
Slider* m_slider_osc1_am_amt0;
|
ScopedPointer<Slider> m_slider_osc1_am_amt0;
|
||||||
Label* m_label_osc1_am_amt0;
|
ScopedPointer<Label> m_label_osc1_am_amt0;
|
||||||
ComboBox* m_comboBox_osc0_am_src0;
|
ScopedPointer<ComboBox> m_comboBox_osc0_am_src0;
|
||||||
ComboBox* m_comboBox_osc0_am_src1;
|
ScopedPointer<ComboBox> m_comboBox_osc0_am_src1;
|
||||||
Slider* m_slider_osc0_am_amt0;
|
ScopedPointer<Slider> m_slider_osc0_am_amt0;
|
||||||
Label* m_label_osc0_am_amt0;
|
ScopedPointer<Label> m_label_osc0_am_amt0;
|
||||||
Slider* m_slider_env2_attack;
|
ScopedPointer<Slider> m_slider_env2_attack;
|
||||||
Slider* m_slider_env2_decay;
|
ScopedPointer<Slider> m_slider_env2_decay;
|
||||||
Slider* m_slider_env2_release;
|
ScopedPointer<Slider> m_slider_env2_release;
|
||||||
Slider* m_slider_env2_sustain;
|
ScopedPointer<Slider> m_slider_env2_sustain;
|
||||||
Label* m_label_env2_attack;
|
ScopedPointer<Label> m_label_env2_attack;
|
||||||
Label* m_label_env2_decay;
|
ScopedPointer<Label> m_label_env2_decay;
|
||||||
Label* m_label_env2_sustain;
|
ScopedPointer<Label> m_label_env2_sustain;
|
||||||
Label* m_label_env2_release;
|
ScopedPointer<Label> m_label_env2_release;
|
||||||
Slider* m_slider_env3_attack;
|
ScopedPointer<Slider> m_slider_env3_attack;
|
||||||
Slider* m_slider_env3_decay;
|
ScopedPointer<Slider> m_slider_env3_decay;
|
||||||
Slider* m_slider_env3_release;
|
ScopedPointer<Slider> m_slider_env3_release;
|
||||||
Slider* m_slider_env3_sustain;
|
ScopedPointer<Slider> m_slider_env3_sustain;
|
||||||
Label* m_label_env3_attack;
|
ScopedPointer<Label> m_label_env3_attack;
|
||||||
Label* m_label_env3_decay;
|
ScopedPointer<Label> m_label_env3_decay;
|
||||||
Label* m_label_env3_sustain;
|
ScopedPointer<Label> m_label_env3_sustain;
|
||||||
Label* m_label_env3_release;
|
ScopedPointer<Label> m_label_env3_release;
|
||||||
ComboBox* m_comboBox_vcf_f_src1;
|
ScopedPointer<ComboBox> m_comboBox_vcf_f_src1;
|
||||||
Slider* m_slider_vcf_q_amt0;
|
ScopedPointer<Slider> m_slider_vcf_q_amt0;
|
||||||
Label* m_label_vcf_q_amt0;
|
ScopedPointer<Label> m_label_vcf_q_amt0;
|
||||||
ComboBox* m_comboBox_vcf_q_src0;
|
ScopedPointer<ComboBox> m_comboBox_vcf_q_src0;
|
||||||
ComboBox* m_comboBox_vcf_q_src1;
|
ScopedPointer<ComboBox> m_comboBox_vcf_q_src1;
|
||||||
Label* m_label_humanize_var_vco;
|
ScopedPointer<Label> m_label_humanize_var_vco;
|
||||||
Label* m_label_humanize_var_vcf;
|
ScopedPointer<Label> m_label_humanize_var_vcf;
|
||||||
Label* m_label_humanize_var_env;
|
ScopedPointer<Label> m_label_humanize_var_env;
|
||||||
ButtonLED* m_btn_limiter_led;
|
ScopedPointer<ButtonLED> m_btn_limiter_led;
|
||||||
Label* m_label_limiter_led;
|
ScopedPointer<Label> m_label_limiter_led;
|
||||||
Slider* m_slider_lfo0_delay;
|
ScopedPointer<Slider> m_slider_lfo0_delay;
|
||||||
Label* m_label_lfo0_delay;
|
ScopedPointer<Label> m_label_lfo0_delay;
|
||||||
Slider* m_slider_lfo0_attack;
|
ScopedPointer<Slider> m_slider_lfo0_attack;
|
||||||
Label* m_label_lfo0_attack;
|
ScopedPointer<Label> m_label_lfo0_attack;
|
||||||
Slider* m_slider_lfo1_delay;
|
ScopedPointer<Slider> m_slider_lfo1_delay;
|
||||||
Label* m_label_lfo1_delay;
|
ScopedPointer<Label> m_label_lfo1_delay;
|
||||||
Slider* m_slider_lfo1_attack;
|
ScopedPointer<Slider> m_slider_lfo1_attack;
|
||||||
Label* m_label_lfo1_attack;
|
ScopedPointer<Label> m_label_lfo1_attack;
|
||||||
Slider* m_slider_lfo2_delay;
|
ScopedPointer<Slider> m_slider_lfo2_delay;
|
||||||
Label* m_label_lfo2_delay;
|
ScopedPointer<Label> m_label_lfo2_delay;
|
||||||
Slider* m_slider_lfo2_attack;
|
ScopedPointer<Slider> m_slider_lfo2_attack;
|
||||||
Label* m_label_lfo2_attack;
|
ScopedPointer<Label> m_label_lfo2_attack;
|
||||||
Slider* m_slider_lfo3_delay;
|
ScopedPointer<Slider> m_slider_lfo3_delay;
|
||||||
Label* m_label_lfo3_delay;
|
ScopedPointer<Label> m_label_lfo3_delay;
|
||||||
Slider* m_slider_lfo3_attack;
|
ScopedPointer<Slider> m_slider_lfo3_attack;
|
||||||
Label* m_label_lfo3_attack;
|
ScopedPointer<Label> m_label_lfo3_attack;
|
||||||
ToggleButton* m_button_lfo0_restart_enable;
|
ScopedPointer<ToggleButton> m_button_lfo0_restart_enable;
|
||||||
ToggleButton* m_button_lfo0_individual_enable;
|
ScopedPointer<ToggleButton> m_button_lfo0_individual_enable;
|
||||||
Slider* m_slider_lfo0_symmetry;
|
ScopedPointer<Slider> m_slider_lfo0_symmetry;
|
||||||
Label* m_label_lfo0_symmetry;
|
ScopedPointer<Label> m_label_lfo0_symmetry;
|
||||||
Slider* m_slider_lfo1_symmetry;
|
ScopedPointer<Slider> m_slider_lfo1_symmetry;
|
||||||
Label* m_label_lfo1_symmetry;
|
ScopedPointer<Label> m_label_lfo1_symmetry;
|
||||||
ToggleButton* m_button_lfo1_restart_enable;
|
ScopedPointer<ToggleButton> m_button_lfo1_restart_enable;
|
||||||
ToggleButton* m_button_lfo1_individual_enable;
|
ScopedPointer<ToggleButton> m_button_lfo1_individual_enable;
|
||||||
ToggleButton* m_button_lfo2_restart_enable;
|
ScopedPointer<ToggleButton> m_button_lfo2_restart_enable;
|
||||||
ToggleButton* m_button_lfo2_individual_enable;
|
ScopedPointer<ToggleButton> m_button_lfo2_individual_enable;
|
||||||
Slider* m_slider_lfo2_symmetry;
|
ScopedPointer<Slider> m_slider_lfo2_symmetry;
|
||||||
Label* m_label_lfo2_symmetry;
|
ScopedPointer<Label> m_label_lfo2_symmetry;
|
||||||
Slider* m_slider_lfo3_symmetry;
|
ScopedPointer<Slider> m_slider_lfo3_symmetry;
|
||||||
Label* m_label_lfo3_symmetry;
|
ScopedPointer<Label> m_label_lfo3_symmetry;
|
||||||
ToggleButton* m_button_lfo3_restart_enable;
|
ScopedPointer<ToggleButton> m_button_lfo3_restart_enable;
|
||||||
ToggleButton* m_button_lfo3_individual_enable;
|
ScopedPointer<ToggleButton> m_button_lfo3_individual_enable;
|
||||||
Slider* m_slider_osc0_fm_amt1;
|
ScopedPointer<Slider> m_slider_osc0_fm_amt1;
|
||||||
Label* m_label_osc0_fm_amt1;
|
ScopedPointer<Label> m_label_osc0_fm_amt1;
|
||||||
Slider* m_slider_osc0_pwm_amt1;
|
ScopedPointer<Slider> m_slider_osc0_pwm_amt1;
|
||||||
Label* m_label_osc0_pwm_amt1;
|
ScopedPointer<Label> m_label_osc0_pwm_amt1;
|
||||||
Slider* m_slider_osc0_am_amt1;
|
ScopedPointer<Slider> m_slider_osc0_am_amt1;
|
||||||
Label* m_label_osc0_am_amt1;
|
ScopedPointer<Label> m_label_osc0_am_amt1;
|
||||||
Slider* m_slider_osc1_fm_amt1;
|
ScopedPointer<Slider> m_slider_osc1_fm_amt1;
|
||||||
Label* m_label_osc1_fm_amt1;
|
ScopedPointer<Label> m_label_osc1_fm_amt1;
|
||||||
Slider* m_slider_osc1_pwm_amt1;
|
ScopedPointer<Slider> m_slider_osc1_pwm_amt1;
|
||||||
Label* m_label_osc1_pwm_amt1;
|
ScopedPointer<Label> m_label_osc1_pwm_amt1;
|
||||||
Slider* m_slider_osc1_am_amt1;
|
ScopedPointer<Slider> m_slider_osc1_am_amt1;
|
||||||
Label* m_label_osc1_am_amt1;
|
ScopedPointer<Label> m_label_osc1_am_amt1;
|
||||||
Slider* m_slider_vcf_f_amt1;
|
ScopedPointer<Slider> m_slider_vcf_f_amt1;
|
||||||
Label* m_label_vcf_f_amt1;
|
ScopedPointer<Label> m_label_vcf_f_amt1;
|
||||||
Slider* m_slider_vcf_q_amt1;
|
ScopedPointer<Slider> m_slider_vcf_q_amt1;
|
||||||
Label* m_label_vcf_q_amt1;
|
ScopedPointer<Label> m_label_vcf_q_amt1;
|
||||||
ToggleButton* m_button_mono_retrigger;
|
ScopedPointer<ToggleButton> m_button_mono_retrigger;
|
||||||
Label* m_label_max_num_voices;
|
ScopedPointer<Label> m_label_max_num_voices;
|
||||||
Label* m_label_num_voices_playing;
|
ScopedPointer<Label> m_label_num_voices_playing;
|
||||||
|
ScopedPointer<Label> m_labelDebug;
|
||||||
|
ScopedPointer<ButtonLED> m_btn_midiClockLed;
|
||||||
|
|
||||||
|
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
// (prevent copy constructor and operator= being generated..)
|
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JaySynthAudioProcessorEditor)
|
||||||
JaySynthAudioProcessorEditor (const JaySynthAudioProcessorEditor&);
|
|
||||||
const JaySynthAudioProcessorEditor& operator= (const JaySynthAudioProcessorEditor&);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//[EndFile] You can add extra defines here...
|
||||||
|
//[/EndFile]
|
||||||
|
|
||||||
#endif // __JUCER_HEADER_JAYSYNTHAUDIOPROCESSOREDITOR_JAYSYNTHAUDIOPROCESSOREDITOR_1F0BC626__
|
#endif // __JUCE_HEADER_AD3FF14AD0EF4DBE__
|
||||||
|
|||||||
@@ -166,6 +166,11 @@ void JaySynthAudioProcessor::synthChanged(int type, void *pData)
|
|||||||
actionListener.callNumVoicesPlaying(*((int*)pData));
|
actionListener.callNumVoicesPlaying(*((int*)pData));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case JaySynth::SYNTH_CHANGED_MIDICLOCK:
|
||||||
|
if (getEditor(this) != NULL)
|
||||||
|
actionListener.callMidiClock(*((uint32_t*)pData));
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -518,6 +523,11 @@ void JaySynthAudioProcessor::processBlock (AudioSampleBuffer& buffer, MidiBuffer
|
|||||||
synth_float_t x, limiter_ar, limiter_af, limiter_threshold;
|
synth_float_t x, limiter_ar, limiter_af, limiter_threshold;
|
||||||
float synth_gain;
|
float synth_gain;
|
||||||
|
|
||||||
|
AudioPlayHead::CurrentPositionInfo pos;
|
||||||
|
getPlayHead()->getCurrentPosition(pos);
|
||||||
|
|
||||||
|
m_JK_MidiClock.generateMidiclock(pos, &midiMessages, numSamples, getSampleRate());
|
||||||
|
|
||||||
// Now pass any incoming midi messages to our keyboard state object, and let it
|
// Now pass any incoming midi messages to our keyboard state object, and let it
|
||||||
// add messages to the buffer if the user is clicking on the on-screen keys
|
// add messages to the buffer if the user is clicking on the on-screen keys
|
||||||
keyboardState.processNextMidiBuffer (midiMessages, 0, numSamples, true);
|
keyboardState.processNextMidiBuffer (midiMessages, 0, numSamples, true);
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
#include "synth/synth_defs.h"
|
#include "synth/synth_defs.h"
|
||||||
#include "JaySynthSound.h"
|
#include "JaySynthSound.h"
|
||||||
#include "JaySynth.h"
|
#include "JaySynth.h"
|
||||||
|
#include "JK_MidiClock.h"
|
||||||
|
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
/**
|
/**
|
||||||
@@ -30,6 +31,7 @@ public:
|
|||||||
JAYSYNTH_CHANGED_NOTE_PRESSED,
|
JAYSYNTH_CHANGED_NOTE_PRESSED,
|
||||||
JAYSYNTH_CHANGED_NOTE_RELEASED,
|
JAYSYNTH_CHANGED_NOTE_RELEASED,
|
||||||
JAYSYNTH_CHANGED_NUM_VOICES_PLAYING,
|
JAYSYNTH_CHANGED_NUM_VOICES_PLAYING,
|
||||||
|
JAYSYNTH_CHANGED_MIDICLOCK,
|
||||||
JAYSYNTH_CHANGED_PROGRAM,
|
JAYSYNTH_CHANGED_PROGRAM,
|
||||||
JAYSYNTH_CHANGED_LIMITER,
|
JAYSYNTH_CHANGED_LIMITER,
|
||||||
JAYSYNTH_CHANGED_SIZE
|
JAYSYNTH_CHANGED_SIZE
|
||||||
@@ -111,6 +113,16 @@ public:
|
|||||||
sendActionMessage(s);
|
sendActionMessage(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void callMidiClock (uint32_t deltaTime_ms)
|
||||||
|
{
|
||||||
|
String s;
|
||||||
|
s = String("type=") + String(JAYSYNTH_CHANGED_MIDICLOCK);
|
||||||
|
s = s + String(" ");
|
||||||
|
s = s + String("value=") + String(deltaTime_ms);
|
||||||
|
s = s + String(" ");
|
||||||
|
sendActionMessage(s);
|
||||||
|
}
|
||||||
|
|
||||||
void callBinary(void *pData, int size)
|
void callBinary(void *pData, int size)
|
||||||
{
|
{
|
||||||
String s;
|
String s;
|
||||||
@@ -340,6 +352,8 @@ private:
|
|||||||
JaySynthMidiCC midCC_editBuffer;
|
JaySynthMidiCC midCC_editBuffer;
|
||||||
int m_limiter_active;
|
int m_limiter_active;
|
||||||
synth_float_t m_limiter_env;
|
synth_float_t m_limiter_env;
|
||||||
|
JK_MidiClock m_JK_MidiClock;
|
||||||
|
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JaySynthAudioProcessor);
|
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JaySynthAudioProcessor);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ OBJECTFILES= \
|
|||||||
${OBJECTDIR}/JuceLibraryCode/modules/juce_graphics/juce_graphics.o \
|
${OBJECTDIR}/JuceLibraryCode/modules/juce_graphics/juce_graphics.o \
|
||||||
${OBJECTDIR}/JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.o \
|
${OBJECTDIR}/JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.o \
|
||||||
${OBJECTDIR}/Source/ButtonLED.o \
|
${OBJECTDIR}/Source/ButtonLED.o \
|
||||||
|
${OBJECTDIR}/Source/JK_MidiClock.o \
|
||||||
${OBJECTDIR}/Source/JaySynth.o \
|
${OBJECTDIR}/Source/JaySynth.o \
|
||||||
${OBJECTDIR}/Source/JaySynthAudioProcessorEditor.o \
|
${OBJECTDIR}/Source/JaySynthAudioProcessorEditor.o \
|
||||||
${OBJECTDIR}/Source/JaySynthMidiCC.o \
|
${OBJECTDIR}/Source/JaySynthMidiCC.o \
|
||||||
@@ -150,6 +151,11 @@ ${OBJECTDIR}/Source/ButtonLED.o: Source/ButtonLED.cpp
|
|||||||
${RM} "$@.d"
|
${RM} "$@.d"
|
||||||
$(COMPILE.cc) -g -DDEBUG -DSYNTH_DEBUG -DWIN32 -D_DEBUG -D_WINDOWS -Dfir_float_t=double -I../../libsrc -IJuceLibraryCode -I../../../extLib/vst2/vstsdk2.4 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/Source/ButtonLED.o Source/ButtonLED.cpp
|
$(COMPILE.cc) -g -DDEBUG -DSYNTH_DEBUG -DWIN32 -D_DEBUG -D_WINDOWS -Dfir_float_t=double -I../../libsrc -IJuceLibraryCode -I../../../extLib/vst2/vstsdk2.4 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/Source/ButtonLED.o Source/ButtonLED.cpp
|
||||||
|
|
||||||
|
${OBJECTDIR}/Source/JK_MidiClock.o: Source/JK_MidiClock.cpp
|
||||||
|
${MKDIR} -p ${OBJECTDIR}/Source
|
||||||
|
${RM} "$@.d"
|
||||||
|
$(COMPILE.cc) -g -DDEBUG -DSYNTH_DEBUG -DWIN32 -D_DEBUG -D_WINDOWS -Dfir_float_t=double -I../../libsrc -IJuceLibraryCode -I../../../extLib/vst2/vstsdk2.4 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/Source/JK_MidiClock.o Source/JK_MidiClock.cpp
|
||||||
|
|
||||||
${OBJECTDIR}/Source/JaySynth.o: Source/JaySynth.cpp
|
${OBJECTDIR}/Source/JaySynth.o: Source/JaySynth.cpp
|
||||||
${MKDIR} -p ${OBJECTDIR}/Source
|
${MKDIR} -p ${OBJECTDIR}/Source
|
||||||
${RM} "$@.d"
|
${RM} "$@.d"
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ OBJECTFILES= \
|
|||||||
${OBJECTDIR}/JuceLibraryCode/modules/juce_graphics/juce_graphics.o \
|
${OBJECTDIR}/JuceLibraryCode/modules/juce_graphics/juce_graphics.o \
|
||||||
${OBJECTDIR}/JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.o \
|
${OBJECTDIR}/JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.o \
|
||||||
${OBJECTDIR}/Source/ButtonLED.o \
|
${OBJECTDIR}/Source/ButtonLED.o \
|
||||||
|
${OBJECTDIR}/Source/JK_MidiClock.o \
|
||||||
${OBJECTDIR}/Source/JaySynth.o \
|
${OBJECTDIR}/Source/JaySynth.o \
|
||||||
${OBJECTDIR}/Source/JaySynthAudioProcessorEditor.o \
|
${OBJECTDIR}/Source/JaySynthAudioProcessorEditor.o \
|
||||||
${OBJECTDIR}/Source/JaySynthMidiCC.o \
|
${OBJECTDIR}/Source/JaySynthMidiCC.o \
|
||||||
@@ -150,6 +151,11 @@ ${OBJECTDIR}/Source/ButtonLED.o: Source/ButtonLED.cpp
|
|||||||
${RM} "$@.d"
|
${RM} "$@.d"
|
||||||
$(COMPILE.cc) -O3 -s -DWIN32 -D_WINDOWS -Dfir_float_t=double -I../../libsrc -IJuceLibraryCode -I../../../extLib/vst2/vstsdk2.4 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/Source/ButtonLED.o Source/ButtonLED.cpp
|
$(COMPILE.cc) -O3 -s -DWIN32 -D_WINDOWS -Dfir_float_t=double -I../../libsrc -IJuceLibraryCode -I../../../extLib/vst2/vstsdk2.4 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/Source/ButtonLED.o Source/ButtonLED.cpp
|
||||||
|
|
||||||
|
${OBJECTDIR}/Source/JK_MidiClock.o: Source/JK_MidiClock.cpp
|
||||||
|
${MKDIR} -p ${OBJECTDIR}/Source
|
||||||
|
${RM} "$@.d"
|
||||||
|
$(COMPILE.cc) -O3 -s -DWIN32 -D_WINDOWS -Dfir_float_t=double -I../../libsrc -IJuceLibraryCode -I../../../extLib/vst2/vstsdk2.4 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/Source/JK_MidiClock.o Source/JK_MidiClock.cpp
|
||||||
|
|
||||||
${OBJECTDIR}/Source/JaySynth.o: Source/JaySynth.cpp
|
${OBJECTDIR}/Source/JaySynth.o: Source/JaySynth.cpp
|
||||||
${MKDIR} -p ${OBJECTDIR}/Source
|
${MKDIR} -p ${OBJECTDIR}/Source
|
||||||
${RM} "$@.d"
|
${RM} "$@.d"
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
projectFiles="true">
|
projectFiles="true">
|
||||||
<itemPath>JuceLibraryCode/AppConfig.h</itemPath>
|
<itemPath>JuceLibraryCode/AppConfig.h</itemPath>
|
||||||
<itemPath>Source/ButtonLED.h</itemPath>
|
<itemPath>Source/ButtonLED.h</itemPath>
|
||||||
|
<itemPath>Source/JK_MidiClock.h</itemPath>
|
||||||
<itemPath>Source/JaySynth.h</itemPath>
|
<itemPath>Source/JaySynth.h</itemPath>
|
||||||
<itemPath>Source/JaySynthAudioProcessorEditor.h</itemPath>
|
<itemPath>Source/JaySynthAudioProcessorEditor.h</itemPath>
|
||||||
<itemPath>Source/JaySynthMidiCC.h</itemPath>
|
<itemPath>Source/JaySynthMidiCC.h</itemPath>
|
||||||
@@ -70,6 +71,7 @@
|
|||||||
<itemPath>Source/synth/wavetable.h</itemPath>
|
<itemPath>Source/synth/wavetable.h</itemPath>
|
||||||
</logicalFolder>
|
</logicalFolder>
|
||||||
<itemPath>Source/ButtonLED.cpp</itemPath>
|
<itemPath>Source/ButtonLED.cpp</itemPath>
|
||||||
|
<itemPath>Source/JK_MidiClock.cpp</itemPath>
|
||||||
<itemPath>Source/JaySynth.cpp</itemPath>
|
<itemPath>Source/JaySynth.cpp</itemPath>
|
||||||
<itemPath>Source/JaySynthAudioProcessorEditor.cpp</itemPath>
|
<itemPath>Source/JaySynthAudioProcessorEditor.cpp</itemPath>
|
||||||
<itemPath>Source/JaySynthMidiCC.cpp</itemPath>
|
<itemPath>Source/JaySynthMidiCC.cpp</itemPath>
|
||||||
@@ -200,6 +202,10 @@
|
|||||||
</item>
|
</item>
|
||||||
<item path="Source/ButtonLED.h" ex="false" tool="3" flavor2="0">
|
<item path="Source/ButtonLED.h" ex="false" tool="3" flavor2="0">
|
||||||
</item>
|
</item>
|
||||||
|
<item path="Source/JK_MidiClock.cpp" ex="false" tool="1" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="Source/JK_MidiClock.h" ex="false" tool="3" flavor2="0">
|
||||||
|
</item>
|
||||||
<item path="Source/JaySynth.cpp" ex="false" tool="1" flavor2="0">
|
<item path="Source/JaySynth.cpp" ex="false" tool="1" flavor2="0">
|
||||||
</item>
|
</item>
|
||||||
<item path="Source/JaySynth.h" ex="false" tool="3" flavor2="0">
|
<item path="Source/JaySynth.h" ex="false" tool="3" flavor2="0">
|
||||||
@@ -409,6 +415,10 @@
|
|||||||
</item>
|
</item>
|
||||||
<item path="Source/ButtonLED.h" ex="false" tool="3" flavor2="0">
|
<item path="Source/ButtonLED.h" ex="false" tool="3" flavor2="0">
|
||||||
</item>
|
</item>
|
||||||
|
<item path="Source/JK_MidiClock.cpp" ex="false" tool="1" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="Source/JK_MidiClock.h" ex="false" tool="3" flavor2="0">
|
||||||
|
</item>
|
||||||
<item path="Source/JaySynth.cpp" ex="false" tool="1" flavor2="0">
|
<item path="Source/JaySynth.cpp" ex="false" tool="1" flavor2="0">
|
||||||
</item>
|
</item>
|
||||||
<item path="Source/JaySynth.h" ex="false" tool="3" flavor2="0">
|
<item path="Source/JaySynth.h" ex="false" tool="3" flavor2="0">
|
||||||
|
|||||||
Reference in New Issue
Block a user