Compare commits
43 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
523e5d048b | ||
|
|
e33645f9ab | ||
|
|
24f869c379 | ||
|
|
1abb37529d | ||
|
|
49b3f36a57 | ||
|
|
a1dce66ca8 | ||
|
|
ffde891cfb | ||
|
|
5fdc452476 | ||
|
|
44f72b0f13 | ||
|
|
93b6888394 | ||
|
|
e503875a28 | ||
|
|
5bf095b6b9 | ||
|
|
62df768896 | ||
|
|
58d864a630 | ||
|
|
b5538c7da8 | ||
|
|
122b845105 | ||
|
|
76a1b8c2b6 | ||
|
|
ee39cbe94d | ||
|
|
af66303fc4 | ||
|
|
6aae0e6897 | ||
|
|
ef7d3ff328 | ||
|
|
a0d07db8f1 | ||
|
|
36d02b9887 | ||
|
|
25ab7260f5 | ||
|
|
5172acb1e3 | ||
|
|
2ee8f1445c | ||
|
|
e0f7ea57ac | ||
|
|
0a732fbc04 | ||
|
|
b59a50133a | ||
|
|
ddbb180800 | ||
|
|
f7741f184f | ||
|
|
3ad6d6ca7a | ||
|
|
0891c53582 | ||
|
|
3c5d940561 | ||
|
|
448b783e8b | ||
|
|
85da25fe2a | ||
|
|
de56c989e9 | ||
|
|
d21f0a7114 | ||
|
|
347b5a121d | ||
|
|
da6fd6ef5c | ||
|
|
ed0dc6770d | ||
|
|
f2ab783db9 | ||
|
|
91063ab7d2 |
@@ -14,8 +14,8 @@ INCLUDE(CheckIncludeFiles)
|
||||
INCLUDE(FindPkgConfig)
|
||||
|
||||
SET(VERSION_MAJOR "1")
|
||||
SET(VERSION_MINOR "0")
|
||||
SET(VERSION_PATCH "100")
|
||||
SET(VERSION_MINOR "1")
|
||||
SET(VERSION_PATCH "1")
|
||||
#SET(VERSION_SUFFIX "")
|
||||
SET(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
|
||||
IF(VERSION_SUFFIX)
|
||||
|
||||
Binary file not shown.
@@ -654,6 +654,63 @@ Wenn Sie daran interessiert sind LMMS in eine andere Sprache zu übersetzen oder
|
||||
<translation>Plugin entfe&rnen</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DelayControls</name>
|
||||
<message>
|
||||
<source>Delay Samples</source>
|
||||
<translation>Samples verzögern</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Feedback</source>
|
||||
<translation>Rückkopplung</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Lfo Frequency</source>
|
||||
<translation>LFO-Frequenz</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Lfo Amount</source>
|
||||
<translation>LFO-Stärke</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DelayControlsDialog</name>
|
||||
<message>
|
||||
<source>Delay</source>
|
||||
<translation>Verzögerung</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Delay Time</source>
|
||||
<translation>Verzögerungszeit</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Regen</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Feedback Amount</source>
|
||||
<translation>Rückkopplungsstärke</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Rate</source>
|
||||
<translation>Rate</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Lfo</source>
|
||||
<translation>LFO</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Lfo Amt</source>
|
||||
<translation>LFO-Stärke</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DetuningHelper</name>
|
||||
<message>
|
||||
<source>Note detuning</source>
|
||||
<translation>Noten-Verstimmung</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DualFilterControlDialog</name>
|
||||
<message>
|
||||
@@ -780,6 +837,13 @@ Wenn Sie daran interessiert sind LMMS in eine andere Sprache zu übersetzen oder
|
||||
<translation>Vokalformant-Filter</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DummyEffect</name>
|
||||
<message>
|
||||
<source>NOT FOUND</source>
|
||||
<translation>NICHT GEFUNDEN</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Effect</name>
|
||||
<message>
|
||||
@@ -3294,7 +3358,7 @@ Bitte besuchen Sie http://lmms.sf.net/wiki für Dokumentationen über LMMS.</tra
|
||||
</message>
|
||||
<message>
|
||||
<source>Bandlimited Ramp wave</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Bandbegrenzte Sägezahnwelle</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Bandlimited Square wave</source>
|
||||
@@ -3330,7 +3394,7 @@ Bitte besuchen Sie http://lmms.sf.net/wiki für Dokumentationen über LMMS.</tra
|
||||
</message>
|
||||
<message>
|
||||
<source>Digital Ramp wave</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Digitale Sägezahnwelle</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Digital Square wave</source>
|
||||
@@ -3350,7 +3414,7 @@ Bitte besuchen Sie http://lmms.sf.net/wiki für Dokumentationen über LMMS.</tra
|
||||
</message>
|
||||
<message>
|
||||
<source>Ramp wave</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Sägezahnwelle</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Square wave</source>
|
||||
@@ -4085,6 +4149,21 @@ Grund: »%2«</translation>
|
||||
<translation>LMMS Plugin %1 hat keinen Plugin-Deskriptor namens %2!</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PluginBrowser</name>
|
||||
<message>
|
||||
<source>Instrument plugins</source>
|
||||
<translation>Instrument-Plugins</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Instrument browser</source>
|
||||
<translation>Instrument-Browser</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Drag an instrument into either the Song-Editor, the Beat+Bassline Editor or into an existing instrument track.</source>
|
||||
<translation>Ziehen Sie ein Instrument entweder in den Song-Editor, den Beat+Bassline-Editor oder in eine existierende Instrumentspur.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ProjectRenderer</name>
|
||||
<message>
|
||||
@@ -6990,10 +7069,6 @@ Doppelklicken auf eines der Plugins zeigt Informaitonen über die Ports an.</tra
|
||||
</context>
|
||||
<context>
|
||||
<name>pluginBrowser</name>
|
||||
<message>
|
||||
<source>Instrument plugins</source>
|
||||
<translation>Instrument-Plugins</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>VST-host for using VST(i)-plugins within LMMS</source>
|
||||
<translation>VST-Host zum Benutzen von VST(i)-Plugins innerhalb von LMMS</translation>
|
||||
@@ -7056,14 +7131,6 @@ This chip was used in the Commodore 64 computer.</source>
|
||||
<translation>Emulation des MOS6581 und MOS8580 SID Chips.
|
||||
Dieser Chip wurde in Commodore 64 Computern genutzt.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Instrument browser</source>
|
||||
<translation>Instrument-Browser</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Drag an instrument into either the Song-Editor, the Beat+Bassline Editor or into an existing instrument track.</source>
|
||||
<translation>Ziehen Sie ein Instrument entweder in den Song-Editor, den Beat+Bassline-Editor oder in eine existierende Instrumentspur.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Player for SoundFont files</source>
|
||||
<translation>Wiedergabe von SoundFont-Dateien</translation>
|
||||
@@ -7148,6 +7215,10 @@ Dieser Chip wurde in Commodore 64 Computern genutzt.</translation>
|
||||
<source>Carla Patchbay Instrument</source>
|
||||
<translation>Carla Patchbay Instrument</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>A native delay plugin</source>
|
||||
<translation>Ein natives Verzögerung-Plugin</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>projectNotes</name>
|
||||
@@ -7476,6 +7547,57 @@ Latenz: %2 ms</translation>
|
||||
<translation>Wiedergabe-Courser im AudioFileProcessor anzeigen</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>setupWidget</name>
|
||||
<message>
|
||||
<source>OSS (Open Sound System)</source>
|
||||
<translation>OSS (Open Sound System)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SDL (Simple DirectMedia Layer)</source>
|
||||
<translation>SDL (Simple DirectMedia Layer)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>ALSA-Sequencer (Advanced Linux Sound Architecture)</source>
|
||||
<translation>ALSA-Sequencer (Advanced Linux Sound Architecture)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>JACK (JACK Audio Connection Kit)</source>
|
||||
<translation>JACK (JACK Audio Connection Kit)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>ALSA Raw-MIDI (Advanced Linux Sound Architecture)</source>
|
||||
<translation>ALSA Raw-MIDI (Advanced Linux Sound Architecture)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>PulseAudio (bad latency!)</source>
|
||||
<translation>PulseAudio (Schlechte Latenz!)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Dummy (no sound output)</source>
|
||||
<translation>Dummy (Keine Soundausgabe)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Dummy (no MIDI support)</source>
|
||||
<translation>Dummy (Keine MIDI-Unterstützung)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>WinMM MIDI</source>
|
||||
<translation>WinMM MIDI</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>OSS Raw-MIDI (Open Sound System)</source>
|
||||
<translation>OSS Raw-MIDI (Open Sound System)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>ALSA (Advanced Linux Sound Architecture)</source>
|
||||
<translation>ALSA (Advanced Linux Sound Architecture)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>PortAudio</source>
|
||||
<translation>PortAudio</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>sf2Instrument</name>
|
||||
<message>
|
||||
@@ -7902,6 +8024,13 @@ Latenz: %2 ms</translation>
|
||||
<translation>Rechts-nach-rechts</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>tabWidget</name>
|
||||
<message>
|
||||
<source>Settings for %1</source>
|
||||
<translation>Einstellungen für %1</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>timeLine</name>
|
||||
<message>
|
||||
|
||||
@@ -16,10 +16,11 @@ DMG_BACKGROUND_IMG="dmg_branding.png"
|
||||
cp "@CMAKE_SOURCE_DIR@/data/${DMG_BACKGROUND_IMG}" .
|
||||
|
||||
# you should not need to change these
|
||||
OS_VER=`sw_vers -productVersion|cut -d"." -f1-2`
|
||||
APP_LOWERCASE=$(echo $APP_NAME|tr '[:upper:]' '[:lower:]')
|
||||
APP_EXE="${APP_NAME}.app/Contents/MacOS/${APP_LOWERCASE}"
|
||||
|
||||
VOL_NAME="${APP_NAME} ${VERSION}" # volume name will be "SuperCoolApp 1.0.0"
|
||||
VOL_NAME="${APP_LOWERCASE}-${VERSION}-mac${OS_VER}" # volume name will be "SuperCoolApp 1.0.0"
|
||||
DMG_TMP="${VOL_NAME}-temp.dmg"
|
||||
DMG_FINAL="${VOL_NAME}.dmg" # final DMG name will be "SuperCoolApp 1.0.0.dmg"
|
||||
STAGING_DIR="./Install" # we copy all our stuff into this dir
|
||||
|
||||
@@ -38,7 +38,7 @@ public:
|
||||
}
|
||||
virtual ~RmsHelper()
|
||||
{
|
||||
if( m_buffer ) delete m_buffer;
|
||||
if( m_buffer ) delete[] m_buffer;
|
||||
}
|
||||
|
||||
inline void setSize( int size )
|
||||
|
||||
@@ -77,30 +77,30 @@ bool AmplifierEffect::processAudioBuffer( sampleFrame* buf, const fpp_t frames )
|
||||
for( fpp_t f = 0; f < frames; ++f )
|
||||
{
|
||||
// qDebug( "offset %d, value %f", f, m_ampControls.m_volumeModel.value( f ) );
|
||||
|
||||
outSum += buf[f][0]*buf[f][0] + buf[f][1]*buf[f][1];
|
||||
|
||||
sample_t s[2] = { buf[f][0], buf[f][1] };
|
||||
|
||||
// convert vol/pan values to left/right values
|
||||
const float left1 = m_ampControls.m_volumeModel.value( f ) *
|
||||
( m_ampControls.m_panModel.value( f ) <= 0
|
||||
const float left1 = m_ampControls.m_volumeModel.value() *
|
||||
( m_ampControls.m_panModel.value() <= 0
|
||||
? 1.0
|
||||
: 1.0 - m_ampControls.m_panModel.value( f ) / 100.0 );
|
||||
const float right1 = m_ampControls.m_volumeModel.value( f ) *
|
||||
( m_ampControls.m_panModel.value( f ) >= 0
|
||||
const float right1 = m_ampControls.m_volumeModel.value() *
|
||||
( m_ampControls.m_panModel.value() >= 0
|
||||
? 1.0
|
||||
: 1.0 + m_ampControls.m_panModel.value( f ) / 100.0 );
|
||||
: 1.0 + m_ampControls.m_panModel.value() / 100.0 );
|
||||
|
||||
// first stage amplification
|
||||
s[0] *= ( left1 / 100.0 );
|
||||
s[1] *= ( right1 / 100.0 );
|
||||
|
||||
// second stage amplification
|
||||
s[0] *= ( m_ampControls.m_leftModel.value( f ) / 100.0 );
|
||||
s[1] *= ( m_ampControls.m_rightModel.value( f ) / 100.0 );
|
||||
s[0] *= ( m_ampControls.m_leftModel.value() / 100.0 );
|
||||
s[1] *= ( m_ampControls.m_rightModel.value() / 100.0 );
|
||||
|
||||
buf[f][0] = d * buf[f][0] + w * s[0];
|
||||
buf[f][1] = d * buf[f][1] + w * s[1];
|
||||
outSum += buf[f][0]*buf[f][0] + buf[f][1]*buf[f][1];
|
||||
}
|
||||
|
||||
checkGate( outSum / frames );
|
||||
|
||||
@@ -88,13 +88,13 @@ bool BassBoosterEffect::processAudioBuffer( sampleFrame* buf, const fpp_t frames
|
||||
const float w = wetLevel();
|
||||
for( fpp_t f = 0; f < frames; ++f )
|
||||
{
|
||||
outSum += buf[f][0]*buf[f][0] + buf[f][1]*buf[f][1];
|
||||
|
||||
sample_t s[2] = { buf[f][0], buf[f][1] };
|
||||
m_bbFX.nextSample( s[0], s[1] );
|
||||
|
||||
buf[f][0] = d * buf[f][0] + w * s[0];
|
||||
buf[f][1] = d * buf[f][1] + w * s[1];
|
||||
|
||||
outSum += buf[f][0]*buf[f][0] + buf[f][1]*buf[f][1];
|
||||
}
|
||||
|
||||
checkGate( outSum / frames );
|
||||
|
||||
@@ -155,11 +155,11 @@ bool DualFilterEffect::processAudioBuffer( sampleFrame* buf, const fpp_t frames
|
||||
s[0] += ( s2[0] * mix2 );
|
||||
s[1] += ( s2[1] * mix2 );
|
||||
}
|
||||
outSum += buf[f][0]*buf[f][0] + buf[f][1]*buf[f][1];
|
||||
|
||||
// do another mix with dry signal
|
||||
buf[f][0] = d * buf[f][0] + w * s[0];
|
||||
buf[f][1] = d * buf[f][1] + w * s[1];
|
||||
outSum += buf[f][0]*buf[f][0] + buf[f][1]*buf[f][1];
|
||||
}
|
||||
|
||||
checkGate( outSum / frames );
|
||||
|
||||
@@ -567,6 +567,22 @@ lookahead_limiter::lookahead_limiter() {
|
||||
asc_coeff = 1.f;
|
||||
}
|
||||
|
||||
lookahead_limiter::~lookahead_limiter()
|
||||
{
|
||||
if( buffer != NULL)
|
||||
{
|
||||
free(buffer);
|
||||
}
|
||||
if( nextpos != NULL)
|
||||
{
|
||||
free(nextpos);
|
||||
}
|
||||
if( nextdelta != NULL)
|
||||
{
|
||||
free(nextdelta);
|
||||
}
|
||||
}
|
||||
|
||||
void lookahead_limiter::activate()
|
||||
{
|
||||
is_active = true;
|
||||
|
||||
@@ -608,6 +608,7 @@ public:
|
||||
void reset_asc();
|
||||
bool get_asc();
|
||||
lookahead_limiter();
|
||||
~lookahead_limiter();
|
||||
void set_multi(bool set);
|
||||
void process(float &left, float &right, float *multi_buffer);
|
||||
void set_sample_rate(uint32_t sr);
|
||||
|
||||
@@ -47,6 +47,7 @@ struct ladspa_instance: public plugin_ctl_iface
|
||||
#endif
|
||||
|
||||
ladspa_instance(audio_module_iface *_module, ladspa_plugin_metadata_set *_ladspa, int sample_rate);
|
||||
virtual ~ladspa_instance();
|
||||
virtual const line_graph_iface *get_line_graph_iface() const { return module->get_line_graph_iface(); }
|
||||
virtual float get_param_value(int param_no);
|
||||
virtual void set_param_value(int param_no, float value);
|
||||
|
||||
@@ -263,6 +263,7 @@ class mono_audio_module:
|
||||
}
|
||||
public:
|
||||
mono_audio_module();
|
||||
~mono_audio_module();
|
||||
void params_changed();
|
||||
void activate();
|
||||
void set_sample_rate(uint32_t sr);
|
||||
@@ -291,6 +292,7 @@ class stereo_audio_module:
|
||||
}
|
||||
public:
|
||||
stereo_audio_module();
|
||||
~stereo_audio_module();
|
||||
void params_changed();
|
||||
void activate();
|
||||
void set_sample_rate(uint32_t sr);
|
||||
|
||||
@@ -84,6 +84,7 @@ public:
|
||||
uint32_t srate;
|
||||
bool is_active;
|
||||
multibandlimiter_audio_module();
|
||||
~multibandlimiter_audio_module();
|
||||
void activate();
|
||||
void deactivate();
|
||||
void params_changed();
|
||||
|
||||
@@ -460,6 +460,14 @@ stereo_audio_module::stereo_audio_module() {
|
||||
meter_outR = 0.f;
|
||||
}
|
||||
|
||||
stereo_audio_module::~stereo_audio_module()
|
||||
{
|
||||
if( buffer != NULL )
|
||||
{
|
||||
free(buffer);
|
||||
}
|
||||
}
|
||||
|
||||
void stereo_audio_module::activate() {
|
||||
active = true;
|
||||
}
|
||||
@@ -686,6 +694,14 @@ mono_audio_module::mono_audio_module() {
|
||||
meter_outR = 0.f;
|
||||
}
|
||||
|
||||
mono_audio_module::~mono_audio_module()
|
||||
{
|
||||
if( buffer != NULL )
|
||||
{
|
||||
free(buffer);
|
||||
}
|
||||
}
|
||||
|
||||
void mono_audio_module::activate() {
|
||||
active = true;
|
||||
}
|
||||
|
||||
@@ -252,6 +252,14 @@ multibandlimiter_audio_module::multibandlimiter_audio_module()
|
||||
asc_old = true;
|
||||
}
|
||||
|
||||
multibandlimiter_audio_module::~multibandlimiter_audio_module()
|
||||
{
|
||||
if( buffer != NULL)
|
||||
{
|
||||
free(buffer);
|
||||
}
|
||||
}
|
||||
|
||||
void multibandlimiter_audio_module::activate()
|
||||
{
|
||||
is_active = true;
|
||||
|
||||
@@ -54,6 +54,11 @@ ladspa_instance::ladspa_instance(audio_module_iface *_module, ladspa_plugin_meta
|
||||
module->post_instantiate();
|
||||
}
|
||||
|
||||
ladspa_instance::~ladspa_instance()
|
||||
{
|
||||
delete module;
|
||||
}
|
||||
|
||||
float ladspa_instance::get_param_value(int param_no)
|
||||
{
|
||||
// XXXKF hack
|
||||
|
||||
@@ -116,6 +116,8 @@ static void activateDj_eq_mono(LADSPA_Handle instance) {
|
||||
}
|
||||
|
||||
static void cleanupDj_eq_mono(LADSPA_Handle instance) {
|
||||
Dj_eq_mono *plugin_data = (Dj_eq_mono *)instance;
|
||||
free(plugin_data->filters);
|
||||
free(instance);
|
||||
}
|
||||
|
||||
@@ -283,6 +285,8 @@ static void activateDj_eq(LADSPA_Handle instance) {
|
||||
}
|
||||
|
||||
static void cleanupDj_eq(LADSPA_Handle instance) {
|
||||
Dj_eq *plugin_data = (Dj_eq *)instance;
|
||||
free(plugin_data->filters);
|
||||
free(instance);
|
||||
}
|
||||
|
||||
|
||||
@@ -137,6 +137,7 @@ static void cleanupFastLookaheadLimiter(LADSPA_Handle instance) {
|
||||
#line 188 "fast_lookahead_limiter_1913.xml"
|
||||
FastLookaheadLimiter *plugin_data = (FastLookaheadLimiter *)instance;
|
||||
free(plugin_data->buffer);
|
||||
free(plugin_data->chunks);
|
||||
free(instance);
|
||||
}
|
||||
|
||||
|
||||
@@ -74,7 +74,11 @@ static fftw_real *real_in, *real_out, *comp_in, *comp_out;
|
||||
|
||||
unsigned int fft_length[IMPULSES];
|
||||
|
||||
#ifdef __clang__
|
||||
void impulse2freq(int id, float *imp, unsigned int length, fftw_real *out)
|
||||
#else
|
||||
inline void impulse2freq(int id, float *imp, unsigned int length, fftw_real *out)
|
||||
#endif
|
||||
{
|
||||
fftw_real impulse_time[MAX_FFT_LENGTH];
|
||||
#ifdef FFTW3
|
||||
@@ -198,6 +202,11 @@ static void cleanupImp(LADSPA_Handle instance) {
|
||||
local_free(plugin_data->op);
|
||||
local_free(plugin_data->overlap);
|
||||
local_free(plugin_data->opc);
|
||||
unsigned int i;
|
||||
for (i=0; i<IMPULSES; i++) {
|
||||
local_free(plugin_data->impulse_freq[i]);
|
||||
}
|
||||
local_free(plugin_data->impulse_freq);
|
||||
free(instance);
|
||||
}
|
||||
|
||||
|
||||
@@ -163,6 +163,7 @@ static void cleanupVynil(LADSPA_Handle instance) {
|
||||
free(plugin_data->buffer_m);
|
||||
free(plugin_data->buffer_s);
|
||||
free(plugin_data->click_buffer);
|
||||
free(plugin_data->highp);
|
||||
free(plugin_data->lowp_m);
|
||||
free(plugin_data->lowp_s);
|
||||
free(plugin_data->noise_filt);
|
||||
|
||||
@@ -145,7 +145,8 @@ activate_eq(LADSPA_Handle instance) {
|
||||
static
|
||||
void
|
||||
cleanup_eq(LADSPA_Handle instance) {
|
||||
|
||||
eq *plugin_data = (eq *)instance;
|
||||
free(plugin_data->filters);
|
||||
free(instance);
|
||||
}
|
||||
|
||||
|
||||
@@ -167,7 +167,8 @@ activate_eq(LADSPA_Handle instance) {
|
||||
static
|
||||
void
|
||||
cleanup_eq(LADSPA_Handle instance) {
|
||||
|
||||
eq *plugin_data = (eq *)instance;
|
||||
free(plugin_data->filters);
|
||||
free(instance);
|
||||
}
|
||||
|
||||
|
||||
@@ -575,13 +575,8 @@ AudioFileProcessorView::AudioFileProcessorView( Instrument * _instrument,
|
||||
m_interpBox->setFont( pointSize<8>( m_interpBox->font() ) );
|
||||
|
||||
// wavegraph
|
||||
m_waveView = new AudioFileProcessorWaveView( this, 245, 75, castModel<audioFileProcessor>()->m_sampleBuffer );
|
||||
m_waveView->move( 2, 172 );
|
||||
m_waveView->setKnobs(
|
||||
dynamic_cast<AudioFileProcessorWaveView::knob *>( m_startKnob ),
|
||||
dynamic_cast<AudioFileProcessorWaveView::knob *>( m_endKnob ),
|
||||
dynamic_cast<AudioFileProcessorWaveView::knob *>( m_loopKnob )
|
||||
);
|
||||
m_waveView = 0;
|
||||
newWaveView();
|
||||
|
||||
connect( castModel<audioFileProcessor>(), SIGNAL( isPlaying( f_cnt_t ) ),
|
||||
m_waveView, SLOT( isPlaying( f_cnt_t ) ) );
|
||||
@@ -630,6 +625,25 @@ void AudioFileProcessorView::dragEnterEvent( QDragEnterEvent * _dee )
|
||||
|
||||
|
||||
|
||||
void AudioFileProcessorView::newWaveView()
|
||||
{
|
||||
if ( m_waveView )
|
||||
{
|
||||
delete m_waveView;
|
||||
m_waveView = 0;
|
||||
}
|
||||
m_waveView = new AudioFileProcessorWaveView( this, 245, 75, castModel<audioFileProcessor>()->m_sampleBuffer );
|
||||
m_waveView->move( 2, 172 );
|
||||
m_waveView->setKnobs(
|
||||
dynamic_cast<AudioFileProcessorWaveView::knob *>( m_startKnob ),
|
||||
dynamic_cast<AudioFileProcessorWaveView::knob *>( m_endKnob ),
|
||||
dynamic_cast<AudioFileProcessorWaveView::knob *>( m_loopKnob ) );
|
||||
m_waveView->show();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void AudioFileProcessorView::dropEvent( QDropEvent * _de )
|
||||
{
|
||||
QString type = stringPairDrag::decodeKey( _de );
|
||||
@@ -638,6 +652,7 @@ void AudioFileProcessorView::dropEvent( QDropEvent * _de )
|
||||
{
|
||||
castModel<audioFileProcessor>()->setAudioFile( value );
|
||||
_de->accept();
|
||||
newWaveView();
|
||||
return;
|
||||
}
|
||||
else if( type == QString( "tco_%1" ).arg( track::SampleTrack ) )
|
||||
@@ -691,6 +706,7 @@ void AudioFileProcessorView::paintEvent( QPaintEvent * )
|
||||
|
||||
void AudioFileProcessorView::sampleUpdated( void )
|
||||
{
|
||||
newWaveView();
|
||||
m_waveView->update();
|
||||
update();
|
||||
}
|
||||
@@ -707,6 +723,7 @@ void AudioFileProcessorView::openAudioFile( void )
|
||||
{
|
||||
castModel<audioFileProcessor>()->setAudioFile( af );
|
||||
engine::getSong()->setModified();
|
||||
newWaveView();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -740,6 +757,7 @@ AudioFileProcessorWaveView::AudioFileProcessorWaveView( QWidget * _parent, int _
|
||||
m_to( m_sampleBuffer.frames() ),
|
||||
m_last_from( 0 ),
|
||||
m_last_to( 0 ),
|
||||
m_last_amp( 0 ),
|
||||
m_startKnob( 0 ),
|
||||
m_endKnob( 0 ),
|
||||
m_loopKnob( 0 ),
|
||||
|
||||
@@ -118,7 +118,7 @@ public:
|
||||
AudioFileProcessorView( Instrument * _instrument, QWidget * _parent );
|
||||
virtual ~AudioFileProcessorView();
|
||||
|
||||
|
||||
void newWaveView();
|
||||
protected slots:
|
||||
void sampleUpdated();
|
||||
void openAudioFile();
|
||||
|
||||
@@ -251,16 +251,16 @@ intptr_t CarlaInstrument::handleDispatcher(const NativeHostDispatcherOpcode opco
|
||||
|
||||
switch (opcode)
|
||||
{
|
||||
case HOST_OPCODE_NULL:
|
||||
case NATIVE_HOST_OPCODE_NULL:
|
||||
break;
|
||||
case HOST_OPCODE_UPDATE_PARAMETER:
|
||||
case HOST_OPCODE_UPDATE_MIDI_PROGRAM:
|
||||
case HOST_OPCODE_RELOAD_PARAMETERS:
|
||||
case HOST_OPCODE_RELOAD_MIDI_PROGRAMS:
|
||||
case HOST_OPCODE_RELOAD_ALL:
|
||||
case NATIVE_HOST_OPCODE_UPDATE_PARAMETER:
|
||||
case NATIVE_HOST_OPCODE_UPDATE_MIDI_PROGRAM:
|
||||
case NATIVE_HOST_OPCODE_RELOAD_PARAMETERS:
|
||||
case NATIVE_HOST_OPCODE_RELOAD_MIDI_PROGRAMS:
|
||||
case NATIVE_HOST_OPCODE_RELOAD_ALL:
|
||||
// nothing
|
||||
break;
|
||||
case HOST_OPCODE_UI_UNAVAILABLE:
|
||||
case NATIVE_HOST_OPCODE_UI_UNAVAILABLE:
|
||||
handleUiClosed();
|
||||
break;
|
||||
}
|
||||
@@ -459,7 +459,7 @@ PluginView* CarlaInstrument::instantiateView(QWidget* parent)
|
||||
|
||||
void CarlaInstrument::sampleRateChanged()
|
||||
{
|
||||
fDescriptor->dispatcher(fHandle, PLUGIN_OPCODE_SAMPLE_RATE_CHANGED, 0, 0, nullptr, handleGetSampleRate());
|
||||
fDescriptor->dispatcher(fHandle, NATIVE_PLUGIN_OPCODE_SAMPLE_RATE_CHANGED, 0, 0, nullptr, handleGetSampleRate());
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
|
||||
@@ -30,14 +30,14 @@
|
||||
#include "song.h"
|
||||
|
||||
DelayControls::DelayControls( DelayEffect* effect ):
|
||||
EffectControls( effect ),
|
||||
m_effect ( effect ),
|
||||
m_delayTimeModel( 0.5, 0.01, 20.0, 0.0001, 20000.0, this, tr( "Delay Samples" )) ,
|
||||
m_feedbackModel(0.0f,0.0f,1.0f,0.01f,this,tr( "Feedback" ) ),
|
||||
m_lfoTimeModel(2.0, 0.01, 20.0, 0.0001, 20000.0, this, tr( "Lfo Frequency" ) ),
|
||||
m_lfoAmountModel(0.0, 0.0, 2.0, 0.0001, 2000.0, this, tr ( "Lfo Amount" ) )
|
||||
EffectControls( effect ),
|
||||
m_effect ( effect ),
|
||||
m_delayTimeModel( 0.5, 0.01, 20.0, 0.0001, 20000.0, this, tr( "Delay Samples" )) ,
|
||||
m_feedbackModel(0.0f,0.0f,1.0f,0.01f,this,tr( "Feedback" ) ),
|
||||
m_lfoTimeModel(2.0, 0.01, 20.0, 0.0001, 20000.0, this, tr( "Lfo Frequency" ) ),
|
||||
m_lfoAmountModel(0.0, 0.0, 2.0, 0.0001, 2000.0, this, tr ( "Lfo Amount" ) )
|
||||
{
|
||||
connect( engine::mixer(), SIGNAL( sampleRateChanged() ), this, SLOT( changeSampleRate() ) );
|
||||
connect( engine::mixer(), SIGNAL( sampleRateChanged() ), this, SLOT( changeSampleRate() ) );
|
||||
}
|
||||
|
||||
|
||||
@@ -45,10 +45,10 @@ DelayControls::DelayControls( DelayEffect* effect ):
|
||||
|
||||
void DelayControls::loadSettings( const QDomElement &_this )
|
||||
{
|
||||
m_delayTimeModel.loadSettings(_this, "DelayTimeSamples" );
|
||||
m_feedbackModel.loadSettings( _this, "FeebackAmount" );
|
||||
m_lfoTimeModel.loadSettings( _this , "LfoFrequency");
|
||||
m_lfoAmountModel.loadSettings( _this, "LfoAmount");
|
||||
m_delayTimeModel.loadSettings(_this, "DelayTimeSamples" );
|
||||
m_feedbackModel.loadSettings( _this, "FeebackAmount" );
|
||||
m_lfoTimeModel.loadSettings( _this , "LfoFrequency");
|
||||
m_lfoAmountModel.loadSettings( _this, "LfoAmount");
|
||||
}
|
||||
|
||||
|
||||
@@ -56,17 +56,15 @@ void DelayControls::loadSettings( const QDomElement &_this )
|
||||
|
||||
void DelayControls::saveSettings( QDomDocument& doc, QDomElement& _this )
|
||||
{
|
||||
m_delayTimeModel.saveSettings( doc, _this, "DelayTimeSamples" );
|
||||
m_feedbackModel.saveSettings( doc, _this ,"FeebackAmount" );
|
||||
m_lfoTimeModel.saveSettings( doc, _this, "LfoFrequency" );
|
||||
m_lfoAmountModel.saveSettings( doc, _this ,"LfoAmount" );
|
||||
m_delayTimeModel.saveSettings( doc, _this, "DelayTimeSamples" );
|
||||
m_feedbackModel.saveSettings( doc, _this ,"FeebackAmount" );
|
||||
m_lfoTimeModel.saveSettings( doc, _this, "LfoFrequency" );
|
||||
m_lfoAmountModel.saveSettings( doc, _this ,"LfoAmount" );
|
||||
}
|
||||
|
||||
|
||||
|
||||
void DelayControls::changeSampleRate()
|
||||
{
|
||||
m_effect->changeSampleRate();
|
||||
m_effect->changeSampleRate();
|
||||
}
|
||||
|
||||
#include "moc_delaycontrols.cxx"
|
||||
|
||||
@@ -35,38 +35,38 @@ class DelayEffect;
|
||||
|
||||
class DelayControls : public EffectControls
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_OBJECT
|
||||
public:
|
||||
DelayControls( DelayEffect* effect );
|
||||
virtual ~DelayControls()
|
||||
{
|
||||
}
|
||||
virtual void saveSettings( QDomDocument& doc, QDomElement& parent );
|
||||
virtual void loadSettings( const QDomElement& _this );
|
||||
inline virtual QString nodeName() const
|
||||
{
|
||||
return "Delay";
|
||||
}
|
||||
virtual int controlCount(){
|
||||
return 4;
|
||||
}
|
||||
virtual EffectControlDialog* createView()
|
||||
{
|
||||
return new DelayControlsDialog( this );
|
||||
}
|
||||
DelayControls( DelayEffect* effect );
|
||||
virtual ~DelayControls()
|
||||
{
|
||||
}
|
||||
virtual void saveSettings( QDomDocument& doc, QDomElement& parent );
|
||||
virtual void loadSettings( const QDomElement& _this );
|
||||
inline virtual QString nodeName() const
|
||||
{
|
||||
return "Delay";
|
||||
}
|
||||
virtual int controlCount(){
|
||||
return 4;
|
||||
}
|
||||
virtual EffectControlDialog* createView()
|
||||
{
|
||||
return new DelayControlsDialog( this );
|
||||
}
|
||||
|
||||
private slots:
|
||||
void changeSampleRate();
|
||||
void changeSampleRate();
|
||||
|
||||
private:
|
||||
DelayEffect* m_effect;
|
||||
TempoSyncKnobModel m_delayTimeModel;
|
||||
FloatModel m_feedbackModel;
|
||||
TempoSyncKnobModel m_lfoTimeModel;
|
||||
TempoSyncKnobModel m_lfoAmountModel;
|
||||
DelayEffect* m_effect;
|
||||
TempoSyncKnobModel m_delayTimeModel;
|
||||
FloatModel m_feedbackModel;
|
||||
TempoSyncKnobModel m_lfoTimeModel;
|
||||
TempoSyncKnobModel m_lfoAmountModel;
|
||||
|
||||
friend class DelayControlsDialog;
|
||||
friend class DelayEffect;
|
||||
friend class DelayControlsDialog;
|
||||
friend class DelayEffect;
|
||||
};
|
||||
|
||||
#endif // DELAYCONTROLS_H
|
||||
|
||||
@@ -31,41 +31,44 @@
|
||||
|
||||
|
||||
DelayControlsDialog::DelayControlsDialog( DelayControls *controls ) :
|
||||
EffectControlDialog( controls )
|
||||
EffectControlDialog( controls )
|
||||
{
|
||||
setAutoFillBackground( true );
|
||||
QPalette pal;
|
||||
pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) );
|
||||
setPalette( pal );
|
||||
setFixedSize( 200, 75 );
|
||||
setAutoFillBackground( true );
|
||||
QPalette pal;
|
||||
pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) );
|
||||
setPalette( pal );
|
||||
setFixedSize( 200, 75 );
|
||||
|
||||
TempoSyncKnob* sampleDelayKnob = new TempoSyncKnob( knobBright_26, this );
|
||||
sampleDelayKnob->move( 20,10 );
|
||||
sampleDelayKnob->setVolumeKnob( false );
|
||||
sampleDelayKnob->setModel( &controls->m_delayTimeModel );
|
||||
sampleDelayKnob->setLabel( tr( "Delay" ) );
|
||||
sampleDelayKnob->setHintText( tr( "Delay Time" ) + " ", " s" );
|
||||
TempoSyncKnob* sampleDelayKnob = new TempoSyncKnob( knobBright_26, this );
|
||||
sampleDelayKnob->move( 20,10 );
|
||||
sampleDelayKnob->setVolumeKnob( false );
|
||||
sampleDelayKnob->setModel( &controls->m_delayTimeModel );
|
||||
sampleDelayKnob->setLabel( tr( "Delay" ) );
|
||||
sampleDelayKnob->setHintText( tr( "Delay Time" ) + " ", " s" );
|
||||
|
||||
knob * feedbackKnob = new knob( knobBright_26, this );
|
||||
feedbackKnob->move( 63,10 );
|
||||
feedbackKnob->setVolumeKnob( true) ;
|
||||
feedbackKnob->setModel( &controls->m_feedbackModel);
|
||||
feedbackKnob->setLabel( tr( "Regen" ) );
|
||||
feedbackKnob->setHintText( tr ( "Feedback Amount" ) + " " , "" );
|
||||
knob * feedbackKnob = new knob( knobBright_26, this );
|
||||
feedbackKnob->move( 63,10 );
|
||||
feedbackKnob->setVolumeKnob( true) ;
|
||||
feedbackKnob->setModel( &controls->m_feedbackModel);
|
||||
feedbackKnob->setLabel( tr( "Regen" ) );
|
||||
feedbackKnob->setHintText( tr ( "Feedback Amount" ) + " " , "" );
|
||||
|
||||
TempoSyncKnob * lfoFreqKnob = new TempoSyncKnob( knobBright_26, this );
|
||||
lfoFreqKnob->move( 106,10 );
|
||||
lfoFreqKnob->setVolumeKnob( false );
|
||||
lfoFreqKnob->setModel( &controls->m_lfoTimeModel );
|
||||
lfoFreqKnob->setLabel( tr( "Rate" ) );
|
||||
lfoFreqKnob->setHintText( tr ( "Lfo") + " ", " s" );
|
||||
TempoSyncKnob * lfoFreqKnob = new TempoSyncKnob( knobBright_26, this );
|
||||
lfoFreqKnob->move( 106,10 );
|
||||
lfoFreqKnob->setVolumeKnob( false );
|
||||
lfoFreqKnob->setModel( &controls->m_lfoTimeModel );
|
||||
lfoFreqKnob->setLabel( tr( "Rate" ) );
|
||||
lfoFreqKnob->setHintText( tr ( "Lfo") + " ", " s" );
|
||||
|
||||
TempoSyncKnob * lfoAmtKnob = new TempoSyncKnob( knobBright_26, this );
|
||||
lfoAmtKnob->move( 150,10 );
|
||||
lfoAmtKnob->setVolumeKnob( false );
|
||||
lfoAmtKnob->setModel( &controls->m_lfoAmountModel );
|
||||
lfoAmtKnob->setLabel( tr( "Lfo" ) );
|
||||
lfoAmtKnob->setHintText( tr ( "Lfo Amt" ) + " " , " s" );
|
||||
TempoSyncKnob * lfoAmtKnob = new TempoSyncKnob( knobBright_26, this );
|
||||
lfoAmtKnob->move( 150,10 );
|
||||
lfoAmtKnob->setVolumeKnob( false );
|
||||
lfoAmtKnob->setModel( &controls->m_lfoAmountModel );
|
||||
lfoAmtKnob->setLabel( tr( "Lfo" ) );
|
||||
lfoAmtKnob->setHintText( tr ( "Lfo Amt" ) + " " , " s" );
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
#include "moc_delaycontrols.cxx"
|
||||
|
||||
@@ -32,10 +32,10 @@ class DelayControls;
|
||||
class DelayControlsDialog : public EffectControlDialog
|
||||
{
|
||||
public:
|
||||
DelayControlsDialog( DelayControls* controls );
|
||||
virtual ~DelayControlsDialog()
|
||||
{
|
||||
}
|
||||
DelayControlsDialog( DelayControls* controls );
|
||||
virtual ~DelayControlsDialog()
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
#endif // DELAYCONTROLSDIALOG_H
|
||||
|
||||
@@ -32,27 +32,27 @@ extern "C"
|
||||
|
||||
Plugin::Descriptor PLUGIN_EXPORT delay_plugin_descriptor =
|
||||
{
|
||||
STRINGIFY( PLUGIN_NAME ),
|
||||
"Delay",
|
||||
QT_TRANSLATE_NOOP( "pluginBrowser", "A native delay plugin" ),
|
||||
"Dave French <contact/dot/dave/dot/french3/at/googlemail/dot/com>",
|
||||
0x0100,
|
||||
Plugin::Effect,
|
||||
new PluginPixmapLoader( "logo" ),
|
||||
NULL,
|
||||
NULL
|
||||
STRINGIFY( PLUGIN_NAME ),
|
||||
"Delay",
|
||||
QT_TRANSLATE_NOOP( "pluginBrowser", "A native delay plugin" ),
|
||||
"Dave French <contact/dot/dave/dot/french3/at/googlemail/dot/com>",
|
||||
0x0100,
|
||||
Plugin::Effect,
|
||||
new PluginPixmapLoader( "logo" ),
|
||||
NULL,
|
||||
NULL
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
|
||||
DelayEffect::DelayEffect( Model* parent, const Plugin::Descriptor::SubPluginFeatures::Key* key ) :
|
||||
Effect( &delay_plugin_descriptor, parent, key ),
|
||||
m_delayControls( this )
|
||||
Effect( &delay_plugin_descriptor, parent, key ),
|
||||
m_delayControls( this )
|
||||
{
|
||||
m_delay = 0;
|
||||
m_delay = new StereoDelay( 20, engine::mixer()->processingSampleRate() );
|
||||
m_lfo = new Lfo( engine::mixer()->processingSampleRate() );
|
||||
m_delay = 0;
|
||||
m_delay = new StereoDelay( 20, engine::mixer()->processingSampleRate() );
|
||||
m_lfo = new Lfo( engine::mixer()->processingSampleRate() );
|
||||
}
|
||||
|
||||
|
||||
@@ -60,14 +60,14 @@ DelayEffect::DelayEffect( Model* parent, const Plugin::Descriptor::SubPluginFeat
|
||||
|
||||
DelayEffect::~DelayEffect()
|
||||
{
|
||||
if( m_delay )
|
||||
{
|
||||
delete m_delay;
|
||||
}
|
||||
if( m_lfo )
|
||||
{
|
||||
delete m_lfo;
|
||||
}
|
||||
if( m_delay )
|
||||
{
|
||||
delete m_delay;
|
||||
}
|
||||
if( m_lfo )
|
||||
{
|
||||
delete m_lfo;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -75,37 +75,37 @@ DelayEffect::~DelayEffect()
|
||||
|
||||
bool DelayEffect::processAudioBuffer( sampleFrame* buf, const fpp_t frames )
|
||||
{
|
||||
if( !isEnabled() || !isRunning () )
|
||||
{
|
||||
return( false );
|
||||
}
|
||||
double outSum = 0.0;
|
||||
const float d = dryLevel();
|
||||
const float w = wetLevel();
|
||||
const float length = m_delayControls.m_delayTimeModel.value() * engine::mixer()->processingSampleRate();
|
||||
const float amplitude = m_delayControls.m_lfoAmountModel.value() * engine::mixer()->processingSampleRate();
|
||||
m_lfo->setFrequency( 1.0 / m_delayControls.m_lfoTimeModel.value() );
|
||||
m_delay->setFeedback( m_delayControls.m_feedbackModel.value() );
|
||||
sample_t dryS[2];
|
||||
for( fpp_t f = 0; f < frames; ++f )
|
||||
{
|
||||
dryS[0] = buf[f][0];
|
||||
dryS[1] = buf[f][1];
|
||||
m_delay->setLength( ( float )length + ( amplitude * ( float )m_lfo->tick() ) );
|
||||
m_delay->tick( buf[f] );
|
||||
if( !isEnabled() || !isRunning () )
|
||||
{
|
||||
return( false );
|
||||
}
|
||||
double outSum = 0.0;
|
||||
const float d = dryLevel();
|
||||
const float w = wetLevel();
|
||||
const float length = m_delayControls.m_delayTimeModel.value() * engine::mixer()->processingSampleRate();
|
||||
const float amplitude = m_delayControls.m_lfoAmountModel.value() * engine::mixer()->processingSampleRate();
|
||||
m_lfo->setFrequency( 1.0 / m_delayControls.m_lfoTimeModel.value() );
|
||||
m_delay->setFeedback( m_delayControls.m_feedbackModel.value() );
|
||||
sample_t dryS[2];
|
||||
for( fpp_t f = 0; f < frames; ++f )
|
||||
{
|
||||
dryS[0] = buf[f][0];
|
||||
dryS[1] = buf[f][1];
|
||||
m_delay->setLength( ( float )length + ( amplitude * ( float )m_lfo->tick() ) );
|
||||
m_delay->tick( buf[f] );
|
||||
|
||||
buf[f][0] = ( d * dryS[0] ) + ( w * buf[f][0] );
|
||||
buf[f][1] = ( d * dryS[1] ) + ( w * buf[f][1] );
|
||||
outSum += buf[f][0]*buf[f][0] + buf[f][1]*buf[f][1];
|
||||
}
|
||||
checkGate( outSum / frames );
|
||||
return isRunning();
|
||||
buf[f][0] = ( d * dryS[0] ) + ( w * buf[f][0] );
|
||||
buf[f][1] = ( d * dryS[1] ) + ( w * buf[f][1] );
|
||||
outSum += buf[f][0]*buf[f][0] + buf[f][1]*buf[f][1];
|
||||
}
|
||||
checkGate( outSum / frames );
|
||||
return isRunning();
|
||||
}
|
||||
|
||||
void DelayEffect::changeSampleRate()
|
||||
{
|
||||
m_lfo->setSampleRate( engine::mixer()->processingSampleRate() );
|
||||
m_delay->setSampleRate( engine::mixer()->processingSampleRate() );
|
||||
m_lfo->setSampleRate( engine::mixer()->processingSampleRate() );
|
||||
m_delay->setSampleRate( engine::mixer()->processingSampleRate() );
|
||||
}
|
||||
|
||||
|
||||
@@ -117,7 +117,7 @@ extern "C"
|
||||
//needed for getting plugin out of shared lib
|
||||
Plugin * PLUGIN_EXPORT lmms_plugin_main( Model* parent, void* data )
|
||||
{
|
||||
return new DelayEffect( parent , static_cast<const Plugin::Descriptor::SubPluginFeatures::Key *>( data ) );
|
||||
return new DelayEffect( parent , static_cast<const Plugin::Descriptor::SubPluginFeatures::Key *>( data ) );
|
||||
}
|
||||
|
||||
}}
|
||||
|
||||
@@ -33,19 +33,19 @@
|
||||
class DelayEffect : public Effect
|
||||
{
|
||||
public:
|
||||
DelayEffect(Model* parent , const Descriptor::SubPluginFeatures::Key* key );
|
||||
virtual ~DelayEffect();
|
||||
virtual bool processAudioBuffer( sampleFrame* buf, const fpp_t frames );
|
||||
virtual EffectControls* controls()
|
||||
{
|
||||
return &m_delayControls;
|
||||
}
|
||||
void changeSampleRate();
|
||||
DelayEffect(Model* parent , const Descriptor::SubPluginFeatures::Key* key );
|
||||
virtual ~DelayEffect();
|
||||
virtual bool processAudioBuffer( sampleFrame* buf, const fpp_t frames );
|
||||
virtual EffectControls* controls()
|
||||
{
|
||||
return &m_delayControls;
|
||||
}
|
||||
void changeSampleRate();
|
||||
|
||||
private:
|
||||
DelayControls m_delayControls;
|
||||
StereoDelay* m_delay;
|
||||
Lfo* m_lfo;
|
||||
DelayControls m_delayControls;
|
||||
StereoDelay* m_delay;
|
||||
Lfo* m_lfo;
|
||||
};
|
||||
|
||||
#endif // DELAYEFFECT_H
|
||||
|
||||
@@ -30,8 +30,8 @@
|
||||
|
||||
Lfo::Lfo( int samplerate )
|
||||
{
|
||||
m_samplerate = samplerate;
|
||||
m_twoPiOverSr = F_2PI / samplerate;
|
||||
m_samplerate = samplerate;
|
||||
m_twoPiOverSr = F_2PI / samplerate;
|
||||
}
|
||||
|
||||
|
||||
@@ -39,8 +39,8 @@ Lfo::Lfo( int samplerate )
|
||||
|
||||
float Lfo::tick()
|
||||
{
|
||||
float output = sinf( m_phase );
|
||||
m_phase += m_increment;
|
||||
float output = sinf( m_phase );
|
||||
m_phase += m_increment;
|
||||
|
||||
return output;
|
||||
return output;
|
||||
}
|
||||
|
||||
@@ -30,50 +30,50 @@
|
||||
class Lfo
|
||||
{
|
||||
public:
|
||||
Lfo( int samplerate );
|
||||
~Lfo()
|
||||
{
|
||||
}
|
||||
Lfo( int samplerate );
|
||||
~Lfo()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
inline void setFrequency( double frequency )
|
||||
{
|
||||
if( frequency < 0 || frequency > ( m_samplerate / 2.0 ) || frequency == m_frequency )
|
||||
{
|
||||
return;
|
||||
}
|
||||
m_frequency = frequency;
|
||||
m_increment = m_frequency * m_twoPiOverSr;
|
||||
inline void setFrequency( double frequency )
|
||||
{
|
||||
if( frequency < 0 || frequency > ( m_samplerate / 2.0 ) || frequency == m_frequency )
|
||||
{
|
||||
return;
|
||||
}
|
||||
m_frequency = frequency;
|
||||
m_increment = m_frequency * m_twoPiOverSr;
|
||||
|
||||
if( m_phase >= F_2PI )
|
||||
{
|
||||
m_phase -= F_2PI;
|
||||
}
|
||||
}
|
||||
if( m_phase >= F_2PI )
|
||||
{
|
||||
m_phase -= F_2PI;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
inline void setSampleRate ( int samplerate )
|
||||
{
|
||||
m_samplerate = samplerate;
|
||||
m_twoPiOverSr = F_2PI / samplerate;
|
||||
m_increment = m_frequency * m_twoPiOverSr;
|
||||
}
|
||||
inline void setSampleRate ( int samplerate )
|
||||
{
|
||||
m_samplerate = samplerate;
|
||||
m_twoPiOverSr = F_2PI / samplerate;
|
||||
m_increment = m_frequency * m_twoPiOverSr;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
float tick();
|
||||
float tick();
|
||||
|
||||
private:
|
||||
double m_frequency;
|
||||
double m_phase;
|
||||
double m_increment;
|
||||
double m_twoPiOverSr;
|
||||
int m_samplerate;
|
||||
double m_frequency;
|
||||
double m_phase;
|
||||
double m_increment;
|
||||
double m_twoPiOverSr;
|
||||
int m_samplerate;
|
||||
};
|
||||
|
||||
#endif // LFO_H
|
||||
|
||||
@@ -31,14 +31,14 @@
|
||||
|
||||
StereoDelay::StereoDelay( int maxTime, int sampleRate )
|
||||
{
|
||||
m_buffer = 0;
|
||||
m_maxTime = maxTime;
|
||||
m_maxLength = maxTime * sampleRate;
|
||||
m_length = m_maxLength;
|
||||
m_buffer = 0;
|
||||
m_maxTime = maxTime;
|
||||
m_maxLength = maxTime * sampleRate;
|
||||
m_length = m_maxLength;
|
||||
|
||||
m_index = 0;
|
||||
m_feedback = 0.0f;
|
||||
setSampleRate( sampleRate );
|
||||
m_index = 0;
|
||||
m_feedback = 0.0f;
|
||||
setSampleRate( sampleRate );
|
||||
}
|
||||
|
||||
|
||||
@@ -46,10 +46,10 @@ StereoDelay::StereoDelay( int maxTime, int sampleRate )
|
||||
|
||||
StereoDelay::~StereoDelay()
|
||||
{
|
||||
if( m_buffer )
|
||||
{
|
||||
delete m_buffer;
|
||||
}
|
||||
if( m_buffer )
|
||||
{
|
||||
delete m_buffer;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -57,24 +57,24 @@ StereoDelay::~StereoDelay()
|
||||
|
||||
void StereoDelay::tick( sampleFrame frame )
|
||||
{
|
||||
m_buffer[m_index][0] = frame[0];
|
||||
m_buffer[m_index][1] = frame[1];
|
||||
m_buffer[m_index][0] = frame[0];
|
||||
m_buffer[m_index][1] = frame[1];
|
||||
|
||||
int readIndex = m_index - ( int )m_length;
|
||||
if( readIndex < 0 )
|
||||
{
|
||||
readIndex += m_maxLength;
|
||||
}
|
||||
float fract = fraction( m_length );
|
||||
frame[0] = linearInterpolate( m_buffer[readIndex][0] ,
|
||||
m_buffer[( readIndex+1) % m_maxLength][0], fract );
|
||||
frame[1] = linearInterpolate( m_buffer[readIndex][1] ,
|
||||
m_buffer[( readIndex+1) % m_maxLength][1], fract );
|
||||
int readIndex = m_index - ( int )m_length - 1;
|
||||
if( readIndex < 0 )
|
||||
{
|
||||
readIndex += m_maxLength;
|
||||
}
|
||||
float fract = 1.0f - fraction( m_length );
|
||||
frame[0] = linearInterpolate( m_buffer[readIndex][0] ,
|
||||
m_buffer[( readIndex+1) % m_maxLength][0], fract );
|
||||
frame[1] = linearInterpolate( m_buffer[readIndex][1] ,
|
||||
m_buffer[( readIndex+1) % m_maxLength][1], fract );
|
||||
|
||||
m_buffer[m_index][0] += frame[0] * m_feedback;
|
||||
m_buffer[m_index][1] += frame[1] * m_feedback;
|
||||
m_buffer[m_index][0] += frame[0] * m_feedback;
|
||||
m_buffer[m_index][1] += frame[1] * m_feedback;
|
||||
|
||||
m_index = ( m_index + 1) % m_maxLength;
|
||||
m_index = ( m_index + 1) % m_maxLength;
|
||||
}
|
||||
|
||||
|
||||
@@ -82,13 +82,18 @@ void StereoDelay::tick( sampleFrame frame )
|
||||
|
||||
void StereoDelay::setSampleRate( int sampleRate )
|
||||
{
|
||||
if( m_buffer )
|
||||
{
|
||||
delete m_buffer;
|
||||
}
|
||||
if( m_buffer )
|
||||
{
|
||||
delete m_buffer;
|
||||
}
|
||||
|
||||
|
||||
m_buffer = new sampleFrame[( int )( sampleRate * m_maxTime )];
|
||||
int bufferSize = ( int )( sampleRate * m_maxTime );
|
||||
m_buffer = new sampleFrame[bufferSize];
|
||||
for( int i = 0 ; i < bufferSize ; i++)
|
||||
{
|
||||
m_buffer[i][0] = 0.0;
|
||||
m_buffer[i][1] = 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -30,31 +30,31 @@
|
||||
class StereoDelay
|
||||
{
|
||||
public:
|
||||
StereoDelay( int maxLength, int sampleRate );
|
||||
~StereoDelay();
|
||||
inline void setLength( float length )
|
||||
{
|
||||
if( length <= m_maxLength && length >= 0 )
|
||||
{
|
||||
m_length = length;
|
||||
}
|
||||
}
|
||||
StereoDelay( int maxLength, int sampleRate );
|
||||
~StereoDelay();
|
||||
inline void setLength( float length )
|
||||
{
|
||||
if( length <= m_maxLength && length >= 0 )
|
||||
{
|
||||
m_length = length;
|
||||
}
|
||||
}
|
||||
|
||||
inline void setFeedback( float feedback )
|
||||
{
|
||||
m_feedback = feedback;
|
||||
}
|
||||
inline void setFeedback( float feedback )
|
||||
{
|
||||
m_feedback = feedback;
|
||||
}
|
||||
|
||||
void tick( sampleFrame frame );
|
||||
void setSampleRate( int sampleRate );
|
||||
void tick( sampleFrame frame );
|
||||
void setSampleRate( int sampleRate );
|
||||
|
||||
private:
|
||||
sampleFrame* m_buffer;
|
||||
int m_maxLength;
|
||||
float m_length;
|
||||
int m_index;
|
||||
float m_feedback;
|
||||
float m_maxTime;
|
||||
sampleFrame* m_buffer;
|
||||
int m_maxLength;
|
||||
float m_length;
|
||||
int m_index;
|
||||
float m_feedback;
|
||||
float m_maxTime;
|
||||
};
|
||||
|
||||
#endif // STEREODELAY_H
|
||||
|
||||
@@ -214,11 +214,10 @@ bool dynProcEffect::processAudioBuffer( sampleFrame * _buf,
|
||||
s[0] *= outputGain;
|
||||
s[1] *= outputGain;
|
||||
|
||||
out_sum += _buf[f][0]*_buf[f][0] + _buf[f][1]*_buf[f][1];
|
||||
// mix wet/dry signals
|
||||
_buf[f][0] = d * _buf[f][0] + w * s[0];
|
||||
_buf[f][1] = d * _buf[f][1] + w * s[1];
|
||||
|
||||
out_sum += _buf[f][0]*_buf[f][0] + _buf[f][1]*_buf[f][1];
|
||||
}
|
||||
|
||||
checkGate( out_sum / _frames );
|
||||
|
||||
@@ -817,18 +817,11 @@ inline void MonstroSynth::updateModulators( float * env1, float * env2, float *
|
||||
}
|
||||
|
||||
|
||||
inline sample_t MonstroSynth::calcSlope1( sample_t s )
|
||||
inline sample_t MonstroSynth::calcSlope( int slope, sample_t s )
|
||||
{
|
||||
if( m_parent->m_slope1 == 1.0f ) return s;
|
||||
if( m_parent->m_slope[slope] == 1.0f ) return s;
|
||||
if( s == 0.0f ) return s;
|
||||
return fastPow( s, m_parent->m_slope1 );
|
||||
}
|
||||
|
||||
inline sample_t MonstroSynth::calcSlope2( sample_t s )
|
||||
{
|
||||
if( m_parent->m_slope2 == 1.0f ) return s;
|
||||
if( s == 0.0f ) return s;
|
||||
return fastPow( s, m_parent->m_slope2 );
|
||||
return fastPow( s, m_parent->m_slope[slope] );
|
||||
}
|
||||
|
||||
|
||||
@@ -1439,14 +1432,14 @@ void MonstroInstrument::updateSamplerate()
|
||||
void MonstroInstrument::updateSlope1()
|
||||
{
|
||||
const float slope = m_env1Slope.value();
|
||||
m_slope1 = exp10f( slope * -1.0f );
|
||||
m_slope[0] = exp10f( slope * -1.0f );
|
||||
}
|
||||
|
||||
|
||||
void MonstroInstrument::updateSlope2()
|
||||
{
|
||||
const float slope = m_env2Slope.value();
|
||||
m_slope2 = exp10f( slope * -1.0f );
|
||||
m_slope[1] = exp10f( slope * -1.0f );
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -177,10 +177,7 @@ private:
|
||||
return s1 + ( s2 - s1 ) * x;
|
||||
}*/ // using interpolation.h from now on
|
||||
|
||||
inline sample_t calcSlope1( sample_t s );
|
||||
|
||||
inline sample_t calcSlope2( sample_t s );
|
||||
|
||||
inline sample_t calcSlope( int slope, sample_t s );
|
||||
|
||||
// checks for lower bound for phase, upper bound is already checked by oscillator-functions in both
|
||||
// oscillator.h and bandlimitedwave.h so we save some cpu by only checking lower bound
|
||||
@@ -411,8 +408,7 @@ protected:
|
||||
f_cnt_t m_env1_relF;
|
||||
f_cnt_t m_env2_relF;
|
||||
|
||||
float m_slope1;
|
||||
float m_slope2;
|
||||
float m_slope [2];
|
||||
|
||||
f_cnt_t m_lfo1_att;
|
||||
f_cnt_t m_lfo2_att;
|
||||
|
||||
@@ -234,7 +234,7 @@ void NesObject::renderOutput( sampleFrame * buf, fpp_t frames )
|
||||
|
||||
// update framecounters
|
||||
m_ch1Counter++;
|
||||
m_ch1Counter = m_ch1Counter % m_wlen1;
|
||||
m_ch1Counter = m_wlen1 ? m_ch1Counter % m_wlen1 : 0;
|
||||
|
||||
m_ch1EnvCounter++;
|
||||
if( m_ch1EnvCounter >= ch1EnvLen )
|
||||
@@ -287,7 +287,7 @@ void NesObject::renderOutput( sampleFrame * buf, fpp_t frames )
|
||||
|
||||
// update framecounters
|
||||
m_ch2Counter++;
|
||||
m_ch2Counter = m_ch2Counter % m_wlen2;
|
||||
m_ch2Counter = m_wlen2 ? m_ch2Counter % m_wlen2 : 0;
|
||||
|
||||
m_ch2EnvCounter++;
|
||||
if( m_ch2EnvCounter >= ch2EnvLen )
|
||||
@@ -310,13 +310,13 @@ void NesObject::renderOutput( sampleFrame * buf, fpp_t frames )
|
||||
////////////////////////////////
|
||||
|
||||
// make sure we don't overflow
|
||||
m_ch3Counter %= m_wlen3;
|
||||
m_ch3Counter = m_wlen3 ? m_ch3Counter % m_wlen3 : 0;
|
||||
|
||||
// render triangle wave
|
||||
if( m_wlen3 <= m_maxWlen && ch3Enabled )
|
||||
{
|
||||
ch3Level = static_cast<int>( m_parent->m_ch3Volume.value() );
|
||||
ch3 = TRIANGLE_WAVETABLE[ ( m_ch3Counter * 32 ) / m_wlen3 ];
|
||||
ch3 = m_wlen3 ? TRIANGLE_WAVETABLE[ ( m_ch3Counter * 32 ) / m_wlen3 ] : 0;
|
||||
ch3 = ( ch3 * ch3Level ) / 15;
|
||||
}
|
||||
else ch3 = ch3Level = 0;
|
||||
|
||||
@@ -497,7 +497,7 @@ void opl2instrument::loadPatch(unsigned char inst[14]) {
|
||||
void opl2instrument::tuneEqual(int center, float Hz) {
|
||||
float tmp;
|
||||
for(int n=0; n<128; ++n) {
|
||||
tmp = Hz*pow( 2, ( n - center ) / 12.0 + pitchbend / 1200.0 );
|
||||
tmp = Hz*pow( 2.0, ( n - center ) * ( 1.0 / 12.0 ) + pitchbend * ( 1.0 / 1200.0 ) );
|
||||
fnums[n] = Hz2fnum( tmp );
|
||||
}
|
||||
}
|
||||
@@ -505,7 +505,7 @@ void opl2instrument::tuneEqual(int center, float Hz) {
|
||||
// Find suitable F number in lowest possible block
|
||||
int opl2instrument::Hz2fnum(float Hz) {
|
||||
for(int block=0; block<8; ++block) {
|
||||
unsigned int fnum = Hz * pow(2, 20-block) / 49716;
|
||||
unsigned int fnum = Hz * pow( 2.0, 20.0 - (double)block ) * ( 1.0 / 49716.0 );
|
||||
if(fnum<1023) {
|
||||
return fnum + (block << 10);
|
||||
}
|
||||
|
||||
@@ -360,11 +360,11 @@ void papuInstrument::playNote( NotePlayHandle * _n,
|
||||
//PRNG Frequency = (1048576 Hz / (ratio + 1)) / 2 ^ (shiftclockfreq + 1)
|
||||
char sopt=0;
|
||||
char ropt=1;
|
||||
float fopt = 524288.0 / ( ropt * pow( 2, sopt+1 ) );
|
||||
float fopt = 524288.0 / ( ropt * pow( 2.0, sopt + 1.0 ) );
|
||||
float f;
|
||||
for ( char s=0; s<16; s++ )
|
||||
for ( char r=0; r<8; r++ ) {
|
||||
f = 524288.0 / ( r * pow( 2, s+1 ) );
|
||||
f = 524288.0 / ( r * pow( 2.0, s + 1.0 ) );
|
||||
if( fabs( freq-fopt ) > fabs( freq-f ) ) {
|
||||
fopt = f;
|
||||
ropt = r;
|
||||
|
||||
@@ -415,7 +415,7 @@ void VstPlugin::setParameterDump( const QMap<QString, QString> & _pdump )
|
||||
{
|
||||
( *it ).section( ':', 0, 0 ).toInt(),
|
||||
"",
|
||||
( *it ).section( ':', 1, 1 ).toFloat()
|
||||
( *it ).section( ':', 2, -1 ).toFloat()
|
||||
} ;
|
||||
m.addInt( item.index );
|
||||
m.addString( item.shortLabel );
|
||||
|
||||
@@ -748,6 +748,8 @@ WatsynView::WatsynView( Instrument * _instrument,
|
||||
m_selectedGraphGroup -> addButton( a2_selectButton );
|
||||
m_selectedGraphGroup -> addButton( b1_selectButton );
|
||||
m_selectedGraphGroup -> addButton( b2_selectButton );
|
||||
WatsynInstrument * w = castModel<WatsynInstrument>();
|
||||
m_selectedGraphGroup -> setModel( &w -> m_selectedGraph);
|
||||
|
||||
// A-modulation button group
|
||||
pixmapButton * amod_mixButton = new pixmapButton( this, NULL );
|
||||
|
||||
@@ -130,11 +130,10 @@ bool waveShaperEffect::processAudioBuffer( sampleFrame * _buf,
|
||||
s[0] *= output;
|
||||
s[1] *= output;
|
||||
|
||||
out_sum += _buf[f][0]*_buf[f][0] + _buf[f][1]*_buf[f][1];
|
||||
// mix wet/dry signals
|
||||
_buf[f][0] = d * _buf[f][0] + w * s[0];
|
||||
_buf[f][1] = d * _buf[f][1] + w * s[1];
|
||||
|
||||
out_sum += _buf[f][0]*_buf[f][0] + _buf[f][1]*_buf[f][1];
|
||||
}
|
||||
|
||||
checkGate( out_sum / _frames );
|
||||
|
||||
@@ -89,6 +89,7 @@ LocalZynAddSubFx::LocalZynAddSubFx() :
|
||||
LocalZynAddSubFx::~LocalZynAddSubFx()
|
||||
{
|
||||
delete m_master;
|
||||
delete m_ioEngine;
|
||||
|
||||
if( --s_instanceCount == 0 )
|
||||
{
|
||||
|
||||
@@ -173,8 +173,11 @@ Controller * Controller::create( ControllerTypes _ct, Model * _parent )
|
||||
if( dummy )
|
||||
c = dummy;
|
||||
else
|
||||
{
|
||||
c = new Controller( DummyController, NULL,
|
||||
QString() );
|
||||
dummy = c;
|
||||
}
|
||||
break;
|
||||
|
||||
case Controller::LfoController:
|
||||
|
||||
@@ -523,7 +523,7 @@ AudioAlsa::setupWidget::setupWidget( QWidget * _parent ) :
|
||||
|
||||
AudioAlsa::setupWidget::~setupWidget()
|
||||
{
|
||||
|
||||
delete m_channels->model();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -464,6 +464,7 @@ AudioJack::setupWidget::setupWidget( QWidget * _parent ) :
|
||||
|
||||
AudioJack::setupWidget::~setupWidget()
|
||||
{
|
||||
delete m_channels->model();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -356,7 +356,7 @@ AudioOss::setupWidget::setupWidget( QWidget * _parent ) :
|
||||
|
||||
AudioOss::setupWidget::~setupWidget()
|
||||
{
|
||||
|
||||
delete m_channels->model();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -307,7 +307,7 @@ AudioPulseAudio::setupWidget::setupWidget( QWidget * _parent ) :
|
||||
|
||||
AudioPulseAudio::setupWidget::~setupWidget()
|
||||
{
|
||||
|
||||
delete m_channels->model();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -194,11 +194,12 @@ void FxMixerView::refreshDisplay()
|
||||
for( int i = 1; i<m_fxChannelViews.size(); ++i )
|
||||
{
|
||||
chLayout->removeWidget(m_fxChannelViews[i]->m_fxLine);
|
||||
m_racksLayout->removeWidget( m_fxChannelViews[i]->m_rackView );
|
||||
delete m_fxChannelViews[i]->m_fader;
|
||||
delete m_fxChannelViews[i]->m_muteBtn;
|
||||
delete m_fxChannelViews[i]->m_fxLine;
|
||||
delete m_fxChannelViews[i]->m_rackView;
|
||||
delete m_fxChannelViews[i];
|
||||
m_racksLayout->removeWidget( m_fxChannelViews[i]->m_rackView );
|
||||
}
|
||||
m_channelAreaWidget->adjustSize();
|
||||
|
||||
@@ -343,15 +344,14 @@ void FxMixerView::deleteChannel(int index)
|
||||
|
||||
// delete the view
|
||||
chLayout->removeWidget(m_fxChannelViews[index]->m_fxLine);
|
||||
m_racksLayout->removeWidget( m_fxChannelViews[index]->m_rackView );
|
||||
delete m_fxChannelViews[index]->m_fader;
|
||||
delete m_fxChannelViews[index]->m_muteBtn;
|
||||
delete m_fxChannelViews[index]->m_fxLine;
|
||||
delete m_fxChannelViews[index]->m_rackView;
|
||||
delete m_fxChannelViews[index];
|
||||
m_channelAreaWidget->adjustSize();
|
||||
|
||||
// delete the fx rack
|
||||
m_racksLayout->removeWidget( m_fxChannelViews[index]->m_rackView );
|
||||
|
||||
// make sure every channel knows what index it is
|
||||
for(int i=0; i<m_fxChannelViews.size(); ++i)
|
||||
{
|
||||
|
||||
@@ -529,6 +529,11 @@ void MainWindow::finalize()
|
||||
setupDialog sd( setupDialog::AudioSettings );
|
||||
sd.exec();
|
||||
}
|
||||
// reset window title every time we change the state of a subwindow to show the correct title
|
||||
foreach( QMdiSubWindow * subWindow, workspace()->subWindowList() )
|
||||
{
|
||||
connect( subWindow, SIGNAL( windowStateChanged(Qt::WindowStates,Qt::WindowStates) ), this, SLOT( resetWindowTitle() ) );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -70,6 +70,11 @@
|
||||
#include "text_float.h"
|
||||
|
||||
|
||||
#if QT_VERSION < 0x040800
|
||||
#define MiddleButton MidButton
|
||||
#endif
|
||||
|
||||
|
||||
typedef AutomationPattern::timeMap timeMap;
|
||||
|
||||
|
||||
|
||||
@@ -253,10 +253,13 @@ ProjectRenderer* exportProjectDialog::prepRender()
|
||||
static_cast<Mixer::qualitySettings::Interpolation>(interpolationCB->currentIndex()),
|
||||
static_cast<Mixer::qualitySettings::Oversampling>(oversamplingCB->currentIndex()) );
|
||||
|
||||
const int samplerates[5] = { 44100, 48000, 88200, 96000, 192000 };
|
||||
const int bitrates[6] = { 64, 128, 160, 192, 256, 320 };
|
||||
|
||||
ProjectRenderer::OutputSettings os = ProjectRenderer::OutputSettings(
|
||||
samplerateCB->currentText().section(" ", 0, 0).toUInt(),
|
||||
samplerates[ samplerateCB->currentIndex() ],
|
||||
false,
|
||||
bitrateCB->currentText().section(" ", 0, 0).toUInt(),
|
||||
bitrates[ bitrateCB->currentIndex() ],
|
||||
static_cast<ProjectRenderer::Depths>( depthCB->currentIndex() ) );
|
||||
|
||||
engine::getSong()->setExportLoop( exportLoopCB->isChecked() );
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
#include <QtGui/QMouseEvent>
|
||||
#include <QtGui/QScrollArea>
|
||||
|
||||
#include <algorithm> // for std::sort
|
||||
|
||||
#include "plugin_browser.h"
|
||||
#include "embed.h"
|
||||
#include "debug.h"
|
||||
|
||||
Reference in New Issue
Block a user