From ce6dc80c9ecaa2c2e624606cea1d7a8a041f9955 Mon Sep 17 00:00:00 2001 From: "Raine M. Ekman" Date: Fri, 17 Jan 2014 23:21:54 +0200 Subject: [PATCH 01/80] OpulenZ: new logo, some refactoring. --- plugins/opl2/logo.png | Bin 285 -> 3195 bytes plugins/opl2/opl2instrument.cpp | 92 ++++++++++++++++++-------------- plugins/opl2/opl2instrument.h | 3 ++ 3 files changed, 55 insertions(+), 40 deletions(-) diff --git a/plugins/opl2/logo.png b/plugins/opl2/logo.png index 913056fe22bd0dd1bcff8862a35b3b0b9ef55e6f..fab0301603f15125e7cc98c5a9bfc13e4b658744 100644 GIT binary patch delta 3176 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 diff --git a/plugins/opl2/opl2instrument.cpp b/plugins/opl2/opl2instrument.cpp index 0117d16509..3239457389 100644 --- a/plugins/opl2/opl2instrument.cpp +++ b/plugins/opl2/opl2instrument.cpp @@ -1,7 +1,7 @@ /* * OPL2 FM synth * - * Copyright (c) 2013 Raine M. Ekman + * Copyright (c) 2014 Raine M. Ekman * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -27,6 +27,8 @@ // - Velocity (and aftertouch) sensitivity // - in FM mode: OP2 level, add mode: OP1 and OP2 levels // - .sbi (or similar) file loading into models +// - RT safety = get rid of mutex = make emulator code thread-safe + // - Extras: // - double release: first release is in effect until noteoff (heard if percussive sound), // second is switched in just before key bit cleared (is this useful???) @@ -213,8 +215,15 @@ opl2instrument::opl2instrument( InstrumentTrack * _instrument_track ) : MOD_CON( trem_depth_mdl ); } +opl2instrument::~opl2instrument() { + delete theEmulator; + engine::mixer()->removePlayHandles( instrumentTrack() ); + delete [] renderbuffer; +} + // Samplerate changes when choosing oversampling, so this is more or less mandatory void opl2instrument::reloadEmulator() { + delete theEmulator; emulatorMutex.lock(); theEmulator = new CTemuopl(engine::mixer()->processingSampleRate(), true, false); theEmulator->init(); @@ -236,36 +245,45 @@ bool opl2instrument::handleMidiEvent( const midiEvent & _me, // - what to do when voices run out and so on... // - mono mode // - int key; + int key, vel; static int lastvoice=0; - if( _me.m_type == MidiNoteOn && !isMuted() ) { - // to get us in line with MIDI - key = _me.key() +12; - for(int i=lastvoice+1; i!=lastvoice; ++i,i%=9) { - if( voiceNote[i] == OPL2_VOICE_FREE ) { - theEmulator->write(0xA0+i, fnums[key] & 0xff); - theEmulator->write(0xB0+i, 32 + ((fnums[key] & 0x1f00) >> 8) ); - // printf("%d: %d %d\n", key, (fnums[key] & 0x1c00) >> 10, fnums[key] & 0x3ff); - voiceNote[i] = key; - // printf("Voice %d on\n",i); - lastvoice=i; - break; - } - } - } else if( _me.m_type == MidiNoteOff ) { - key = _me.key() +12; - for(int i=0; i<9; ++i) { - if( voiceNote[i] == key ) { - theEmulator->write(0xA0+i, fnums[key] & 0xff); - theEmulator->write(0xB0+i, (fnums[key] & 0x1f00) >> 8 ); - voiceNote[i] = OPL2_VOICE_FREE; - } - } - } else { - printf("Midi event type %d\n",_me.m_type); - // 224 - pitch wheel - // 160 - aftertouch? - } + switch(_me.m_type) { + case MidiNoteOn: + if( !isMuted() ) { + // to get us in line with MIDI + key = _me.key() +12; + vel = _me.velocity(); + for(int i=lastvoice+1; i!=lastvoice; ++i,i%=9) { + if( voiceNote[i] == OPL2_VOICE_FREE ) { + theEmulator->write(0xA0+i, fnums[key] & 0xff); + theEmulator->write(0xB0+i, 32 + ((fnums[key] & 0x1f00) >> 8) ); + voiceNote[i] = key; + lastvoice=i; + break; + } + } + } + break; + case MidiNoteOff: + key = _me.key() +12; + for(int i=0; i<9; ++i) { + if( voiceNote[i] == key ) { + theEmulator->write(0xA0+i, fnums[key] & 0xff); + theEmulator->write(0xB0+i, (fnums[key] & 0x1f00) >> 8 ); + voiceNote[i] = OPL2_VOICE_FREE; + } + } + break; + case MidiKeyPressure: + key = _me.key() +12; + vel = _me.velocity(); + break; + case MidiPitchBend: + printf("TODO: Pitch bend\n"); + break; + default: + printf("Midi event type %d\n",_me.m_type); + } emulatorMutex.unlock(); return true; } @@ -338,7 +356,6 @@ void opl2instrument::saveSettings( QDomDocument & _doc, QDomElement & _this ) void opl2instrument::loadSettings( const QDomElement & _this ) { - printf("loadSettings!\n"); op1_a_mdl.loadSettings( _this, "op1_a" ); op1_d_mdl.loadSettings( _this, "op1_d" ); op1_s_mdl.loadSettings( _this, "op1_s" ); @@ -375,9 +392,6 @@ void opl2instrument::loadSettings( const QDomElement & _this ) // Load a preset in binary form void opl2instrument::loadPatch(unsigned char inst[14]) { const unsigned int adlib_opadd[] = {0x00, 0x01, 0x02, 0x08, 0x09, 0x0A, 0x10, 0x11, 0x12}; - // Set all voices - printf("%02x %02x %02x %02x %02x ",inst[0],inst[1],inst[2],inst[3],inst[4]); - printf("%02x %02x %02x %02x %02x %02x\n",inst[5],inst[6],inst[7],inst[8],inst[9],inst[10]); emulatorMutex.lock(); for(int v=0; v<9; ++v) { @@ -400,7 +414,6 @@ void opl2instrument::tuneEqual(int center, float Hz) { for(int n=0; n<128; ++n) { float tmp = Hz*pow(2, (n-center)/12.0); fnums[n] = Hz2fnum( tmp ); - //printf("%d: %d %d %f\n", n, (fnums[n] & 0x1c00) >> 10, fnums[n] & 0x3ff,tmp); } } @@ -418,7 +431,6 @@ int opl2instrument::Hz2fnum(float Hz) { // Load one of the default patches void opl2instrument::loadGMPatch() { unsigned char *inst = midi_fm_instruments[m_patchModel.value()]; - // printf("loadGMPatch: %d ", m_patchModel.value()); loadPatch(inst); } @@ -429,7 +441,6 @@ void opl2instrument::loadGMPatch() { // Update patch from the models to the chip emulation void opl2instrument::updatePatch() { - printf("updatePatch()\n"); unsigned char *inst = midi_fm_instruments[0]; inst[0] = ( op1_trem_mdl.value() ? 128 : 0 ) + ( op1_vib_mdl.value() ? 64 : 0 ) + @@ -558,9 +569,9 @@ opl2instrumentView::opl2instrumentView( Instrument * _instrument, pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); setPalette( pal ); - - - +} +opl2instrumentView::~opl2instrumentView() { + // Nobody else seems to delete their knobs and buttons? } void opl2instrumentView::modelChanged() @@ -610,4 +621,5 @@ void opl2instrumentView::modelChanged() } + #include "moc_opl2instrument.cxx" diff --git a/plugins/opl2/opl2instrument.h b/plugins/opl2/opl2instrument.h index 6933d7479f..a02088167b 100644 --- a/plugins/opl2/opl2instrument.h +++ b/plugins/opl2/opl2instrument.h @@ -40,6 +40,8 @@ class opl2instrument : public Instrument Q_OBJECT public: opl2instrument( InstrumentTrack * _instrument_track ); + virtual ~opl2instrument(); + virtual QString nodeName() const; virtual PluginView * instantiateView( QWidget * _parent ); @@ -121,6 +123,7 @@ class opl2instrumentView : public InstrumentView Q_OBJECT public: opl2instrumentView( Instrument * _instrument, QWidget * _parent ); + virtual ~opl2instrumentView(); lcdSpinBox *m_patch; void modelChanged(); From 9a9a867e7d3997b64332f3e75adbfd985dd187c1 Mon Sep 17 00:00:00 2001 From: "Raine M. Ekman" Date: Wed, 22 Jan 2014 20:57:02 +0200 Subject: [PATCH 02/80] Added pitch bend --- plugins/opl2/opl2instrument.cpp | 40 ++++++++++++++++++++++----------- plugins/opl2/opl2instrument.h | 6 ++++- 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/plugins/opl2/opl2instrument.cpp b/plugins/opl2/opl2instrument.cpp index 3239457389..dd8fda55a3 100644 --- a/plugins/opl2/opl2instrument.cpp +++ b/plugins/opl2/opl2instrument.cpp @@ -23,9 +23,8 @@ */ // TODO: -// - Pitch bend // - Velocity (and aftertouch) sensitivity -// - in FM mode: OP2 level, add mode: OP1 and OP2 levels +// * in FM mode: OP2 level, add mode: OP1 and OP2 levels // - .sbi (or similar) file loading into models // - RT safety = get rid of mutex = make emulator code thread-safe @@ -163,12 +162,14 @@ opl2instrument::opl2instrument( InstrumentTrack * _instrument_track ) : frameCount = engine::mixer()->framesPerPeriod(); renderbuffer = new short[frameCount]; - // Some kind of sane default + // Some kind of sane defaults + pitchbend = 0; tuneEqual(69, 440); for(int i=1; i<9; ++i) { voiceNote[i] = OPL2_VOICE_FREE; } + connect( engine::mixer(), SIGNAL( sampleRateChanged() ), this, SLOT( reloadEmulator() ) ); // Connect knobs @@ -239,18 +240,12 @@ bool opl2instrument::handleMidiEvent( const midiEvent & _me, const midiTime & _time ) { emulatorMutex.lock(); - // Real dummy version... Should at least add: - // - smarter voice allocation: - // - reuse same note, now we have round robin-ish - // - what to do when voices run out and so on... - // - mono mode - // - int key, vel; + int key, vel, tmp_pb; static int lastvoice=0; switch(_me.m_type) { case MidiNoteOn: if( !isMuted() ) { - // to get us in line with MIDI + // to get us in line with MIDI(?) key = _me.key() +12; vel = _me.velocity(); for(int i=lastvoice+1; i!=lastvoice; ++i,i%=9) { @@ -258,6 +253,7 @@ bool opl2instrument::handleMidiEvent( const midiEvent & _me, theEmulator->write(0xA0+i, fnums[key] & 0xff); theEmulator->write(0xB0+i, 32 + ((fnums[key] & 0x1f00) >> 8) ); voiceNote[i] = key; + velocities[key] = vel; lastvoice=i; break; } @@ -273,13 +269,30 @@ bool opl2instrument::handleMidiEvent( const midiEvent & _me, voiceNote[i] = OPL2_VOICE_FREE; } } + velocities[key] = 0; break; case MidiKeyPressure: key = _me.key() +12; vel = _me.velocity(); + if( velocities[key] != 0) { + velocities[key] = vel; + } break; case MidiPitchBend: - printf("TODO: Pitch bend\n"); + // Update fnumber table + tmp_pb = (2*BEND_CENTS)*((float)_me.m_data.m_param[0]/16383)-BEND_CENTS; + if( tmp_pb != pitchbend ) { + pitchbend = tmp_pb; + tuneEqual(69, 440.0); + } + // Update pitch of sounding notes + for( int i=0; i<9; ++i ) { + if( voiceNote[i] != OPL2_VOICE_FREE ) { + theEmulator->write(0xA0+i, fnums[voiceNote[i] ] & 0xff); + theEmulator->write(0xB0+i, 32 + ((fnums[voiceNote[i]] & 0x1f00) >> 8) ); + } + } + // printf("Pitch bend: %d\n", pitchbend); break; default: printf("Midi event type %d\n",_me.m_type); @@ -411,8 +424,9 @@ void opl2instrument::loadPatch(unsigned char inst[14]) { } void opl2instrument::tuneEqual(int center, float Hz) { + float tmp; for(int n=0; n<128; ++n) { - float tmp = Hz*pow(2, (n-center)/12.0); + tmp = Hz*pow( 2, ( n - center ) / 12.0 + pitchbend / 1200.0 ); fnums[n] = Hz2fnum( tmp ); } } diff --git a/plugins/opl2/opl2instrument.h b/plugins/opl2/opl2instrument.h index a02088167b..7c81ba1924 100644 --- a/plugins/opl2/opl2instrument.h +++ b/plugins/opl2/opl2instrument.h @@ -109,9 +109,13 @@ private: fpp_t frameCount; short *renderbuffer; int voiceNote[9]; - int heldNotes[128]; + // 0 - no note, >0 - note on velocity + int velocities[128]; // These include both octave and Fnumber int fnums[128]; + // in cents, range defaults to +/-100 cents (should this be changeable?) + int pitchbend; + #define BEND_CENTS 100 int Hz2fnum(float Hz); static QMutex emulatorMutex; From b7e62004335987638184942039e60980476ab5b1 Mon Sep 17 00:00:00 2001 From: Wong Cho Ching Date: Sat, 25 Jan 2014 01:53:57 +0800 Subject: [PATCH 03/80] Fixes Ghost Peak Controller Bug https://github.com/LMMS/lmms/issues/115 --- include/preset_preview_play_handle.h | 2 ++ .../peak_controller_effect.cpp | 1 + .../peak_controller_effect_controls.cpp | 3 ++- src/core/preset_preview_play_handle.cpp | 26 +++++++++++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/include/preset_preview_play_handle.h b/include/preset_preview_play_handle.h index 3e4d4e53c5..e5185cfbe8 100644 --- a/include/preset_preview_play_handle.h +++ b/include/preset_preview_play_handle.h @@ -51,6 +51,8 @@ public: static ConstNotePlayHandleList nphsOfInstrumentTrack( const InstrumentTrack * _ct ); + static bool isPreviewing(); + private: static previewTrackContainer * s_previewTC; diff --git a/plugins/peak_controller_effect/peak_controller_effect.cpp b/plugins/peak_controller_effect/peak_controller_effect.cpp index f9b4049c50..4069c941b8 100644 --- a/plugins/peak_controller_effect/peak_controller_effect.cpp +++ b/plugins/peak_controller_effect/peak_controller_effect.cpp @@ -81,6 +81,7 @@ PeakControllerEffect::~PeakControllerEffect() if( idx >= 0 ) { PeakController::s_effects.remove( idx ); + engine::getSong()->removeController( m_autoController ); } } diff --git a/plugins/peak_controller_effect/peak_controller_effect_controls.cpp b/plugins/peak_controller_effect/peak_controller_effect_controls.cpp index eb7e5191df..34ee79a117 100644 --- a/plugins/peak_controller_effect/peak_controller_effect_controls.cpp +++ b/plugins/peak_controller_effect/peak_controller_effect_controls.cpp @@ -29,6 +29,7 @@ #include "PeakController.h" #include "peak_controller_effect_controls.h" #include "peak_controller_effect.h" +#include "preset_preview_play_handle.h" PeakControllerEffectControls:: @@ -66,7 +67,7 @@ void PeakControllerEffectControls::loadSettings( const QDomElement & _this ) } m_effect->m_effectId = effectId; - if( m_effect->m_autoController ) + if( m_effect->m_autoController && presetPreviewPlayHandle::isPreviewing() == false ) { delete m_effect->m_autoController; m_effect->m_autoController = 0; diff --git a/src/core/preset_preview_play_handle.cpp b/src/core/preset_preview_play_handle.cpp index 09139ba216..94066ecedb 100644 --- a/src/core/preset_preview_play_handle.cpp +++ b/src/core/preset_preview_play_handle.cpp @@ -89,12 +89,24 @@ public: m_dataMutex.unlock(); } + bool isPreviewing() + { + bool ret = m_dataMutex.tryLock(); + if( ret == true ) + { + m_dataMutex.unlock(); + } + return ret; + } + private: InstrumentTrack * m_previewInstrumentTrack; notePlayHandle * m_previewNote; QMutex m_dataMutex; + friend presetPreviewPlayHandle; + } ; @@ -242,3 +254,17 @@ ConstNotePlayHandleList presetPreviewPlayHandle::nphsOfInstrumentTrack( } + + +bool presetPreviewPlayHandle::isPreviewing() +{ + bool ret = s_previewTC->m_dataMutex.tryLock(); + if( ret == true ) + { + s_previewTC->m_dataMutex.unlock(); + } + return ret; +} + + + From 67382654eb27c6402393f257d67da584dc2a70eb Mon Sep 17 00:00:00 2001 From: "Raine M. Ekman" Date: Fri, 24 Jan 2014 22:37:36 +0200 Subject: [PATCH 04/80] OpulenZ: added velocity & aftertouch, cleaned up some unneeded code --- plugins/opl2/CMakeLists.txt | 2 +- plugins/opl2/adlibemu.c | 608 -------------------------------- plugins/opl2/adlibemu.h | 26 -- plugins/opl2/kemuopl.h | 61 ---- plugins/opl2/opl2instrument.cpp | 1 - 5 files changed, 1 insertion(+), 697 deletions(-) delete mode 100644 plugins/opl2/adlibemu.c delete mode 100644 plugins/opl2/adlibemu.h delete mode 100644 plugins/opl2/kemuopl.h diff --git a/plugins/opl2/CMakeLists.txt b/plugins/opl2/CMakeLists.txt index 0b9bd32cd8..981ec53a36 100644 --- a/plugins/opl2/CMakeLists.txt +++ b/plugins/opl2/CMakeLists.txt @@ -1,3 +1,3 @@ INCLUDE(BuildPlugin) -BUILD_PLUGIN(OPL2 opl2instrument.cpp opl2instrument.h opl.h kemuopl.h adlibemu.c adlibemu.h fmopl.c fmopl.h temuopl.cpp temuopl.h MOCFILES opl2instrument.h EMBEDDED_RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.png) \ No newline at end of file +BUILD_PLUGIN(OPL2 opl2instrument.cpp opl2instrument.h opl.h fmopl.c fmopl.h temuopl.cpp temuopl.h MOCFILES opl2instrument.h EMBEDDED_RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.png) \ No newline at end of file diff --git a/plugins/opl2/adlibemu.c b/plugins/opl2/adlibemu.c deleted file mode 100644 index 9aac3a6fcd..0000000000 --- a/plugins/opl2/adlibemu.c +++ /dev/null @@ -1,608 +0,0 @@ -/* - * ADLIBEMU.C - * Copyright (C) 1998-2001 Ken Silverman - * Ken Silverman's official web site: "http://www.advsys.net/ken" - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* -This file is a digital Adlib emulator for OPL2 and possibly OPL3 - -Features that could be added in a future version: -- Amplitude and Frequency Vibrato Bits (not hard, but a big speed hit) -- Global Keyboard Split Number Bit (need to research this one some more) -- 2nd Adlib chip for OPL3 (simply need to make my cell array bigger) -- Advanced connection modes of OPL3 (Just need to add more "docell" cases) -- L/R Stereo bits of OPL3 (Need adlibgetsample to return stereo) - -Features that aren't worth supporting: -- Anything related to adlib timers&interrupts (Sorry - I always used IRQ0) -- Composite sine wave mode (CSM) (Supported only on ancient cards) - -I'm not sure about a few things in my code: -- Attack curve. What function is this anyway? I chose to use an order-3 - polynomial to approximate but this doesn't seem right. -- Attack/Decay/Release constants - my constants may not be exact -- What should ADJUSTSPEED be? -- Haven't verified that Global Keyboard Split Number Bit works yet -- Some of the drums don't always sound right. It's pretty hard to guess - the exact waveform of drums when you look at random data which is - slightly randomized due to digital ADC recording. -- Adlib seems to have a lot more treble than my emulator does. I'm not - sure if this is simply unfixable due to the sound blaster's different - filtering on FM and digital playback or if it's a serious bug in my - code. -*/ - -#include -#include - -#if !defined(max) && !defined(__cplusplus) -#define max(a,b) (((a) > (b)) ? (a) : (b)) -#endif -#if !defined(min) && !defined(__cplusplus) -#define min(a,b) (((a) < (b)) ? (a) : (b)) -#endif - -#define PI 3.141592653589793 -#define MAXCELLS 18 -#define WAVPREC 2048 - -static float AMPSCALE=(8192.0); -#define FRQSCALE (49716/512.0) - -//Constants for Ken's Awe32, on a PII-266 (Ken says: Use these for KSM's!) -#define MODFACTOR 4.0 //How much of modulator cell goes into carrier -#define MFBFACTOR 1.0 //How much feedback goes back into modulator -#define ADJUSTSPEED 0.75 //0<=x<=1 Simulate finite rate of change of state - -//Constants for Ken's Awe64G, on a P-133 -//#define MODFACTOR 4.25 //How much of modulator cell goes into carrier -//#define MFBFACTOR 0.5 //How much feedback goes back into modulator -//#define ADJUSTSPEED 0.85 //0<=x<=1 Simulate finite rate of change of state - -typedef struct -{ - float val, t, tinc, vol, sustain, amp, mfb; - float a0, a1, a2, a3, decaymul, releasemul; - short *waveform; - long wavemask; - void (*cellfunc)(void *, float); - unsigned char flags, dum0, dum1, dum2; -} celltype; - -static long numspeakers, bytespersample; -static float recipsamp; -static celltype cell[MAXCELLS]; -static signed short wavtable[WAVPREC*3]; -static float kslmul[4] = {0.0,0.5,0.25,1.0}; -static float frqmul[16] = {.5,1,2,3,4,5,6,7,8,9,10,10,12,12,15,15}, nfrqmul[16]; -static unsigned char adlibreg[256], ksl[8][16]; -static unsigned char modulatorbase[9] = {0,1,2,8,9,10,16,17,18}; -static unsigned char odrumstat = 0; -static unsigned char base2cell[22] = {0,1,2,0,1,2,0,0,3,4,5,3,4,5,0,0,6,7,8,6,7,8}; - -float lvol[9] = {1,1,1,1,1,1,1,1,1}; //Volume multiplier on left speaker -float rvol[9] = {1,1,1,1,1,1,1,1,1}; //Volume multiplier on right speaker -long lplc[9] = {0,0,0,0,0,0,0,0,0}; //Samples to delay on left speaker -long rplc[9] = {0,0,0,0,0,0,0,0,0}; //Samples to delay on right speaker - -long nlvol[9], nrvol[9]; -long nlplc[9], nrplc[9]; -long rend = 0; -#define FIFOSIZ 256 -static float *rptr[9], *nrptr[9]; -static float rbuf[9][FIFOSIZ*2]; -static float snd[FIFOSIZ*2]; - -#ifndef USING_ASM -#define _inline -#endif - -#ifdef USING_ASM -static _inline void ftol (float f, long *a) -{ - _asm - { - mov eax, a - fld f - fistp dword ptr [eax] - } -} -#else -static void ftol(float f, long *a) { - *a=f; -} -#endif - -#define ctc ((celltype *)c) //A rare attempt to make code easier to read! -void docell4 (void *c, float modulator) { } -void docell3 (void *c, float modulator) -{ - long i; - - ftol(ctc->t+modulator,&i); - ctc->t += ctc->tinc; - ctc->val += (ctc->amp*ctc->vol*((float)ctc->waveform[i&ctc->wavemask])-ctc->val)*ADJUSTSPEED; -} -void docell2 (void *c, float modulator) -{ - long i; - - ftol(ctc->t+modulator,&i); - - void *amp_void = &ctc->amp; - long *amp_long = (long *)amp_void; - if (*amp_long <= 0x37800000) - { - ctc->amp = 0; - ctc->cellfunc = docell4; - } - ctc->amp *= ctc->releasemul; - - ctc->t += ctc->tinc; - ctc->val += (ctc->amp*ctc->vol*((float)ctc->waveform[i&ctc->wavemask])-ctc->val)*ADJUSTSPEED; -} -void docell1 (void *c, float modulator) -{ - long i; - - ftol(ctc->t+modulator,&i); - - void *amp_void = &ctc->amp; - long *amp_long = (long *)amp_void; - void *sustain_void = &ctc->sustain; - long *sustain_long = (long *)sustain_void; - if (*amp_long <= *sustain_long) - { - if (ctc->flags&32) - { - ctc->amp = ctc->sustain; - ctc->cellfunc = docell3; - } - else - ctc->cellfunc = docell2; - } - else - ctc->amp *= ctc->decaymul; - - ctc->t += ctc->tinc; - ctc->val += (ctc->amp*ctc->vol*((float)ctc->waveform[i&ctc->wavemask])-ctc->val)*ADJUSTSPEED; -} -void docell0 (void *c, float modulator) -{ - long i; - - ftol(ctc->t+modulator,&i); - - ctc->amp = ((ctc->a3*ctc->amp + ctc->a2)*ctc->amp + ctc->a1)*ctc->amp + ctc->a0; - void *amp_void = &ctc->amp; - long *amp_long = (long *)amp_void; - if (*amp_long > 0x3f800000) - { - ctc->amp = 1; - ctc->cellfunc = docell1; - } - - ctc->t += ctc->tinc; - ctc->val += (ctc->amp*ctc->vol*((float)ctc->waveform[i&ctc->wavemask])-ctc->val)*ADJUSTSPEED; -} - - -static long waveform[8] = {WAVPREC,WAVPREC>>1,WAVPREC,(WAVPREC*3)>>2,0,0,(WAVPREC*5)>>2,WAVPREC<<1}; -static long wavemask[8] = {WAVPREC-1,WAVPREC-1,(WAVPREC>>1)-1,(WAVPREC>>1)-1,WAVPREC-1,((WAVPREC*3)>>2)-1,WAVPREC>>1,WAVPREC-1}; -static long wavestart[8] = {0,WAVPREC>>1,0,WAVPREC>>2,0,0,0,WAVPREC>>3}; -static float attackconst[4] = {1/2.82624,1/2.25280,1/1.88416,1/1.59744}; -static float decrelconst[4] = {1/39.28064,1/31.41608,1/26.17344,1/22.44608}; -void cellon (long i, long j, celltype *c, unsigned char iscarrier) -{ - long frn, oct, toff; - float f; - - frn = ((((long)adlibreg[i+0xb0])&3)<<8) + (long)adlibreg[i+0xa0]; - oct = ((((long)adlibreg[i+0xb0])>>2)&7); - toff = (oct<<1) + ((frn>>9)&((frn>>8)|(((adlibreg[8]>>6)&1)^1))); - if (!(adlibreg[j+0x20]&16)) toff >>= 2; - - f = pow(2.0,(adlibreg[j+0x60]>>4)+(toff>>2)-1)*attackconst[toff&3]*recipsamp; - c->a0 = .0377*f; c->a1 = 10.73*f+1; c->a2 = -17.57*f; c->a3 = 7.42*f; - f = -7.4493*decrelconst[toff&3]*recipsamp; - c->decaymul = pow(2.0,f*pow(2.0,(adlibreg[j+0x60]&15)+(toff>>2))); - c->releasemul = pow(2.0,f*pow(2.0,(adlibreg[j+0x80]&15)+(toff>>2))); - c->wavemask = wavemask[adlibreg[j+0xe0]&7]; - c->waveform = &wavtable[waveform[adlibreg[j+0xe0]&7]]; - if (!(adlibreg[1]&0x20)) c->waveform = &wavtable[WAVPREC]; - c->t = wavestart[adlibreg[j+0xe0]&7]; - c->flags = adlibreg[j+0x20]; - c->cellfunc = docell0; - c->tinc = (float)(frn<vol = pow(2.0,((float)(adlibreg[j+0x40]&63) + - (float)kslmul[adlibreg[j+0x40]>>6]*ksl[oct][frn>>6]) * -.125 - 14); - c->sustain = pow(2.0,(float)(adlibreg[j+0x80]>>4) * -.5); - if (!iscarrier) c->amp = 0; - c->mfb = pow(2.0,((adlibreg[i+0xc0]>>1)&7)+5)*(WAVPREC/2048.0)*MFBFACTOR; - if (!(adlibreg[i+0xc0]&14)) c->mfb = 0; - c->val = 0; -} - -//This function (and bug fix) written by Chris Moeller -void cellfreq (signed long i, signed long j, celltype *c) -{ - long frn, oct; - - frn = ((((long)adlibreg[i+0xb0])&3)<<8) + (long)adlibreg[i+0xa0]; - oct = ((((long)adlibreg[i+0xb0])>>2)&7); - - c->tinc = (float)(frn<vol = pow(2.0,((float)(adlibreg[j+0x40]&63) + - (float)kslmul[adlibreg[j+0x40]>>6]*ksl[oct][frn>>6]) * -.125 - 14); -} - -static long initfirstime = 0; -void adlibinit (long dasamplerate, long danumspeakers, long dabytespersample) -{ - long i, j, frn, oct; - - memset((void *)adlibreg,0,sizeof(adlibreg)); - memset((void *)cell,0,sizeof(celltype)*MAXCELLS); - memset((void *)rbuf,0,sizeof(rbuf)); - rend = 0; odrumstat = 0; - - for(i=0;i=0;i--) nfrqmul[i] = frqmul[i]*recipsamp*FRQSCALE*(WAVPREC/2048.0); - - if (!initfirstime) - { - initfirstime = 1; - - for(i=0;i<(WAVPREC>>1);i++) - { - wavtable[i] = - wavtable[(i<<1) +WAVPREC] = (signed short)(16384*sin((float)((i<<1) )*PI*2/WAVPREC)); - wavtable[(i<<1)+1+WAVPREC] = (signed short)(16384*sin((float)((i<<1)+1)*PI*2/WAVPREC)); - } - for(i=0;i<(WAVPREC>>3);i++) - { - wavtable[i+(WAVPREC<<1)] = wavtable[i+(WAVPREC>>3)]-16384; - wavtable[i+((WAVPREC*17)>>3)] = wavtable[i+(WAVPREC>>2)]+16384; - } - - //[table in book]*8/3 - ksl[7][0] = 0; ksl[7][1] = 24; ksl[7][2] = 32; ksl[7][3] = 37; - ksl[7][4] = 40; ksl[7][5] = 43; ksl[7][6] = 45; ksl[7][7] = 47; - ksl[7][8] = 48; for(i=9;i<16;i++) ksl[7][i] = i+41; - for(j=6;j>=0;j--) - for(i=0;i<16;i++) - { - oct = (long)ksl[j+1][i]-8; if (oct < 0) oct = 0; - ksl[j][i] = (unsigned char)oct; - } - } - else - { - for(i=0;i<9;i++) - { - frn = ((((long)adlibreg[i+0xb0])&3)<<8) + (long)adlibreg[i+0xa0]; - oct = ((((long)adlibreg[i+0xb0])>>2)&7); - cell[i].tinc = (float)(frn< (odrumstat&16)) //BassDrum - { - cellon(6,16,&cell[6],0); - cellon(6,19,&cell[15],1); - cell[15].vol *= 2; - } - if ((v&8) > (odrumstat&8)) //Snare - { - cellon(16,20,&cell[16],0); - cell[16].tinc *= 2*(nfrqmul[adlibreg[17+0x20]&15] / nfrqmul[adlibreg[20+0x20]&15]); - if (((adlibreg[20+0xe0]&7) >= 3) && ((adlibreg[20+0xe0]&7) <= 5)) cell[16].vol = 0; - cell[16].vol *= 2; - } - if ((v&4) > (odrumstat&4)) //TomTom - { - cellon(8,18,&cell[8],0); - cell[8].vol *= 2; - } - if ((v&2) > (odrumstat&2)) //Cymbal - { - cellon(17,21,&cell[17],0); - - cell[17].wavemask = wavemask[5]; - cell[17].waveform = &wavtable[waveform[5]]; - cell[17].tinc *= 16; cell[17].vol *= 2; - - //cell[17].waveform = &wavtable[WAVPREC]; cell[17].wavemask = 0; - //if (((adlibreg[21+0xe0]&7) == 0) || ((adlibreg[21+0xe0]&7) == 6)) - // cell[17].waveform = &wavtable[(WAVPREC*7)>>2]; - //if (((adlibreg[21+0xe0]&7) == 2) || ((adlibreg[21+0xe0]&7) == 3)) - // cell[17].waveform = &wavtable[(WAVPREC*5)>>2]; - } - if ((v&1) > (odrumstat&1)) //Hihat - { - cellon(7,17,&cell[7],0); - if (((adlibreg[17+0xe0]&7) == 1) || ((adlibreg[17+0xe0]&7) == 4) || - ((adlibreg[17+0xe0]&7) == 5) || ((adlibreg[17+0xe0]&7) == 7)) cell[7].vol = 0; - if ((adlibreg[17+0xe0]&7) == 6) { cell[7].wavemask = 0; cell[7].waveform = &wavtable[(WAVPREC*7)>>2]; } - } - - odrumstat = v; - } - else if (((unsigned)(i-0x40) < (unsigned)22) && ((i&7) < 6)) - { - if ((i&7) < 3) // Modulator - cellfreq(base2cell[i-0x40],i-0x40,&cell[base2cell[i-0x40]]); - else // Carrier - cellfreq(base2cell[i-0x40],i-0x40,&cell[base2cell[i-0x40]+9]); - } - else if ((unsigned)(i-0xa0) < (unsigned)9) - { - cellfreq(i-0xa0,modulatorbase[i-0xa0],&cell[i-0xa0]); - cellfreq(i-0xa0,modulatorbase[i-0xa0]+3,&cell[i-0xa0+9]); - } - else if ((unsigned)(i-0xb0) < (unsigned)9) - { - if ((v&32) > (tmp&32)) - { - cellon(i-0xb0,modulatorbase[i-0xb0],&cell[i-0xb0],0); - cellon(i-0xb0,modulatorbase[i-0xb0]+3,&cell[i-0xb0+9],1); - } - else if ((v&32) < (tmp&32)) - cell[i-0xb0].cellfunc = cell[i-0xb0+9].cellfunc = docell2; - cellfreq(i-0xb0,modulatorbase[i-0xb0],&cell[i-0xb0]); - cellfreq(i-0xb0,modulatorbase[i-0xb0]+3,&cell[i-0xb0+9]); - } - - //outdata(i,v); -} - -#ifdef USING_ASM -static long fpuasm; -static float fakeadd = 8388608.0+128.0; -static _inline void clipit8 (float f, long a) -{ - _asm - { - mov edi, a - fld dword ptr f - fadd dword ptr fakeadd - fstp dword ptr fpuasm - mov eax, fpuasm - test eax, 0x007fff00 - jz short skipit - shr eax, 16 - xor eax, -1 - skipit: mov byte ptr [edi], al - } -} - -static _inline void clipit16 (float f, long a) -{ - _asm - { - mov eax, a - fld dword ptr f - fist word ptr [eax] - cmp word ptr [eax], 0x8000 - jne short skipit2 - fst dword ptr [fpuasm] - cmp fpuasm, 0x80000000 - sbb word ptr [eax], 0 - skipit2: fstp st - } -} -#else -static void clipit8(float f,unsigned char *a) { - f/=256.0; - f+=128.0; - if (f>254.5) *a=255; - else if (f<0.5) *a=0; - else *a=f; -} - -static void clipit16(float f,short *a) { - if (f>32766.5) *a=32767; - else if (f<-32767.5) *a=-32768; - else *a=f; -} -#endif - -void adlibsetvolume(int i) { - AMPSCALE=i; -} - -void adlibgetsample (unsigned char *sndptr, long numbytes) -{ - long i, j, k=0, ns, endsamples, rptrs, numsamples; - celltype *cptr; - float f; - short *sndptr2=(short *)sndptr; - - numsamples = (numbytes>>(numspeakers+bytespersample-2)); - - if (bytespersample == 1) f = AMPSCALE/256.0; else f = AMPSCALE; - if (numspeakers == 1) - { - nlvol[0] = lvol[0]*f; - for(i=0;i<9;i++) rptr[i] = &rbuf[0][0]; - rptrs = 1; - } - else - { - rptrs = 0; - for(i=0;i<9;i++) - { - if ((!i) || (lvol[i] != lvol[i-1]) || (rvol[i] != rvol[i-1]) || - (lplc[i] != lplc[i-1]) || (rplc[i] != rplc[i-1])) - { - nlvol[rptrs] = lvol[i]*f; - nrvol[rptrs] = rvol[i]*f; - nlplc[rptrs] = rend-min(max(lplc[i],0),FIFOSIZ); - nrplc[rptrs] = rend-min(max(rplc[i],0),FIFOSIZ); - rptrs++; - } - rptr[i] = &rbuf[rptrs-1][0]; - } - } - - - //CPU time used to be somewhat less when emulator was only mono! - // Because of no delay fifos! - - for(ns=0;ns>1)-1)); //Snare - (cell[7].cellfunc)((void *)&cell[7],k&(WAVPREC-1)); //Hihat - (cell[17].cellfunc)((void *)&cell[17],k&((WAVPREC>>3)-1)); //Cymbal - (cell[8].cellfunc)((void *)&cell[8],0.0); //TomTom - nrptr[7][i] += cell[7].val + cell[16].val; - nrptr[8][i] += cell[8].val + cell[17].val; - } - } - } - for(j=9-1;j>=0;j--) - { - if ((adlibreg[0xbd]&0x20) && (j >= 6) && (j < 9)) continue; - - cptr = &cell[j]; k = j; - if (adlibreg[0xc0+k]&1) - { - if ((cptr[9].cellfunc == docell4) && (cptr->cellfunc == docell4)) continue; - for(i=0;icellfunc)((void *)cptr,cptr->val*cptr->mfb); - (cptr->cellfunc)((void *)&cptr[9],0); - nrptr[j][i] += cptr[9].val + cptr->val; - } - } - else - { - if (cptr[9].cellfunc == docell4) continue; - for(i=0;icellfunc)((void *)cptr,cptr->val*cptr->mfb); - (cptr[9].cellfunc)((void *)&cptr[9],cptr->val*WAVPREC*MODFACTOR); - nrptr[j][i] += cptr[9].val; - } - } - } - - if (numspeakers == 1) - { - if (bytespersample == 1) - { - for(i=endsamples-1;i>=0;i--) - clipit8(nrptr[0][i]*nlvol[0],sndptr+1); - } - else - { - for(i=endsamples-1;i>=0;i--) - clipit16(nrptr[0][i]*nlvol[0],sndptr2+i); - } - } - else - { - memset((void *)snd,0,endsamples*sizeof(float)*2); - for(j=0;j=0;i--) - clipit8(snd[i],sndptr+i); - } - else - { - for(i=(endsamples<<1)-1;i>=0;i--) - clipit16(snd[i],sndptr2+i); - } - } - - sndptr = sndptr+(numspeakers*endsamples); - sndptr2 = sndptr2+(numspeakers*endsamples); - rend = ((rend+endsamples)&(FIFOSIZ*2-1)); - } -} diff --git a/plugins/opl2/adlibemu.h b/plugins/opl2/adlibemu.h deleted file mode 100644 index 8600d787d8..0000000000 --- a/plugins/opl2/adlibemu.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * ADLIBEMU.H - * Copyright (C) 1998-2001 Ken Silverman - * Ken Silverman's official web site: "http://www.advsys.net/ken" - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -void adlibinit(long dasamplerate,long danumspeakers,long dabytespersample); -void adlib0(long i,long v); -void adlibgetsample(void *sndptr,long numbytes); -void adlibsetvolume(int i); -void randoinsts(); -extern float lvol[9],rvol[9],lplc[9],rplc[9]; diff --git a/plugins/opl2/kemuopl.h b/plugins/opl2/kemuopl.h deleted file mode 100644 index d2ca6e288f..0000000000 --- a/plugins/opl2/kemuopl.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Adplug - Replayer for many OPL2/OPL3 audio file formats. - * Copyright (C) 1999 - 2005 Simon Peter, , et al. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * kemuopl.h - Emulated OPL using Ken Silverman's emulator, by Simon Peter - * - */ - -#ifndef H_ADPLUG_KEMUOPL -#define H_ADPLUG_KEMUOPL - -#include "opl.h" -extern "C" { -#include "adlibemu.h" -} - -class CKemuopl: public Copl -{ -public: - CKemuopl(int rate, bool bit16, bool usestereo) - : use16bit(bit16), stereo(usestereo) - { - adlibinit(rate, usestereo ? 2 : 1, bit16 ? 2 : 1); - currType = TYPE_OPL2; - }; - - void update(short *buf, int samples) - { - if(use16bit) samples *= 2; - if(stereo) samples *= 2; - adlibgetsample(buf, samples); - } - - // template methods - void write(int reg, int val) - { - if(currChip == 0) - adlib0(reg, val); - }; - - void init() {}; - -private: - bool use16bit,stereo; -}; - -#endif diff --git a/plugins/opl2/opl2instrument.cpp b/plugins/opl2/opl2instrument.cpp index 1ce116c1ad..ab94eb8344 100644 --- a/plugins/opl2/opl2instrument.cpp +++ b/plugins/opl2/opl2instrument.cpp @@ -54,7 +54,6 @@ #include "opl.h" #include "temuopl.h" -#include "kemuopl.h" #include "embed.cpp" #include "math.h" From cbc5fb56c93051732a74fae4f7bdaf3e68a1ded0 Mon Sep 17 00:00:00 2001 From: Jonathan Aquilina Date: Sat, 25 Jan 2014 13:44:45 +0100 Subject: [PATCH 05/80] Updating Authors file with new contributors --- AUTHORS | 48 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/AUTHORS b/AUTHORS index 9bdf47818d..086d6c3a29 100644 --- a/AUTHORS +++ b/AUTHORS @@ -2,21 +2,25 @@ Tobias Doerffel Maintainer, main-development, artwork etc. +Jonathan Aquilina + + Project Manager + Paul Giblock - development + Development Danny McRae - development + Development Javier Serrano Polo - development + Development Andrew Kelley - development + Development Andreas Brandmaier @@ -24,12 +28,40 @@ Andreas Brandmaier Juan Fabián Simón - version 4.0 plugin artwork + Version 4.0 plugin artwork Sebastian Tilsch - recording of many samples + Recording of many samples -gabriel +Gabriel - additional artwork + Additional artwork + +Vesa Kivimäki + + UI Lead developer + +Gurjot Singh + + Developer + +Hannu Haahti + + Developer + +Uroš Maravić + + UI Developer + +Tobiasz Karoń (unfa) + + UI Developer + +Johannes Lorenz + + Developer + +Rubén Ibarra Pastor + + Developer From 4d306c3855244c38721805e28bd68a005026b24d Mon Sep 17 00:00:00 2001 From: Lukas W Date: Sat, 25 Jan 2014 11:32:03 +0100 Subject: [PATCH 06/80] Fix mismatched delete delete was called on memory allocated with malloc() which results in undefined behaviour. Fixed by using free() instead of delete. --- src/core/song.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/song.cpp b/src/core/song.cpp index a32f453d73..f49f1bb314 100644 --- a/src/core/song.cpp +++ b/src/core/song.cpp @@ -201,7 +201,7 @@ song::~song() } if( m_SncVSTplug != NULL ) { - delete m_SncVSTplug; + free( m_SncVSTplug ); m_SncVSTplug = NULL; } } From 3f26fdfbf1bc85b47067bb48a7d2e772817f76cf Mon Sep 17 00:00:00 2001 From: Lukas W Date: Sat, 25 Jan 2014 14:42:03 +0100 Subject: [PATCH 07/80] Update AUTHORS: Add Lukas W [skip ci] Adding myself to the author list somehow feels awkward. --- AUTHORS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/AUTHORS b/AUTHORS index 086d6c3a29..8650caad18 100644 --- a/AUTHORS +++ b/AUTHORS @@ -17,6 +17,10 @@ Danny McRae Javier Serrano Polo Development + +Lukas Wohlschläger + + Development Andrew Kelley From 6cda610f48a7b76f9f3ed6ec1be7cf51b58f03d8 Mon Sep 17 00:00:00 2001 From: Wong Cho Ching Date: Sat, 25 Jan 2014 22:49:41 +0800 Subject: [PATCH 08/80] Fixes build issue --- src/core/preset_preview_play_handle.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/preset_preview_play_handle.cpp b/src/core/preset_preview_play_handle.cpp index 94066ecedb..22ff31a50d 100644 --- a/src/core/preset_preview_play_handle.cpp +++ b/src/core/preset_preview_play_handle.cpp @@ -105,7 +105,7 @@ private: notePlayHandle * m_previewNote; QMutex m_dataMutex; - friend presetPreviewPlayHandle; + friend class presetPreviewPlayHandle; } ; From 485d4fc595e0b4c3ebb1b9923e17514cde64d8f6 Mon Sep 17 00:00:00 2001 From: Vesa Date: Fri, 24 Jan 2014 13:37:08 +0200 Subject: [PATCH 09/80] New Zyn plugin artwork --- plugins/zynaddsubfx/artwork.png | Bin 30406 -> 86217 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/plugins/zynaddsubfx/artwork.png b/plugins/zynaddsubfx/artwork.png index 7d158bdaa71b4f69f9e3bb49af174cce80e6fd46..2ef0b570560876c9cb0469cd13fc8f52d9f9245c 100644 GIT binary patch literal 86217 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 literal 30406 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 From 84926cae4cf58f800d87e68f304481a6a5fd9464 Mon Sep 17 00:00:00 2001 From: Vesa Date: Sat, 25 Jan 2014 03:47:42 +0200 Subject: [PATCH 10/80] Oscilloscope, tripleosc gfx fix --- data/themes/default/output_graph.png | Bin 3684 -> 4790 bytes data/themes/default/style.css | 5 +++++ plugins/triple_oscillator/artwork.png | Bin 46685 -> 47649 bytes src/gui/widgets/visualization_widget.cpp | 2 +- 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/data/themes/default/output_graph.png b/data/themes/default/output_graph.png index b1405a63b566f8e593a7c7514fc8a5966a2b1040..46ec86d44784ec8e0d732837ca8489010afd74cb 100644 GIT binary patch literal 4790 zcmeH~_dgZ>7soGkt&EGi7x%hk@5yf|9BfE7006*YXrN;eP;&H>Dgt#!}pT)ZGoFgF*NhYP~X1?2@n zct8+d5R?b>Uj}nS&jjItL3!X{9yo*teg-gJB$O8k1H++U1Pp?NfRRuz5(Y)XcoA@3 zBpi%@Ly%`eKu}018V*Gxpy)F|!LSGz774?i0UCzIz%g(*1_8$);TRMg3x{J7a4Zsz zMZqy>1QrcHYv98o`B6xIG?E{KEz^f;D4Rr zm46NCtcaxO+Ec9jJt!eAH{Ai|E?#~VNmE^G{#$aAmn3Cm^mnzcoV9Zp>S$Wq>-X8G z-THhvZ{D|F-r?*TqAB0L_EvS|l*?rkuK>_hb4 zWJ(Yd^AF~?xc;PXoi4u$>L2^zzQ6wO%|w0Lb*I1KhxD zV!V7eZb7Dc4Pj=RV5>(5wX|25S z+}s~UC?yX9uj{pjlnbIBaZALkr}jldv7}Z5D1xntC#%s8F(EP*qraXm})2$EF{?#=$DyX>+F61p=L7tXrYMKOILE+p)JCEd-sdG8!hV| z`{xYlbXYMxu>ihuZ?h?UbtpLFoiOz`A=b4$^f7)F=__R?R$_6V9BVafME0%~`{rH0 z5B>2yvUBq|Q2h|M%IWCf^Zm5sL6@D;)2`y+nl7GZVrEcbc0*~s;?)(eygmc_jctGS z-1n(1DnOF3T1Gw_M_u21Zk1n}ZFqB$eD1+*c&zS_^ARX^XyR5)&Mvk4eb=y8Sz3)x z-Bp1O>z*kz$7GHWaJFcojUCucUJXd*q@~J?Dqmy_D6@7sn08`$BdwA;DVpPB@eh17 zut10}8oif{shbV;YV_`~&710My82d8%-UomZG3q~#iXSTwzR``A<>B>|-%n%@1||5ms9Q{P90ko6G|iOQ9a-jQ=e_8oPT_00mu+lpJId>0 zYbD&{1ieg&f2^{^;cSxmfwf*GRfbs;cZ;T!`#UQ~934j_kSr-jZ@sbqTuCjM=ac*$ zxcUH;un-J0pAX5FVUy@`@D>ShXU6a$x}O+j@_JYlCfe>SWo!XZl}Yzw+?nT~hASla*L@g7M0Ea|bfY2nc<{ zp55UwWwh2A=(-*Ci5ZnJeB=fjURSdXT*-pCirKhb)-y6x27yvI zJQMi+qensaT=q`9){ndfNUz3q2{W40ShvfQVUI=%^#cdy$SWPu{|JK71|Az6Y)v!i z>h50s8m7kI&@aX08%Z`cn`zdKKH(oCwwdzj7G5f|fg4A(=^gofY!u^Te)8(@zNSb! zZ1QOqa{Q{T#ehy%ye#dwXz3U)=9=gaB|(4rnG$Vt;FpueUtBYI_VMiwAWms-TJ^?$ zP`dYOtNz&b=I)ZdviC|l|B`elP$DC3a!PqzR6xwhlYxG%aUw4#gV=Rfz;U!iJ5&3E zEdhqtR}>3#7x$>3{Akgk2CgwFY?^aLC}YfMSH!`u8E!>8wVWn}&5tzsXptZ76kcV4 zy783jW)l`!OG++isnOUw$huGw2aTor?ol}4dRSvc&EwkuC5B^Z%)6OTbPTQet84y^ zZM}ltS~?e%9<^!>h^Ym7uq>`Kt{1I9OcD`S{S4VfUV?-}|Nzg?jgWZNddT9LS~(Or~b2+iP6C-pR8!8SLA%nlLDn;>uBA znN>v!Lg*W@cK8kd78QhyIzb_EPnJ94GA;u~oR1O%w@p@xAKrWMHt;wc8B@5pw#!!y zsycy}{;;Aua*2H?)635J`GQTfN7#j;%g8HqE$hTax|nVUQ5Q!nNAV2g1Se z^NS1Bv&`!uW=+Alrg~?BRn@c_+Z|oydoWWzx^A`loXRyzHe?66cIQno9u=@3B-I^R_QMkLfx+j5huriot_xC-{)v6+RU zk7_P?9-I%vsHjDMi7}HVfo8Q)t`sZYqFHYha3jlTvu~N35 zdbL#cru!F$nd38~uqQjefsXMj`=+W23Z^xQz>peZA+z5J!~MFCO5M4nj`5Edhy&cT zUml%>?qHyla7s1BbSLhGKuY+?509WX5>KrIJ%tH0SGy~iBDI%B(WBd&alu-B7f0o1 znak5KBq>sRcU@kmTw5kjp70f*<#nyghWNaRm(}e=&G+Zumkf&W5P>L9Uecv*aE^`cDqgFQSeo~Ik$;-o zgsbuzklq>U0*j{u>U%ax#8)3U>QR|9Edm!dJ1m}>-H3RN>KLnVs*j?U&VCEh>)&+? zkjs@9voJC+VV#(;e2uu@C?Iiu?1cdwcN$O9Xq_BlQu%&q4#^8H2b%Jf+C{U3USmKw zt6GDd8F*vfuP2qoUdH}#E@;wB{r*uR3(t~TLLwVQPpZl53BEPv!C#<|KqgL({P(kLL5O14<-Xmf= z3`7Gf0-9|4!MdD6jEdU>Nr?2KB(!>rkIdCbChvtVZDYUEZ$U-<=ywa}Qjx6OGG?%8 z>*90q3Lw^d#=H}-q=Y+&mZZn>f(90bHbrIPR|V_$?Z72cnN{aGMW%EYKC#te=Qxut zt#Xa%+{sQ{j;WqCBI&08I-Dw%&~}Et2G!%Km{_Djtj9=!7wFfDI$^0OYwR+0?V_So zw2jlxbx~N4_{}!)m1QEP!8|DH2U7SX$S5-Ixw9uB9SC3W8sPV`HcilhYbaliKG+V_m0JVV|{uAk}RR z;TLkIvZhy%DfXKH`5$nD3X;f#ZtL><1wWbKU6MB!fwTRAey_7ndwtaQyD{{ zlG;xZ;s69=8#rOFrRR+B0sB+5ZT2T6C^`0Fc|CcdWpn+n$@VYA<%hLgI!Ajo?>;gkd7xSWMmlc)`@#Rx)2dy zWLP=Gb8fE~`wruQu04pBPt>;BliJKE3ma15P04m;?$qi-%Nnh$C@fzb@kOtBm_pw* z{41EanJt>Q5KA!MR{aPjTXOAw%yYTzNehW;5XeQU{FN6mxKOE?f{Kr0-Kl^pt(Iw( zb5^@OX?E%kz`istqB*lPW3S}-^(^b;I4W|6?GPqwMPl^zWnsI08n)xQFK}G}dnF@8 z*ck5B>YOY4`YY(KqmNS2Zj5;nrw}rivv{CY)V>M!1&!W&{VYM`QgGj^4b70(m$CKk zxvzFF;iNpI?nM4|T|GKDoVlz`Z}^mafoQSoT_5k#yts?nasJcg8{A?tC%>=c{GcD> zuzQWRrX8|3KGVeUmO+2`i$Yqq``(~$nl@GX*S}+VzT2*vGnU8n`sS^#-7ufwkbEX> zf62LDO1j9xMC=leGtRgRhi!1^w$cwTV)PMm^ z#OSI)VgyAEL=s8JuuIl%}@M)?%_ul8Z&r`jlsBAAovNf6N?%OpzU8m1I z=iH|{eD7HYg45ec+GelMLIC>GbH`6(aZu2I^ls`lF2csi@9or;d2I#;HZ9K@wgd%YY_k8`IR(|2W5%>QPrlD z#Yw*`{7RmrTgA|;)Ejx;FAD$N@3qQbUwqyHdgR{w7u$;{ifZ0)4(n_CCInxlC%Lw7 zZ36h@A>mp9zR`FLz;||bxJK|5qmc)3mBjIo;NutKzs-_lPz?1Uc6pX=4Tk0cSG#$> z)$dnYs_V^OZ)-5{PhhWA{_*FReTIH*vArEe5iyj{Kp6^t5_omJzHi@THWSJUPlcg4 zTZ`vuhFU=HxcAHR`NC^?H2AvmQHZj>wmzOrEc2)&43z^;Gql0byB>Nt3_=AIti%tU zGU+FudR?m;*qtdaSNKrXS-st*Vvclw^zSP4j`sZa{PFKPKo8%2bT(h;b2x$a`ub!x z57B)PEX^Ii5^$r{eR$sS!h` z6JJ%q#}bh!2s8>vgDXD?J~Vhy+8{umO`0%6Ye(!n&G2b^46S=vrVJH8-)0QG?VkIV zJj=6Iq{{l%v&@AOey|WrKr{jZGPb#jKc)Yu2WOh60XE zO2P7^G*Sjr%O^=+jLTNKX^OY20{T|zqhNRM#Rt@ zib!OiqCJ2ZD?_PN$L$X1&`N|=0#NBiqS|Vx`ZxX#E)THp$|lEb^q~8JrRWl8W&7LjUUGom@P#iYP|*q>^}gZN-#8x3fGVy2OPnj{9X9G;%00ROyM=u?($FF&_oOjl7Gb zY$r$1QW#oV!cq|=KvwZz=MT?4;{d(pvp2)Rn}9AclsGGq$Z9~4#KzN=fHEo7Rz&f` zk*M^?$~s~gdU(cW?(-Cscv+;nD_kG`O9x! zaDX2A{2eE{yuHJNJ$ZM{&0ZN<<>x9tsn)gU`8xXxqx}fr7`-&VFIoI4ux5)|7!j7V zo)MYHw2#8bQc}A=u(yFos%}4e;+qc8D-PWNee|CO*Vxld%j1_Si0HN3$idmujW6-Y z=+8yCk;z@st6;{VeW3Id4SjXc7xgqblr?mvifJ1>1Rn>&Pz$Q?QLttlL-3JAzyp*S z+K`Tyf9(bPYi~J>25$h`>5NzeET*K7BM$bOrP6lCD5eRkJf|BGFlDMw>zc7ZiD`lv32IbAZQORK2R!bj!$9;s8uN+BR7_dd_^+V5RXopuS3 zs`&g@>fljCElv9<+U#}V;B?<&y3x&HIHAKcMCvHmrj()RA?2)Wzy0~o9H3X;c1Y*anZw$=I^dR48Kxfodi3(aWKMJ;q`ch$(rKI|G`YqV;(|v&qdHTKsU+%W}MD zz$Anvm$#Kb0ZmilEI*W&0xinX$OWmo{>2ZxN$C?;U0W_OG)}xq&0I?g*Uo`aOdEh| zdkn|j+LF|yPUAj-q)vAE$_=J6x!2aaR_G?Ug`c`=3GWOfw;CaQM5_+j(*uhX zXfIA@XGHKZH7;+lf~SKK!cAE`?q<22i;PwEy4{t|MZ(R9_nR9Vc!yDBd!7`ti>$&p z8fb}+<;WgDosU6t$Q6YW$)soo`(Hl&LkH+3*WXY!V^cck!jr zktRbknSzv|d6S`X46h_<*r(5J$dO1n%M8`Ih@QYH`5KDb70v15>7A0>-`@vR69%|_#i+7@oX&=E6K-3j@6iGt5O^&JQ31y^3T>mYx^8optxU~I>2 zXH@Fuwif7G)Y4Nr*RO6!H^yVd(i%~tXrhy18JLG=X7V9ahw{^tw;elrrvvn(7hYU6 zbHDHM0wA%kw44njkZ1g*n#wGiFlYP5UJU-2g0?UPDT+v)EB16BP14Y^Y(S^l`=O!M!Q}^@UQQ>Gsn9b}a9&*3 zupgQVKa!)6a3*w_Jy1Z?xHF#4e3m|W>>&r}M-E=FG@0@OYC}UY&xm5`*L9HBn2)Lk zlre>&>ioUDyTvP;`kjdlX6Wixl3eO+wf1lHhD8~k&+isC4o#b`3NqROU} zWnql*OZnzfTwPTF2N1DcPQS>>HjbU2?^6DK>$9x|(7vC{;fCE$>OC`nAu{ zj8@}KlA_-pS5~)@r1S(}E_Ip?XP0ln*X7jNiZnG*>V&6ziW{b#csif?(^JyvOy_g| zzd!cieGbsG&pSA5zB%ZKzaq_7BJ)09S5bH3%0S&ojzPv$KdN{N;%n}1<$u*{?>ZC# z!~MMtWED-FU?tB*qgG3gqPd71oFSKuf<0oBMHE|RTHZNSn#AMD)Mx0oAAQ6#rHd~+ z!P9qnTw8~?3RwG+8n~e}@U47x6Z(HJ_sAQD3^`RcTZV}~D{UgsMi1R|73#>ZkXj@? zK<~NrCI{#T51iK@HruD0+lsQUE7$o{MvaDAxN5tOsl(_>S2lO847lZ6*2Ga^#WeIJ zQ|flXN2{@P3~~tg*oxc-0ftW4l(d8xuM8Eq6L1!)>H+%r!@en9@X28_*wczM1$!4u zJ?%3*h58szx2$Bv9Qq<~DzB&0TBj^?MBzJHEuD)ZLq%?Ig!bvwz{y~VVhW21bj(Fb zJe|#L!_zMmbGBG$I>oND-kvSye#<|6_Ynu^ndcsmbtCu1f^N6p3^&MYTZ3WXwYu_A z7y8t}->U2BIE$9`AX)1)iWx@Mrn>NSK}tB=%kuGb;&T>r5%?H+vj7-6Wt$4@m8T@` z0CXSFM<4J^>70WX4VtlO$&2OdFl88qKbhQ(eKXMLGns-UhvFc}6e*_VECHIP!beT7X`Cpa;#qMg zp3UbbUV4y>84N%GHaqcG!!vytOT^Y z`#S4K{#DQ*xaIn*9iZ>~(1&Fl)Gv$qpTAaCeXaaWR^GL_DJ~ziBH@~Gd2V;XsKHR{ z^32e%#Wp3wC`3R^OH>te5%|a|VZet7%op2%4N!pS!MnW0kuwjRzsJ8H{NJyB`mMT| zcZ5uB2IBwQX0OjqEdC2M>I1D=r9k%p0000!PkyF+oOXmKyap?vxMXTHh4 z?99&Y?B?x#=iYnHNtCLxEIKMNDgXdL|0pM=4%@b=%Q zpsO?mb_B&yPS*thz!>;%z>PSRnZphuyM9!XM&5)Y#6Y3p#kar!04M<;rNlKo*Uq}U z8ow;-Qan80i5y}$lvQXK+2mO+Qhv%zPJ&K+wKJ(>#UhbQX>^MHm5A7ievBuPHKtgo z+h@KSgjfhS!pS)dnV}~mnS-z>YksZLEg{zYRN+)73mJl) z@$pcN&Eg#!qb10~XFQcXI@0l+{= zF@;7+7_W73cz7b9F*7MKa0$M@33GOBlLmmqGXi|yPV3&^zhQ8JuqbPGWxTxRjQJ$z zDP%>77Ch6jQ@p00WJTY%3T~wdrGjux>dFO!;nCp53BOrLZb+qmWeuj%$(kO;?%Dwu zPl16}*p8G{Qp;dkb!-t@_ajvot5hl|9s0fI;IM6x)^2L@=i#?Pq;dt1xVgeQsIu|K z3(iIE+O-Vr4@B`Jsc$q%DNtHxyOM@RP3d4t6Ddv1hK1QE6JSBgTY$Cwj2nPq--*v=NB>Q2{5IYEl8Yc-7xaN<+65aL*nE9 zQnDT8cf=lhWQ8K%+^_vNT|H6-iESFYJ|~_22b%+

2vaHIHA6)$LfUKG4zQ~9 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ġn0|q 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�LEUKpJVuU81i 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 by8JX~hL{qBb6oub1ASy96vS&q4TJv=<=WM- diff --git a/src/gui/widgets/visualization_widget.cpp b/src/gui/widgets/visualization_widget.cpp index 7dee75d33c..2f6eebe95d 100644 --- a/src/gui/widgets/visualization_widget.cpp +++ b/src/gui/widgets/visualization_widget.cpp @@ -141,7 +141,7 @@ void visualizationWidget::paintEvent( QPaintEvent * ) // and set color according to that... if( max_level * master_output < 0.9 ) { - p.setPen( QColor( 128, 224, 128 ) ); + p.setPen( QColor( 71, 253, 133 ) ); } else if( max_level * master_output < 1.0 ) { From 8a508eff27bb7de16da02be2832e06478c96b29d Mon Sep 17 00:00:00 2001 From: Vesa Date: Sat, 25 Jan 2014 17:38:56 +0200 Subject: [PATCH 11/80] Graphics tweaks here and there. Lots of palette adjustments, rest of the most important icons done. CPULoad widget fix to allow transparent background without glitching. --- data/themes/default/add.png | Bin 907 -> 900 bytes data/themes/default/apply.png | Bin 736 -> 787 bytes data/themes/default/arp_down.png | Bin 604 -> 575 bytes data/themes/default/arp_up.png | Bin 581 -> 615 bytes data/themes/default/arp_up_and_down.png | Bin 569 -> 586 bytes data/themes/default/autoscroll_off.png | Bin 623 -> 599 bytes data/themes/default/autoscroll_on.png | Bin 610 -> 604 bytes data/themes/default/back_to_start.png | Bin 687 -> 296 bytes data/themes/default/back_to_zero.png | Bin 476 -> 318 bytes data/themes/default/chord.png | Bin 1044 -> 1021 bytes data/themes/default/combobox_bg.png | Bin 101 -> 369 bytes data/themes/default/cpuload_bg.png | Bin 160 -> 840 bytes data/themes/default/cpuload_leds.png | Bin 135 -> 947 bytes data/themes/default/dont_know.png | Bin 717 -> 700 bytes data/themes/default/edit_select.png | Bin 842 -> 808 bytes data/themes/default/exp_wave_active.png | Bin 546 -> 565 bytes data/themes/default/home.png | Bin 1132 -> 1312 bytes data/themes/default/keep_stop_position.png | Bin 410 -> 299 bytes data/themes/default/lfo_d100_active.png | Bin 706 -> 708 bytes data/themes/default/lfo_x100_active.png | Bin 770 -> 772 bytes data/themes/default/lfo_x1_active.png | Bin 668 -> 665 bytes data/themes/default/moog_saw_wave_active.png | Bin 539 -> 555 bytes data/themes/default/note.png | Bin 974 -> 979 bytes data/themes/default/note_double_whole.png | Bin 1219 -> 1253 bytes data/themes/default/note_eighth.png | Bin 974 -> 979 bytes data/themes/default/note_half.png | Bin 556 -> 571 bytes data/themes/default/note_quarter.png | Bin 547 -> 551 bytes data/themes/default/note_sixteenth.png | Bin 1110 -> 1112 bytes data/themes/default/note_thirtysecond.png | Bin 1191 -> 1194 bytes data/themes/default/note_tripleteighth.png | Bin 1088 -> 1105 bytes data/themes/default/note_triplethalf.png | Bin 1069 -> 1107 bytes data/themes/default/note_tripletquarter.png | Bin 726 -> 717 bytes data/themes/default/note_tripletsixteenth.png | Bin 1291 -> 1302 bytes .../default/note_tripletthirtysecond.png | Bin 1453 -> 1476 bytes data/themes/default/note_whole.png | Bin 709 -> 728 bytes data/themes/default/plugins.png | Bin 2215 -> 2110 bytes data/themes/default/preset_file.png | Bin 1482 -> 2127 bytes data/themes/default/project_file.png | Bin 1558 -> 2132 bytes .../default/round_square_wave_active.png | Bin 551 -> 552 bytes data/themes/default/sample_file.png | Bin 1572 -> 1243 bytes data/themes/default/saw_wave_active.png | Bin 518 -> 541 bytes data/themes/default/scale.png | Bin 1056 -> 1059 bytes data/themes/default/sin_wave_active.png | Bin 544 -> 576 bytes data/themes/default/square_wave_active.png | Bin 505 -> 531 bytes data/themes/default/style.css | 6 +++++- data/themes/default/trackop.png | Bin 746 -> 951 bytes data/themes/default/trackop_c.png | Bin 787 -> 988 bytes data/themes/default/trackop_h.png | Bin 746 -> 966 bytes data/themes/default/triangle_wave_active.png | Bin 537 -> 535 bytes data/themes/default/usr_wave_active.png | Bin 518 -> 474 bytes .../default/white_noise_wave_active.png | Bin 502 -> 533 bytes src/gui/widgets/cpuload_widget.cpp | 4 +++- 52 files changed, 8 insertions(+), 2 deletions(-) diff --git a/data/themes/default/add.png b/data/themes/default/add.png index e029787c716868c498d99a78a967575568a28f96..f79fdfdba28505255360397b62b26d5d5972671a 100644 GIT binary patch delta 857 zcmV-f1E&0o2ZRTZBo78+OGiWi000000Qp0^e~~d5e+P6)O+^RZ0T~V)2Jss+H~;_x z5lKWrR5;76luKxwRTRg6_wmh4rfHr{Oc86Pg~TET8oDW>4K5V1U_m#!vf{!`*TqfU zxDuBlxG#mQd~SRt2&Icud{rc3B~eKyNt>9*%s1b6?>)!GL{~NmP0!}6&hPxs)2J#t z*{M%ne|`4p2PfXYvhev)=g21pM`tGn$1YwRd+pjzah_eQ+t;sL8h^cSy#F|YbP4+8 zQgQo3;31&ATb$huJioEn_f6wF>_C8lHY2q`W|prH194x9RW0jbi-l$bfF3=>Lh}}Y z>alWda~o6-{>ke_#xYvEfHPerI;7=f~A~tW~VF+g|Ce)d?w*hk!9cTLM+r z#pp*bsdI{R4(Gr*c(nIn&K^Fqx)ko5^*7fR-+lA+%RNB@OZgqZBDPbi8o?MtNlBgx ze*j7;d1Le(&KR8WIAd|fQukFXa67IJeA<|P%U}NKixZCzALXxdiG}78##yii<2uTX z5t30#DKN$`bNgE|V^Fo!Y=!=;m$hb#xm$~Du5a60|tD^K_`27X;#q-|RiA);b1 z&SFJzu9EaBRYNU&l}H;KX9Bu z*N3+ioHtan4g{+t6ZvxaDy1zsbLbRSEmbNU=^o-peF#;9s^XmROY?U`WZDB4zHj_? z?B|vFQI~nJX1f)g0oE#>XO5jDxq@1jQG|l8|F}W4`F}(149{Vlpf1gM?=N`0e>8Iw z7`xm49C+_}ZN&oX9WG1cT9T(0%ddQ9_Oi!29!N9f7}KeuE#;n0dJka3R@ov-=U3#Z zb$@p@_{oErcJLj=D+Gz|x9$KvPhXHm)9KDVOdC;v7?ifi=M}X1&GWOn)fs_(0Bu-eYOOXQZH|}DD#(4;3 zi4ikFqksL3mB*{>Hd}mt_Cp%+_FFp5QvTU_fRizuECvTs3AF3Q;kyQpQHDST1hQ)p zlGv0-&By#*|C!yWO()5iF-NJ$I7pBXX6(Tc`=cZT`N^sDS?uHHPHHk_KSWEm}MW0e>?1>JSre1tw?-C+^rvc zS{MEIxW9_L+F84pKr2Dw;^GZp5O9&-Ub;tSa}bc&=y3iD>nzQrg(5;pfyi53usxhl z=xs@-iHqB`;)GD-hY`j1dMX@ZQd_p0Z8mnE;nR>(R%T&gK@I?(wDVJw%~O>S?>)+E zX3P;nTVAhLt9}6R$6mYavxmF!YT{Cal#wA=9<}2iEiEne1^*AAhHk=0ThQhJ0000< KMNUMnLSTZyFR2g! diff --git a/data/themes/default/apply.png b/data/themes/default/apply.png index f547bf179a3072051a52539b089ba1436de79c7a..1ae48682ea8566dd6854517ffb39e7cc82f44c4b 100644 GIT binary patch delta 774 zcmV+h1Nr>m1(ODl8Gi-<006|aY&!q|00v@9M??Ss00000`9r&Z00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-vi84er}1C`Rf*oRBWS=vkktrQbKr!I&XNMhXt1rpIs+0Or*t`sxvBD?Uy=j!G8zwZzJye|*1tDP-Rp5eU-zEV1~AUDuj!*~~glf`T>#`(MHZ1*I0Yo4oo57?0L18BNt!lNES}oM) zYhP7W?k{s1EufW3Feb`9pPFW2M}s{8fMTb@ZnXt!J%8DDotO!h<-o;x@QPXZ`v%EO z=!ZvqJoNexaDH>ey}TSF6$#70B_yO6)L_!7qHvng#Of3SwvznG%Em0GoEX6J0@wrx zH4{N!|A-h0d_O^+4)v}7+!}Z>BRNOL@CVh53LGJb3IvRif?g*-ED)xxq|t04&>z7P&L_`rXB_PTqg!vVagaC(z zhA_ZMQ#0&2u6yYIR>wnaG!o-q9?pqOrOm9eFMpVMEGrUVRRo|ZWa(%K&zGf7)3Hmu zfB5d-PMzA!6oRvzi$ve(ve23AUNr<7aHv!e9?T;Yh_uIh-`(0)6fkuK6XjiX($OiO zly|vQQr5UT{!7L@kve4BYWKLcxiF!uI(Tz8b$6D20o?!h-f;x8rvLx|07*qoM6N<$ Ef_BJaH~;_u delta 723 zcmV;^0xbQL2H*vd8Gi!+008r9oCyE`00VPENmK|32;1RL-~a#tl2A-kMgRZ*|Nnph zKmY(U004jh09610O#lF0002n<09*h7TmS%800dP815yJ6Py+=`1qf0I2TcbCMg|5& z1|)YR21Eu6X$uo)6B1|=5Ni+yT?PkO2MSdR2xtfiO9>2Y41Wqp3JgRG5l0Lkavl$P z4Ig(O9eN!bdm0yh77~6C9&H{Ac?nRUP7;F=8mL}AYyVt=?qW3)wOs7Yn3PGzuDW|ui;nmuQS!N$wg*4*FU;pFG(?e6aO_xk(${Qds^{{DU9 z;8_3w0DrbgL_t&-(_>(uAK*~Y;ldPU*KBIlHUL8~Bh5+0xj+B_002ovPDHLk FV1g+8GEV>i diff --git a/data/themes/default/arp_down.png b/data/themes/default/arp_down.png index b0ce4a5cc110e4dfc2cf1c6e352e8bf76c056d95..85586f7dae1700692dcc04e0dcc760008e156576 100644 GIT binary patch delta 561 zcmV-10?z&11iu838Gi-<001BJ|6u?C00v@9M??Ss00000`9r&Z00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-vi84es4?5rbP0005ZNkl;9c2#=TbgncS;fhg+C}ZgK}d>|la#9iH90x#fpQ_Vi+>!P&`RMXr5rX&Y3z_O z?C?A@^L*#|{lnoY#o9lBcfD_)*XQ%;{f2*DV(XQYmrm67oPA|A@U<9~ix>A4&9BWPlT9?)%X7Ac#}H6Tt)fqQza zyaAQ^*fKx`F8#=bAO=5XWRS;dx5pW-d}V4r)_%qLw0{W;4fE5ka&KdK{gi=*Lx}Pm zEYF4@rkWHmzjrQh;NER+EhYfkie8?4c=>jxv13bRY?B-N!gTsrp2840lpnlc=Faio zYFxG8tNYc#k!^+7{ibXtR?6sFn4Xh=j>*5mvy*~T4@>uhH?n9(sa9Phn4Xi|m|1af z^$#xZ6)JqOtH-wQ>ny6zwSLZ9Y975F^Z)55z(URWuuZb200000NkvXXu0mjfA@&Bu delta 590 zcmXAlZAeoA6o%imyQ%4jZJAy}9IolqHBb{2F_}!or4rLz3|*Riu*5N97}RiL{xDGx zQwrUWTve1f7)R#7 zztK*FD=rpphl|QlrDj|+88&4PTT{mz%zgXW`S3L2UrA_03Qo0 zfFJk*tO4u52Jj8|0R(_Qz%H1NB8XWI+s=;g#zcRL=FY|P=HqxC9{&ZOd`FTWNb)0@ zIFp!kGf7|;B#$NwCxqfzaoYPd>04>GX(2mjDkpCyuVA>KaH3G=l*wM_m)J`b;|hga zp>!#0#%ffLRjMhKno`%=G<6T_G!Bi{sntvU_+LQfyn7Yc6N>FZ3R*}&=U+1V;0eWKW=A$Xl1A+)=->xL@N84DbU9hebZd PaQL~h;!3%#sJ{I#@@>@@ diff --git a/data/themes/default/arp_up.png b/data/themes/default/arp_up.png index 78e7ad37fb7a2f6a2b51a18384c5367f71086f55..07a4ecc7e4a1af2746fbd521ee0d750ede941ca7 100644 GIT binary patch delta 564 zcmV-40?Yly1m^^hBo78+OGiWi000000Qp0^e~~~Qf8GHZ4jdVL6F$uV00Hz#L_t(I z%gvKbYZFlvhTr><%wz~jtAiy?YiKJt#LrSih1OzMiYU4fgwjfluB3D&B6Oi3NS4Kg zxDs6W19Ty{5L76LP$OAfltkN7LNTT!P3)MNxyMC76si%r@!6i2m*;Re%yArS1&%H9 z#{xB{e{kf^W!A1h*tWgtpqv_Fx%|TRGgB8EZx7R>=vca@hMtiAlSK%Ql7S5O%RXRb(UW}tFTrUS1l!h=$URQ8bTWIvF)p`dPl{+VZ+ zT|s4fpH2>poh(sJ6dJ22Pz9!G!Zq>Qx&ChCfA0pDlG7LZhfiw>;hP+Y89>Z{YcbeX zd|2H*F#Bu%Hv=`E=o?AyEgtPoV}+_%H0oHUDwcQ+kR0F)Hex6*Ef1n++j}STN^<~E zS9dZ1NX5H~r**4X4Jx_8k;d70;^wBUhHUvSe zYcS7)qySO}5S|G^5}^$V-t^h1)tO}f8t*gxD?b3@-@Pu|4%BV{0000q zbfZNw16nPdY39y3_nsD-t1QV)&-y(-9^S(%j4?P)B#xOw0nQVbo{x%uZ}0))_4@Lu z%P+3@+DvT-PnF_B9u43$g;_LSTol{yHrBJ<-e!!sG=+xvE5I^g=8fkAejC^0sU5H~ zttOt8k1bO%o_{k0AAdfW7r*-jmicDt+|>1|ud28aBlaCX-BaC%~B z;zp)3DW}cL#+u3&wMjo2xfhQU6hwsZZhL z9?;fppkx1W0l>+k~e1j+=E8Gi-<001BJ|6u?C00v@9M??Ss00000`9r&Z00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-vi84esA40*~z0005kNklt8=aL(a9u!#~kNA1bS1P;H;dT9l3mX{<|YQqeD9aI-wvQgJcAP z5SfbY4?k2c0=L#rP;MT0a_Z{cRkx+J*1i__LI~fCD4$f+7rPR^kxBWXWd^xy|26)V z#G2W0=lH>yp-V3-ttI)jQNs!9lu`}mdtDZKyq|ZF0)Lzpa#htS?Yj|Qx5ARwd^PrT zYBFghq?A%ggaT9;bQJB5qS02=T_q7_sq9?oK4QM8f!TAW94ib?9F4XN5ov>H`ry0Z z1^|Sg>Ti(ZcGn7j@pZ6E*zO?uQq2%WG0g8#GQn65D>JkBbZTv7Ws&oNrnFmwo{6NvOzwsZ9(30000< KMNUMnLSTZ-kp4md delta 555 zcmX@bvXf1dJq!#Jn7RA;K->uo3@r@& zQ~4PhKn#W*3=F#%7&^cR$N-`~2CWNfdY9BzUR}B7#u|{8CkzZP7#LnLFuY-4_`|^P zkAd+&BlCY|>D$t>w`FZk*(B{rsyR?oKjqAnc~|BwxVC`l0Ta^`rq1J?49gf8R)Gx# zy5Im1u`(QCU^vIXaEXE83IoF}28MeK438KXo`Fq&$H4G`fnyI3&nf}l*}Qyn`1n@v zNnVwdye=tqN=oXCl-w*i`MvTAQxp_-DJU&dQd*;=wm?mNp_cVYYoH?>>km6R9dYv5 z<>9f%!)Jq!&laEL-N`9?QnHriWbMexUY?V^GrMqWVbPAF+Jm)qhwA?S|9^`+F&7wU z+9g4L!3>OyEW#p^k|yQ}Nd?6_cbz%=?fds1KYso~0l)wJ`}gnagS|liFfb;0ySu~} zUkua*awd4zyEukOTux4CV7OLb#wPOM?Yo9U+xfp;+2;6&+m*fQ#Vg4JKmSAt{yXQU zcC6`4f}Zg7sGJq+7tdVU%Elkj;OrCX8tEArh?_U0HWX%$~(%aJZ!NILpqL(ozaDlf@q`O;%}6+SI>VcU7p)#5XtY b0z-R4uP`Hz*P2g2*D-jy`njxgN@xNAebw6y diff --git a/data/themes/default/autoscroll_off.png b/data/themes/default/autoscroll_off.png index c0a4f37c84bec44cf6a1a61d18dcb3cbab5c3972..a2d56e672db983c3b89cccaec32ed4a8cf4e013a 100644 GIT binary patch delta 499 zcmVB%z4TfCiU@AZMHzXPoo4Nx3pwF76^a@WA1mhu{00^KuR& zBHZNQH%j}zfR5ulImO3LZHjH%p8;GMW1bC%L;slX$>lZ zF&9MiEe9l`Q5?s&<2Yv5yL&DDtxBaL7K_Cu2!gNE>1^~8z#AgEI@o2#*j)fm0pw`_ z8jZ$F&Uqz@qED{tzW)vTo--2BNoqEmU#ivWM*uGX+&Sixxe7-{9LKLb&*K0ti0H>L p-^p*8F;)hU5Yf*+`u_PJ`xnC@3Xo*WPE-H@002ovPDHLkV1lg+^34DM delta 524 zcmV+n0`vXX1n&fpZh!1aL_t(Ijop;bs}fNZ$G_*!)tqr`X5lU?kb3CoE`&Dif_^~I z|I%L)1VKEgMZ34CMVnp_wUEG_l?Z|h-KgU*x^Nsv=XzQxhWa#c)fc{;&6f}7o^v_G z%s8dQNooHABqBN~uv99&DVNK4P6h<-Q5RlNh$B@x(?Gc zVVWk=>GZl9h5=pIp=lasvl*(@su~OilQ@o_G@H#IJ7*|_Kq{45Ti12yx(>rIV45Z@ z%YtDTNG6l0RDUX3Hk-AC5a09p{OuJ(ZUUv0NF)-FQbI}zP17KR01-hcg~?=sIF1p9 zA=>RWT-RN?u6yBm-Wh<-7I0I{45btniv_0BDdzJzm>F>#qtof2)oQ8XaQNQyyh{LI zcXhaoq9`5?hfCl0*PX2@5s6$bCxam1ZnwJ}3RN+y$0}X)yOU%4YVxl9)QP(a_c7_5)oZv=ICJV|2eS7>JOn}=9A zF+Kr7277^iT&Q0=<$BG}`su;Ts71M=s@JCjgMGpA`6atpBgs;Hmf|Z3KBV|8!H0zE z;X0vSqy1!^*DFt>#<;45o>$d;2y{Qu>lx{h1wyq#s8tBn3h7`C)r@pch8Tl8caX3+ zXV))1I-7skYJZBzX;ppyTMwrw9qX#90c_%HnH?x{ u0oV)NQPrpi_jdl!PSke{M<0OA~jdqvY5qE4LQ&PJMI5TKSBb zt@Rfs{*x|GoQ|dr5ocABtV)tqNU|z%Rv}I+gw+@yc-rfme7^mn__?&&w03dD%wBed zJ3?{Z6DBcHWq+%x2~nC5rxlWsD(QGelqLitF~{#;^4YngDNYNL&UYQbPNBnx9v^yK z=y8EV&ViuJ3z{1ZicU_u(c=4Tjg6(%lG0{@@xDTwK*9hkjWRFE+a2@^@>U0cqLWj9 zw#>J??+PpIDKH1j_Y0+_vFM~5jY@fka}GHnCy+x9cX!~%WYGGuZa?n5FRidAz`U6) z^bbY43S8?Qm@P1L7osx~8ZhG5`Po07*qoM6N<$f~phk AV*mgE diff --git a/data/themes/default/back_to_start.png b/data/themes/default/back_to_start.png index 5eb2c12bc8f5e20ca5f021a6295ee57d2a49e947..d8b8b73fed3e22574bec0102b0df665cbd7478b4 100644 GIT binary patch delta 195 zcmV;!06hP%1*ig$ZGQlzNkluBv=3d002ovPDHLkV1gotR%QSI delta 589 zcmV-T0+R*62g+!|0LI@N@ zQ7W$7xhlF5^lxzEPDI6(;;Z07MG$FmC4%5aTRCx5h=tEWamQTgRZJV9e)F=fjSCf6siVv3{(}y z7^tgY$u42Jc9L~|-5>}6nbUitgHyW`j@^ROXu+|Y?eUkoy=LmpcHUchEh76!t^k0n zyDTC*V};CpSdylyrAklk86#Ol~V2f@^t`>o{Rx% z0Om+G0Y-QRt!HR7J{=f}z5{TobN+9#3+%Rg6994~ANP2}?)|^}U_~TMve%Y37yOs# b`+xWoUxJh;4dzEp00000NkvXXu0mjfYb6r0 diff --git a/data/themes/default/back_to_zero.png b/data/themes/default/back_to_zero.png index b89c2107a338e7b73aeaf03d3e62c7b54c18c1a0..dfde88b4e588a087df4886ee1042502f3d7a2119 100644 GIT binary patch delta 217 zcmV;~04D$31HJ-~ZGQl}Nkl4CEccJ(r@49&CX1Ag(O1e6x8-RLTfFpwLymYotBL;nK9<(!=pV> zS(fR#uC0jFuCp%g6joIgEz42^XaS^0_>-_GiVMjrfXr3w6;l8FQl@F@lO)LjGyvwK z+E;XwylTiY|&EC@zYti)*2D zFBVrPhdzWa;3l}ZSseQSE`o?lCqcxvf(j;u_TIF|!BDECCbkv4aF)xtAOD5Jp@?9T z$C#-0XP{vi+P3Xi!!Yzjz+^J%mdj7h;VU1$((pS2r8NBecXTfv3qQ@_C^Nd-Pw07G|5ilaNbcPg&adVV zHnX)-l0;Bo78+OGiWi000000Qp0^e~~d5e+P6)O+^RZ0T~V)AC+*M_y7O{ zib+I4R7l6AmCK79RTRd*Td%3=?&_|7&UDX=1|voYqZy;_{0CfU2xvxerAXZP%nVs5 z1QAil!&L-#irF|K>c&KfWZ}k@M8`o!ky*rO_jFZvy>C@l-FsbR6c?rkYwq&GcYYks z_nkw8e-PN~HD6w?n%(*nwQ}{CuIm;Nn51cX#Z7{bx7V)rr)kMvfb!aXN4xF0&u5$M z#b&(;(?JA<8(eeBn@ufMyUUYS~C`wILe^qFT3SCoSmdh|^bVw3F2mv4+Y#!=8 zSf~R4cVt?&6nPgy$!STlMLmv^1kovRm9Ie&I%G`uTLVwCg}6h#4J3^b+i!{84hOV5ibPTA8% zf3;Ib8o9(T2q7K^VC{bI09coa^j2{8hn;Eqy=DOK{Pj`o^zz%SR?8{Rl#c7VUey#e zPqRtM3;fUkfJ;xeIfhS-E4iV3tjA~oG6zSHd_#NjD(N@;^DqIaq#qM$=x{ zmx}ZfE56T1wldtHUNA|P5y;Av&pAv{{qh3%fl9NWYPct002ovPDHLkV1m%W B%P{}| delta 1022 zcmVnJebcI4y6c9onfs>t6ohO%?0KnR8Hba)@V4Ptb`pBj^ z3Q@oheMCuwgfrwkXG;O3lz&Dn0u3n$A>bKDO|L-+fqytn;D=Rf zd%2pwJn}~yX_jJ4O=y}1Aq05F5wYktQOK*ZA}I?~nCx$1`ZMm?m z1~m}k>(sx z5}~Hoz&Jx83ItJrAPy0y37BC1QUC(-bCM?K$A1$KkP?iu2R%r50zaJKC^-5t`!G9L z3Xt0Ar$%JFI1c@%SeC-122}Na4{{Ek@!z50mC8ddN)fq0blRZXM3PMarvVfIt^>Hn zOa8IkmAp#7um|!JIcvYu{-xLIJ<+tAkC@b;AmntGWlslj@E3sZ{?`P~+s?&f?y=p~ z?tiMiUL9ih(g%POgS~rqdKO9 zG_q+1#uCw>mL-xjfv)KgLV$4w zKbpXsc>DY+zqJ&A|IPP}HRG8u4mVkvz@R2nMMYWO>%p{`eZQiwyjFP&|K;0aZksOv s*aYyHgv|ZvX%Q07*qoM6N<$fGU@IB009C?L_t(I%e_@w4#GeP93p?Mr|}ft|14^Z zG5FECJa#szCT)M3Ei3~wK;>fC{gKn3AO_j&tGa(7&?y%Ne@pLZS+aLK^Wn7Uc`d%W z)Np=AXK{FGWFq+J)XW|P;rb|rs16FehhHn1lTn73#>9;Lyf&SW5dP6vjf^tVoHj`w z2)Cm)Zqq6CNzXhNx#}b#ycGy6Agr@;*vztZ&0?JrvFr5p!{oAguanOzt0000MzCV_|S*E^l&Yo9;Xs0008TNklV#6OP{J!RbBTUPWSmu60>G` zdATzf3~c6wUpq@IEkU>2-Nj2g0Vl?zU9imj{8|&cs<91{&ZU%68?|SNyW{RaC<1WD zvtL9IIQa@i+5O6nN#OJT7T#qVR8q41mnxUjI8cdMCoflI(~Nq+!Hx>@E< z7h7g_3+R@6M;`t8sIA`j0P4CPa)9v;JOcbaTD+IAVrDmh1bilG-E8MG%3qJyX4mZ= z{~{>~Hh&lJA+Ts>??}4)lK7jFKHTDa2ppTRmw?|!#*@FF%&yx#wj}^0HRVw9wV8bh z+y+hq_jky>27GE}_kjJt2f(S(;M;+mZE6IF*@j zC+nlEm#PUpmBW0jl^}?s#i}Yz#6_+ZG0sUT$s@+viGV8AMNeg|mg>6Hh+-#YMV9lD zCq--?)WakDXhlB%Z#Hb>b}OB9`u(5sF||9o3f(OqdEoBa>YI-1ZTfmpMF@J+N8#RP z!ZkR$3sqff$Z8HxS3j3^P6QmJvFY7PC;ah(F$ekD8@+DRR4X3>Nz}dxpQW%PpUtMwU`CT-O6wdhi zhHoxTNEjN%_Vu2J&(@uBKE0ZGbdk_7G@Sn~3*VoE;-oPCed9bn@3jfz?>F${dF}NW z?=J^_dOD*Xh<_{ZE;l@R(ok10<=xvAPkso*6gAt(EMSVd@b)j^>30b+MO^v) zeQ^G0b>!dvX*_$l>1@j7hr-2!6T~~e`MB`>{@L;T_4UMyvwKJg!*#wnip%4clf3#O z3xS4F#w|5N3M1j{cUMGiXml~Vaf?n12_s=_#~tf@=YP-$V>`~APU#@tx!D!&O`urM z?~F0`CMAsB4)#+$=6Ab+Y04xIFlF3r$a_Ov5L3pRHF=EV#m8+TKaiui{Z`0#6JiN< zWq<9=C+lPV{<<-*HiyP2`>Vn%r>G?`W&bI&c)hK^npjF84#Tcax8mlJR!_gkf|J5o z<{i}GR)6d~vZ`_vJLVfUwM$LW*yoY6S{TAm8dJ{XI*_6_W6FiO-in=OV=4V?z{nYv z@;PtJd7zdF^FS;y=M81)6Dy|7(;e#KU7QK?G*D+jEFmV$d!^-cU}fGrZTc)Wv5XZv zEq%f*QFaTqHr)Gp*=1~?*SAEu8L?2rg<*d=r#jb}RV-*&zj(`>#JY1d za?32C2eHQ7CW;#tUG`ijiVq}OZ&X{T-o-{3r8b)PEEuJNc>x+Jj9LfGCpfHvS{m*R ztjnvV;^s(8U_x6~coU>4>PlObs0msES8R5oG%y8Av|Nc2hrH7ALM;8?SiY1E-h4va#jrG|zk>D%_5Of8Cpe~Lra}&LtOYDX#}j4_l>Xf00000 LNkvXXu0mjf=a;K< delta 118 zcmdnY-p)8dBABk`C|*ag~ymGyl)H@;~F1|BU|`82?8y{$IlQ{}ki@ z|BRp84(|dgQ}=Xn4B?1Q7Dy2};Ns=Ob?gkAtPJndH>{aCoD0`5>gn+5@i_bFGOTx% VwKO`T7!K6J;OXk;vd$@?2>{`ICD8x? diff --git a/data/themes/default/dont_know.png b/data/themes/default/dont_know.png index 21a0cab6271bbd28319ee1149331667f3e789a6d..3924a91734d13b36b2cd8a841c646d25608c4146 100644 GIT binary patch delta 629 zcmV-*0*d|31-u22Dlq^60002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G` z2i^f04jeE(p{AjcTP%MdNkl$@%}Z2a6o;Sp-f=!0O=lPtDzq$hNCjt+QAm{k zMjNSrpmxzRXj2fh2wFvp+O!BFbm5|0m}G>AmZ+r?79lvP^Lc0Hp7XYt>lD?2mzQ%m z59jM=_-#$WZ~4~@pnx3uA%KaA31YF>r4QrZS1*o_-vWB33NwF|)s>yoz0L9W7v_53 zBz{DzwOZ|Exm>PPDwVJUAR?%0dup`j?xMHWHMud@vbwU91lTMUuRa}F?##zMM^#UV zNC;3Dpnsqr6?Hd5-yU{NIV%LX0Ctqy(KL@Lw3;@K+ef?y38Y@=iy^o5{Rr)f*Khwn(6!l2_>&sP)1S`T9}7;FGG z?if6q8#U+s$KCJz`+d)Lu5eAoPpb7@6-9hOgYN2}Hb81_4c(6<*0S3}e%Rj?5i7o0 z5vk{?G&DI#I-UNXHXXnP;(y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G` z2i6E45F8Gb?CsT&TP%MuNkl$@%S%*o6vscmd&e2C`5N&-X+`2=P-iiOP$E%o z`WJ#WLi?y)v<%wSqD9auXwfPNdM@19LczjZ*i+31ilN{*Iu0{;?%Z>JE#|6F9r*F% z9L|UH`{S$VdIYo|E?o3Th`DztWLBwjg*>8UUhIePm_f9Q()2TbDM~PpF zIkgtGid6+51|TAlfEH2BPR@V6UBA-!wJn?QC9sPI!5T2wBbBRQC{>BUsadPp7`ort zWMR;9-4c;f8`!vEymNiD*+qz8niyt5p;Vg9k?n_B8<4MWiAkpG9OzL_UhhdlBI_aA#)+v$M0z z%+n%LtbbOkKUY^*!OZY|ADK)h>^RO-B2ukqkNoAixjAO$X#k%9M05eb6#(lZ^8L8FKm8gDddz)7J^%m!07*qoM6N<$g2fF`HUIzs delta 744 zcmV8EapjxdGMSl@-9Am9zd3o8atgM(Y4BvCk-4l^#?*vrUt1t{7o}Qi(MG;XH(QGzJ zl7#8$Y1Y@*&EVi*CJ2Ia5qbG84)NaKD-;SEMG=iggE)@=h7Jr2u(q~lGnq`Ei0q5V z`ywL$1^lj1D6~2bJJCB(fcg1(SzKH+VHmDjYmY=^pno$T+~WH1^77KvYBf@+6e5DE z(r&kjqKHbRLb+U~R4RE@74Q8^z@CWAsOrPpfIk4fR4N7IVghUJnut8tJ$NfnRbi{ZYrwa_zN&tqs=s;f-#j=tXkTAn z)8F4O-uq{Ok43~iHgZ?=v70?>?bjlr#+Vq`13my|JOA?6;GHERgTP0?&p-|M9yn6f a7~oGsjX*uWh6P;!0000`3f=)34j&V@>x2-INi2VvNklFP4rMZxGQta^gy#d!Gl0R$a(CGI8Cid?LkOF__a1-&P&ba5jWJs5vs=T*hu!|u(bdmU2th=K zVQAYnj$;ELU#_aiDAHj}KQg^G(P_5wWr%773gX3wetKos04U3HBVOJZeVboO4(pS- z<)h-_$r^x&5YZM5o`nFC!3w8JSAkPCSoVPtL=jl9b@hRTz!%hdPpN;>tL30-UhkR2 zigFSt&|j39L#Fe2Qrt~ufeV&%68qjGyQjX)?B| P00000NkvXXu0mjf2wmJ` delta 480 zcmV<60U!Rg1fm3xBqa%ONLh0L01FcU01FcV0GgZ_00007bV*G`2h;}!5-uN0odlAR zTP%N=Nkl%OcKZvKVbz~8+(OxTVz47)50H+AL7rk5(H5! z6x7Cc5iHk@F`byqOfq+7GWXnLk!-(D`##MBFK}%Lz-%__^?Gp}8)JwF01>IGs)|U{ zG-X*j=L`Vvy%%8-0Ih9T0(kMa@6=}!gn+8B$6i|S4bAPj# zE|T-)a(XF0q(2`JR24)xsKE;efVQ@kRJdSC#ouT}JQM^d0Kfo{APSWvG`H)hh@yWr zN1Ld=Rd;O?IVR}dH2_2;q#>JT`DuRidX#=k`CpVh%}~+_>yWyK*`XQx)R0A6AEILrlUgqVK(w^I6 zb8G;NUyaF;{b{ufa%fQGl)Ov$mjN)q7mPJNR9J=Wm(Ob*RTRfRckaD2uh=4J(xz$CU#4whf7)WZv@R@I zsbDw$2^JU0MsVr>P@z8r7ZyQuA*d^{QUwtg7J?155Zh>Ln*J0@e0gu~PZxJ)k~BWS zBJHLJh8gagd(QWM&-a`&PsA8`oR&S-=uZGV0RV{pHG_W-T?R_$*POHO-MKmQQGCd9 zQUHfvf3xQcS}BxLNF|Y3hLjmXWC$Vn^WNXa0`O0k=bBt= zv`zq&Qb?IVWLX06^s1H2ZrdK)?YXzx?fX9qA@2WIB9;MAN|NU}MV==Bxkf96u34x+ z2q6Gi-M@cY4Gs<+8yHx3EQG+0-TU$0NJ&<)P+JIr5CYD7oO4*~FxFy>#TY|r3}uc#6gjO{L8~Y#AO%IP6A-PdR7ii6l!z=t01=2y@C3kEi#Dc8+d|3! zB9Y;dUE=!m)Is1S1t4XXXfJY#yr3uwS{0ZCBB#hTx@JO3+U+(%2v)6J*__^5hqV@E zl3ub3BnV=J7$YG@LI}hdGhmwn(5lL_*5tXS$aTX&t0-u-YG4|fNzR}98X+pd3&|^o zUnPG;FxF6(icBs#af~T&2>6g#@=Djl%ZdTHK(CT0U4hXRn7m*`t6=h%39d|CW_)~% z(a})=E?v6JiT6*iePjoF_U}G9O@0>pO=T>WmZ1;=1f-il zh;+@j+kEx;r^MhmbLI?veSJOa`L!cQIC$UyZyi65RGK44-yoB^@s<2i#aRH5)p;V4 zghFiccJJO@cJAKCGyMZhPEIzP=H})Y8yjbAe4M$txn_NGa*{Oz>)5;R0C(@)Y5af0 z7%RV2aTc1DN_8CZl}NnzNi5#8c5po_S_M+dC8xb`;Q~ANynv{l4;?zx{I+q^7Pf95 zrQ7Y&>6W<4U+ve2KnM>2@KpnGPNiD54l8X_O2(OGly|#b1Y+5`F_zMll*VGL#oE*f zQ;$e-y!T51SZ9$=qO3(`vS}Q3u1tSvnV6VpHcd=S(6tdE#Ip6$lyo{})&0uU0Zr

^D{SZ5z(AYhCks|6zt4>;$@wPtW=E*t~2OwA+94J!gTn z3q4>7003hxA%-MKA8^iNox>>Ga~jrwebsb)wZ}S#t#nYDbaLlB51JA}IOm*FDq%@N z>7=QqHQM(69%zP9(`v&aK`)((y-Z1^zPNJv;<4e;T|&wQLQEx`fBPa5f@a9Xm{{{6 z;48IT=XwTi0C>}R_uBNY>wi3-o_diqp&qH#iF_7#85jm+@7Mo#b0WrA3o2U#=#iOt e^5^t%1Na*j2+-Z_M}~X=0000>SJxiXFw zC=4jD0kxd1R)KTW=els$b z=x{jj8G{lmmu=u~Vb8X)hH))t1I5FJ30=PsVZ4G{=j@F$5Oos5L+XgSV$@c})zppZ z8Ygskf~#a0%<7S3c1!b~T5{Otwkdsj&(V*ah76{JKBXhKs^S`C6ur!jo7gZ;Y zZ;~fb{?eo|O_}|cUmjbF2CZcyVAYtdmIpQR?QL@~V-e|HK_9Q9gIid)$Wg$OMc0cH zn&rvu_$p&&pE>uDrC`8Z!nOSN+*&;W(s;IqvxX+Vt!)nKd}S|W%et1JR-U$Z6~gn_ z1~Hi~ztyfz=}_Nc8Z!ETY!(H`VFCBqKpsny{{$%Dm=FN$HxiWFXz!J>UwB!}1K@WuhWseu1c zz^|3?mJ;4pAvKsyG) znC%z`gg9W-fuIf)b6^<$U>qqPpL*ff9+?w;BZlDQb|#1z9u*g#ka{n#yoy>&qtWOs ztsRUm4tI2Rc6Ryo_Kr;PKPgQV;6Iry7ONGs*&rA>93zbq2u^XNu#nh`Udt~cBI1(I z6-&V%3iL&jA9>fGJQeQdO#)OG0@aRF*H5=y%@p;&*DUuPR|}`6YsF`YM}cV~U}oCm z{DdsZw$)o-F|f1B(yi6l?4Lm+9RZqzHF!a?8(0hD#T61k5a9jpr1&zbps}2)Z-7 zq{*)y%%>PDz24{E&gk8ZAG$S^Ym$~FRVqo|T-_M6y zOb?7qqjZ*qdoI?*1iq+>{WA4iR@U0ha}-jK@9%5TSKA*HxYvE>lfWLp3qDo8$zyIk zq6T6x+s`fdc1-Z)fS`*Zo&ncpO5Y9fbPw_l*c7_2@?#i1uJiusML%_LR($8teg0P; oP=`KK)9yB5@_6|@S4W9>ou3p+Ze(3Q{8*ei9*|XQNDI_Eh1B|1k%?L0M0MJ)T4Q(ScbN~PV07*qoM6N<$g3DW4 Ang9R* delta 310 zcmV-60m=TW0-6JmZGQn5NklQSB279gi?qIm zm9L?XAlUm579t1+i?kNjiYQiMlXLHO=C=?r+#RBFpn^Xv3sZbMv+N2<)R~}G?H~L( zP(a0_KX-HUS3K{r~^~07*qo IM6N<$f{XQwX8-^I diff --git a/data/themes/default/lfo_d100_active.png b/data/themes/default/lfo_d100_active.png index f2a05b55542f62b2944cbfa7c620b2d18fbf5078..bb966c5799704715aabd359969f984b5ac1594eb 100644 GIT binary patch delta 617 zcmV-v0+#*41;hoABo78+OGiWi000000Qp0^e~}>`3f=)34j&a>h#@7BNi2UTNklX?Gs&yrUh>4)A|W0a#yOFBXfQ=V`5# zQUH`vA|fJ(_l|NRa$Wa09FKp;aU3T}q5)WIiHL{};xjw0d%%fEM23>t_0KrML8wa`01c_MvU+3AZ1H4ozyJo9P|P*3;M9WmZ^8Y2B7>QHdWQRSE+9f zrVGN%mI(lR3Pw_9Ntu5OY8nE7VJ;|Pn&=v1cGs%YLi5jdbGl3xfEqJvFj;ZojAR;) zQ$vcKk&I0`(IukGt6Ko*tgAy75z2Liuq6hdyQ!%=L}YxeyXHig_3Na*ne9An_U}~a zr~wc`c0ThdN?N7hVI#RwEPRPif>9PSsjs#G;PkE9ONj_dAWA_&1PTE2BtdDTW3Cj2 zcWblX;?hQkh;y*K8BG2cfM&CKy2GK}ZtHA2^||v80H(AOAcuKD00000NkvXXu0mjf D`OF(i delta 641 zcmV-{0)G9(1;Pc8Bqa%ONLh0L01FcU01FcV0GgZ_00007bV*G`2iOJ|3@QhRA`Xj@ zTP%M#NklL&ny*Y@^&=Q=#WQW){%Bsclx+%Mn#PI7_&QwG5L`g*Zg z48t%80%HsSV~lgoIrnewGAHT#{#DrRc3Xd~R+^>(01*+=Cok@2byfF*lXT8qg%lAH z00Dqzt0|ORkn??i;5p87+po4~zt66GS^>~0c6Qcw>UZkZU)9wQtNAoP0Bi4S+SD)% zeE`!_)9p^Xm8Q*RlJxb_!=r;I2g!6Yd^DWf%O%a^@bO`^9L?;^M9WdqNy6Q50JeW@ zI<#LX7K;IZ)3Y-;0QmXl$Hd3U^5=49_V<3wW&AP*Q2J7`V>Wsbjc--^Q&xYcR07aYVIfM_gAQGS0AQg7Ri5iwYfsir`h_a* zDwnpWN)Z62Yt&aIov&WU>xZ^y>Cx+W-Cpn9uW)DbqCo=H}*Z_H(G!YC(3~ b_`mZ9z5CBO4@w)%00000NkvXXu0mjfO5!eZ diff --git a/data/themes/default/lfo_x100_active.png b/data/themes/default/lfo_x100_active.png index 479ff38c1217185fe0545fb99e2db91f6e40e697..cb563f432ed383d073f33b70eed6a6be816aa244 100644 GIT binary patch delta 682 zcmV;b0#*Hj280HXBo78+OGiWi000000Qp0^e~}>`3f=)34j&vRRGER1Ni2V8NklY@}h;U?s9b6+|4%p4at^pSK~KL*b5W9B=YfiuAWkp^I4VZpX-%d$+< z)HDr%rfEtkrPO}iVNOJbVGMu5Znx|Eeh>sE04XIA5z$_MqCww1PDDznK}bYWN&p4` zZE5P$qN|!Bvn{tzyKf#;{5Z`0mQfUiarAnr+AxFMrVPWdX#^i`JD=z4JCj~q znd`gB_!1&YhUvsCDOG=o#kkoAEr-Oonao!QAemTD_GsRf%Qxr2}1SE|!Rh zNhU?iy*o0?m7!lj=SJSz^fSwqL708v^!^usa=CoG%VBPA&PDfKUJzY~#R7zckbj^k>z8it_>KuRfz45DUz;~nhVbRtqp z9Ym5+N(sOKpgqxM9?htt>iE*JacX1g@l>^5^*(!16xBp+^66yJDtc>PtyU}PrRh7< zvm>*c+0D#KroLTo!Sr%EF2{yp7yt%&uyCp1XMOLTw|H-n+j!u`K($m|zqr11eJOwF z3EJ1&t$8ch306i{^27P;hira0A4GvYXSZNggoyjLe$$t`C1u3<#HuXMNHHT0E(HU zBq_C6V}qGU8LUV8UKDjfI_Z%f*Xz6UO8R}bNG^50>{OQW?{7&-lKut&R*HX^C9|2g zL`Fy=(Jjopc_{9g*AwMiWoOlK-@1vpL~u2TPuG};N$$?8ND`Aw%sF8$^v4R}`OsN# z4#7_jHTzZ`RFtFKahFKCuU+UUJ}eOtNopji#(s(2iH^3_w%}%9ui5Uajze(5ZIoyL odV711_BiBnIkWK{`Q7;g*IN=8K-RZ(RsaA107*qoM6N<$f|*K4umAu6 diff --git a/data/themes/default/lfo_x1_active.png b/data/themes/default/lfo_x1_active.png index 3a44b3e2882df84edba6cf62efab226fa9b0cbfb..2c54a6ab1d727e50cb3ef7d162b6f8d530c774a5 100644 GIT binary patch delta 575 zcmV-F0>J&81(^kqBo78+OGiWi000000Qp0^e~}>`3f=)34j&rMH$1eFNh^N={YgYY zR5;7El+SAuK@`WoGdtPZY&K*`&B22PL`3jnQD{ycs^CdM#FK~;Jct+n8&7&EC?150 z6-2><;K4&dY4Kc?)|!Nx&5zw?citNh6Sr$}Fo*gWnBl{FZ{DvN;QxpK&}=q6&vRW@ zDJ6seAcQc+7-J6f{^msFIL?1G9F0c9;V_CK1wd;}L`0O?TbcHoaUwFtOhY2lS_4o3 zzBKw@uZHK>if2B}Z=X)z-|C(HFn{h{5rA>9`mlRq!(Dt^%%{oBQp$@5}P%1v#k5!Jxmh8_rTzqm6&&R z$Jzim_2379jn~Jm&Oe<><=AckkN`9jC**&O0C?*$@9UH~TefhTNi*fSB^k7L8)CyW z?pu;1D68(35`b{I6s&)=3vHTc2$Ke2AaWBro)!y7e=O`=NqgG68IbQ(AGJ(DbZ%EE zCjg9LO{|IY+>!~HnJ55BMRc!Mj%>#M^G>u_>|ZYX&)V)*lIzAeidp0!-tcbC%t`<8 zF0uAkT9D$`y&4fQX{*FpOsq3*&yz5FUjXX$`r&>KjYdP+?a&who!@VJqZdyPmPG&n N002ovPDHLkV1fc*6KVhe delta 604 zcmV-i0;Bzz1)K$tBqa%ONLh0L01FcU01FcV0GgZ_00007bV*G`2iOJ|3@RWkD7)a1 zTPuG85=lfsR5;7Eluv6DQ540`>&&EubZTO(i-J(8pFj}F%7uS$DIzXKsp22}KCZe^ zuoYZMUE~9}tQ3s93TiddCQcKY%uJ^D-0Nb}F(o1{>fyrU{dn(k-o5WV;Qz=0SYBQ( zm&>J6$@hKd902E>nVH$|bw@c#&+{hXa5#S)31Mq-w?4OVcOw`Cwb!*)+}ggfy>nrwU+wq%{nn4xzm!#JwAMVg@(SD>H+080A%A zrE#KtV>h}Q1-n6Yy{bY0=bkPBXufU2EGK`L=T89;A%H0WRBEQ-yAVM6eOXf#Wf1_> zluC|4QSvZ~WfWDak^p=FS(dpF-Rpl{0KLn-lh3PuCm1(ksuanu#Td2Xt^mk5I*_pN zEBtvoV#wOFng!Or(-EO?6adtWs-im1sX7UT9P?Yrx;MKsA7;W=VSGN`zqUWO76zY7 zfaMRz)F_0r!>43`!)SIC0xbOY?)7ZO!j+Je@I{CzMECc|+!X;>USBG62}vwc`3f=)34j&xS-g|4UI$8`95sj9PvNCgwv1yvNZ7qOO3Nte^ zfW;oac{+!o!{_6jnK|D}DFA;gfOXq2v$Yn!`n{izZq$syXKng7@A6IIB-r z&Kjz^tLEz+yZ2g7?pCvT=zfWiXwf2Ra(UkZST2_U#MAnQ3t`~CgnWB2pD)5J0Z>&U z+Ne@k3EjA=54U$;t*S06WjHI@s30z0b*HzEF#iI3`uCj*A8c;NG=cEX#*|R^Ix=6lJ5viCH`u z4qu*`?;W3a1@`Y*B(EQhl=aewa1o%9=|?9qLkR##(UN delta 473 zcmV;~0Ve*d1e*kqBqa%ONLh0L01FcU01FcV0GgZ_00007bV*G`2h;}!5-c7LtX77R zTP%N(Nkly?JFgjv@gmsJ^qO^8%8E6m zmbtF$EXy2#+x4w=))>1#sjr@29eq72UKER>sBZR(lte|^@%XU=uqjI@w3EVQSJ$=w z>Dy=Ra=EO2R|HiB5e{l%0U3?BJOO||@~Qa$S4_xM P00000NkvXXu0mjf{lL_4 diff --git a/data/themes/default/note.png b/data/themes/default/note.png index f81425daed4eb550016c7efff9a545f72db8ad77..9e80341e097163d742a9dad0630f012c7c97434e 100644 GIT binary patch delta 951 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⁣a#{>6Il6otzJ;Fa}aPEpgmIWD=& p?d3JT_yW1djfa1c_rLwq{sf&gyIPu@{F(p&002ovPDHLkV1f>JLE-=a delta 1193 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 I0vk5`KlMQgh5!Hn literal 34254 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 diff --git a/src/gui/about_dialog.cpp b/src/gui/about_dialog.cpp index cd9cca16cd..94b6fb2173 100644 --- a/src/gui/about_dialog.cpp +++ b/src/gui/about_dialog.cpp @@ -67,7 +67,7 @@ aboutDialog::aboutDialog() : { setupUi( this ); - iconLabel->setPixmap( embed::getIconPixmap( "icon" ) ); + iconLabel->setPixmap( embed::getIconPixmap( "icon", 64, 64 ) ); versionLabel->setText( versionLabel->text(). arg( LMMS_VERSION ). From bc4b83f4436c39d39d61a9f97d226204dc0a02d1 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 27 Jan 2014 00:29:16 +0100 Subject: [PATCH 71/80] LADSPA/CMT: fixed global initialization on Win32 Global initialization happens via a global startup/shutdown handler instance. For some reason this does not work properly when building a DLL file, therefore create this startup/shutdown handler instance as a static variable in ladspa_descriptor(). Furthermore marked ladspa_descriptor as extern-C. --- plugins/ladspa_effect/cmt/src/init.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/plugins/ladspa_effect/cmt/src/init.cpp b/plugins/ladspa_effect/cmt/src/init.cpp index 76a7b2634d..f232840fa9 100644 --- a/plugins/ladspa_effect/cmt/src/init.cpp +++ b/plugins/ladspa_effect/cmt/src/init.cpp @@ -108,18 +108,26 @@ public: finalise_modules(); } -} g_oStartupShutdownHandler; +} ; /*****************************************************************************/ +extern "C" +{ + const LADSPA_Descriptor * ladspa_descriptor(unsigned long Index) { + + static StartupShutdownHandler handler; + if (Index < g_lPluginCount) return g_ppsRegisteredDescriptors[Index]; else return NULL; } +}; + /*****************************************************************************/ /* EOF */ From f2c4d144c806e5c3d40647859c4e728e49ddcb0b Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 27 Jan 2014 00:34:55 +0100 Subject: [PATCH 72/80] FxMixerView: set minimum width for EffectRackView The EffectRackView was a little bit too small in Win32 build, therefore explicitely set minimum width. --- src/gui/FxMixerView.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gui/FxMixerView.cpp b/src/gui/FxMixerView.cpp index 02d5fb1783..2ff35c9a0d 100644 --- a/src/gui/FxMixerView.cpp +++ b/src/gui/FxMixerView.cpp @@ -209,6 +209,8 @@ FxMixerView::FxMixerView() : cv->m_rackView = new EffectRackView( &m->m_fxChannels[i]->m_fxChain, this ); + cv->m_rackView->setMinimumWidth( 244 ); + m_fxRacksLayout->addWidget( cv->m_rackView ); if( i == 0 ) { From 0195bbaf7f4b771fb0260111a49c5d13766394f7 Mon Sep 17 00:00:00 2001 From: Oskar Wallgren Date: Mon, 27 Jan 2014 19:44:04 +0100 Subject: [PATCH 73/80] Removed copyrighted material and moved some files to CoolSongs. Directory Covers removed. --- data/projects/CoolSongs/LICENSES.TXT | 8 +++++++ .../MichaelKuhn-Mondscheinsonate.mmpz | Bin .../Thaledric-AwayFromBoobaloo.mmpz | Bin data/projects/Covers/CapDan-Infinity2010.mmpz | Bin 14782 -> 0 bytes .../projects/Covers/Edo98-FinalCountdown.mmpz | Bin 29222 -> 0 bytes data/projects/Covers/LICENSES.TXT | 20 ------------------ data/projects/Covers/Momo64-Jeeg.mmpz | Bin 44996 -> 0 bytes 7 files changed, 8 insertions(+), 20 deletions(-) rename data/projects/{Covers => CoolSongs}/MichaelKuhn-Mondscheinsonate.mmpz (100%) rename data/projects/{Covers => CoolSongs}/Thaledric-AwayFromBoobaloo.mmpz (100%) delete mode 100644 data/projects/Covers/CapDan-Infinity2010.mmpz delete mode 100644 data/projects/Covers/Edo98-FinalCountdown.mmpz delete mode 100644 data/projects/Covers/LICENSES.TXT delete mode 100644 data/projects/Covers/Momo64-Jeeg.mmpz diff --git a/data/projects/CoolSongs/LICENSES.TXT b/data/projects/CoolSongs/LICENSES.TXT index 94b95d9ed0..cf48776253 100644 --- a/data/projects/CoolSongs/LICENSES.TXT +++ b/data/projects/CoolSongs/LICENSES.TXT @@ -22,6 +22,10 @@ - Artistic 2.0 - http://lmms.sourceforge.net/lsp/index.php?action=show&file=581 +* MichaelKuhn-Mondscheinsonate.mmpz + - Artistic 2.0 + - http://lmms.sourceforge.net/lsp/index.php?action=show&file=1581 + * Momo64-esp.mmpz - Artistic 2.0 - http://lmms.sourceforge.net/lsp/index.php?action=show&file=1534 @@ -57,6 +61,10 @@ * TameAnderson-MakeMe.mmpz - Artistic 2.0 - http://lmms.sourceforge.net/lsp/index.php?action=show&file=1060 + +* Thaledric-AwayFromBoobaloo.mmpz + - CC (by-nc-sa) + - http://lmms.sourceforge.net/lsp/index.php?action=show&file=1187 * unfa-Spoken.mmpz - CC (by-nc) diff --git a/data/projects/Covers/MichaelKuhn-Mondscheinsonate.mmpz b/data/projects/CoolSongs/MichaelKuhn-Mondscheinsonate.mmpz similarity index 100% rename from data/projects/Covers/MichaelKuhn-Mondscheinsonate.mmpz rename to data/projects/CoolSongs/MichaelKuhn-Mondscheinsonate.mmpz diff --git a/data/projects/Covers/Thaledric-AwayFromBoobaloo.mmpz b/data/projects/CoolSongs/Thaledric-AwayFromBoobaloo.mmpz similarity index 100% rename from data/projects/Covers/Thaledric-AwayFromBoobaloo.mmpz rename to data/projects/CoolSongs/Thaledric-AwayFromBoobaloo.mmpz diff --git a/data/projects/Covers/CapDan-Infinity2010.mmpz b/data/projects/Covers/CapDan-Infinity2010.mmpz deleted file mode 100644 index 08b8705d9075441f21f2106484ce8e2bb1c9d9fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14782 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 diff --git a/data/projects/Covers/Edo98-FinalCountdown.mmpz b/data/projects/Covers/Edo98-FinalCountdown.mmpz deleted file mode 100644 index 61d5856e818543c66f3f3cfe7a1454cd09b24460..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29222 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 IjeOnwe}2=g@&Et; diff --git a/data/projects/Covers/LICENSES.TXT b/data/projects/Covers/LICENSES.TXT deleted file mode 100644 index 066f1e8819..0000000000 --- a/data/projects/Covers/LICENSES.TXT +++ /dev/null @@ -1,20 +0,0 @@ -* CapDan-Infinity2010.mmpz - - Artistic 2.0 - - http://lmms.sourceforge.net/lsp/index.php?action=show&file=990 - -* Edo98-FinalCountdown.mmpz - - CC (by) - - http://lmms.sourceforge.net/lsp/index.php?action=show&file=1198 - -* MichaelKuhn-Mondscheinsonate.mmpz - - Artistic 2.0 - - http://lmms.sourceforge.net/lsp/index.php?action=show&file=1581 - -* Momo64-Jeeg.mmpz - - Artistic 2.0 - - http://lmms.sourceforge.net/lsp/index.php?action=show&file=1380 - -* Thaledric-AwayFromBoobaloo.mmpz - - CC (by-nc-sa) - - http://lmms.sourceforge.net/lsp/index.php?action=show&file=1187 - diff --git a/data/projects/Covers/Momo64-Jeeg.mmpz b/data/projects/Covers/Momo64-Jeeg.mmpz deleted file mode 100644 index c76c8ee3265cd30eb58a36118135fa37afde649d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44996 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 zΠDm1_Fk+rvDUeXch9==5ZcXl>2Esm3=4TawM6@qE=wva$&L(%bY3CBTd Date: Mon, 27 Jan 2014 21:12:54 +0200 Subject: [PATCH 74/80] Added LGPL text, as needed by the OPL2 emulator used in OpulenZ --- COPYING.LESSER | 502 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 502 insertions(+) create mode 100644 COPYING.LESSER diff --git a/COPYING.LESSER b/COPYING.LESSER new file mode 100644 index 0000000000..4362b49151 --- /dev/null +++ b/COPYING.LESSER @@ -0,0 +1,502 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! From b8149c1d88a3517594c6acc604e99d3867272bea Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Tue, 28 Jan 2014 00:26:29 +0100 Subject: [PATCH 75/80] EffectView: fix crash when removing dummy effect plugin If a certain effect plugin fails to load a dummy plugin is inserted instead which has no sub window and thus caused a crash in EffectView destructor. --- src/gui/widgets/EffectView.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/gui/widgets/EffectView.cpp b/src/gui/widgets/EffectView.cpp index 9b6b8cc05f..d61adc9665 100644 --- a/src/gui/widgets/EffectView.cpp +++ b/src/gui/widgets/EffectView.cpp @@ -158,8 +158,11 @@ EffectView::~EffectView() delete m_subWindow; #else - // otherwise on win32 build VST GUI can get lost - m_subWindow->hide(); + if( m_subWindow ) + { + // otherwise on win32 build VST GUI can get lost + m_subWindow->hide(); + } #endif } From 8fba1968978223a144a86e392488f61c209e655b Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Tue, 28 Jan 2014 00:27:59 +0100 Subject: [PATCH 76/80] CMakeLists: removed deprecated win32-pkg target We've been using CPack for ages so there's really no need for the old win32-pkg target. --- CMakeLists.txt | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 196cfee9d8..b097bf538a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -527,39 +527,6 @@ ADD_CUSTOM_TARGET(dist COMMAND tar cjf lmms-${VERSION}.tar.bz2 ${TMP} COMMAND rm -rf ${TMP}) -# -# add win32-pkg-target (deprecated - use "package" target instead) -# -ADD_CUSTOM_TARGET(win32-pkg - COMMAND mkdir -p tmp/lmms/data - COMMAND mkdir -p tmp/lmms/plugins/ladspa/ - COMMAND cp lmms.exe tmp/lmms - COMMAND find plugins/ -maxdepth 2 -name '*.dll' -exec cp '{}' tmp/lmms/plugins/ "';'" - COMMAND rm tmp/lmms/plugins/caps.dll - COMMAND rm tmp/lmms/plugins/tap*.dll - COMMAND cp plugins/ladspa_effect/caps/caps.dll tmp/lmms/plugins/ladspa/ - COMMAND cp plugins/ladspa_effect/tap/tap*.dll tmp/lmms/plugins/ladspa/ - COMMAND cd data && make DESTDIR=${CMAKE_BINARY_DIR}/tmp/lmms/ install - COMMAND mv tmp/lmms/opt/mingw32/share/lmms/* tmp/lmms/data/ && rm -rf tmp/lmms/opt - COMMAND cp /opt/mingw32/bin/QtCore4.dll tmp/lmms - COMMAND cp /opt/mingw32/bin/QtGui4.dll tmp/lmms - COMMAND cp /opt/mingw32/bin/QtXml4.dll tmp/lmms - COMMAND cp /opt/mingw32/bin/libz.dll tmp/lmms - COMMAND cp /opt/mingw32/bin/libsndfile-1.dll tmp/lmms - COMMAND cp /opt/mingw32/bin/libvorbis*.dll tmp/lmms - COMMAND cp /opt/mingw32/bin/libogg-0.dll tmp/lmms - COMMAND cp /opt/mingw32/bin/libfluidsynth-1.dll tmp/lmms - COMMAND cp /opt/mingw32/bin/libfftw3f-3.dll tmp/lmms - COMMAND cp /opt/mingw32/bin/SDL.dll tmp/lmms - COMMAND cp /opt/mingw32/i586-mingw32/bin/mingwm10.dll tmp/lmms - COMMAND cp -L ${CMAKE_SOURCE_DIR}/COPYING tmp/lmms/LICENSE.TXT - COMMAND cp -L ${CMAKE_SOURCE_DIR}/README tmp/lmms/README.TXT - COMMAND ${STRIP} tmp/lmms/lmms.exe tmp/lmms/plugins/*.dll tmp/lmms/plugins/ladspa/*.dll - COMMAND mv tmp/lmms tmp/lmms-${VERSION} - COMMAND cd tmp && zip -r -9 ../lmms-${VERSION}-bin-win32.zip lmms-${VERSION}/* - COMMAND rm -rf tmp -) - SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${LMMS_ER_H} ${lmms_MOC_out} ${lmms_UI_out} lmmsconfig.h lmms.1.gz") From a36f59ab350152b601ef9a811d7b8483c03e7b13 Mon Sep 17 00:00:00 2001 From: "Raine M. Ekman" Date: Tue, 28 Jan 2014 20:39:03 +0200 Subject: [PATCH 77/80] Moved LGPL to OpulenZ source dir, added presets. --- data/presets/OpulenZ/Bagpipe.xpf | 29 +++++++++++++++++++ data/presets/OpulenZ/Bells.xpf | 21 ++++++++++++++ data/presets/OpulenZ/Brass.xpf | 21 ++++++++++++++ data/presets/OpulenZ/Bubbly_days.xpf | 21 ++++++++++++++ data/presets/OpulenZ/Cheesy_synth.xpf | 21 ++++++++++++++ data/presets/OpulenZ/Clarinet.xpf | 21 ++++++++++++++ data/presets/OpulenZ/Combo_organ.xpf | 29 +++++++++++++++++++ data/presets/OpulenZ/Epiano.xpf | 21 ++++++++++++++ data/presets/OpulenZ/Funky.xpf | 29 +++++++++++++++++++ data/presets/OpulenZ/Halo_pad.xpf | 21 ++++++++++++++ data/presets/OpulenZ/Harp.xpf | 29 +++++++++++++++++++ data/presets/OpulenZ/Organ_leslie.xpf | 29 +++++++++++++++++++ data/presets/OpulenZ/Pad.xpf | 21 ++++++++++++++ data/presets/OpulenZ/Square.xpf | 29 +++++++++++++++++++ data/presets/OpulenZ/Vibraphone.xpf | 21 ++++++++++++++ COPYING.LESSER => plugins/opl2/COPYING.LESSER | 0 16 files changed, 363 insertions(+) create mode 100644 data/presets/OpulenZ/Bagpipe.xpf create mode 100644 data/presets/OpulenZ/Bells.xpf create mode 100644 data/presets/OpulenZ/Brass.xpf create mode 100644 data/presets/OpulenZ/Bubbly_days.xpf create mode 100644 data/presets/OpulenZ/Cheesy_synth.xpf create mode 100644 data/presets/OpulenZ/Clarinet.xpf create mode 100644 data/presets/OpulenZ/Combo_organ.xpf create mode 100644 data/presets/OpulenZ/Epiano.xpf create mode 100644 data/presets/OpulenZ/Funky.xpf create mode 100644 data/presets/OpulenZ/Halo_pad.xpf create mode 100644 data/presets/OpulenZ/Harp.xpf create mode 100644 data/presets/OpulenZ/Organ_leslie.xpf create mode 100644 data/presets/OpulenZ/Pad.xpf create mode 100644 data/presets/OpulenZ/Square.xpf create mode 100644 data/presets/OpulenZ/Vibraphone.xpf rename COPYING.LESSER => plugins/opl2/COPYING.LESSER (100%) diff --git a/data/presets/OpulenZ/Bagpipe.xpf b/data/presets/OpulenZ/Bagpipe.xpf new file mode 100644 index 0000000000..15aae06aca --- /dev/null +++ b/data/presets/OpulenZ/Bagpipe.xpf @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Bells.xpf b/data/presets/OpulenZ/Bells.xpf new file mode 100644 index 0000000000..aade9bd6c9 --- /dev/null +++ b/data/presets/OpulenZ/Bells.xpf @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Brass.xpf b/data/presets/OpulenZ/Brass.xpf new file mode 100644 index 0000000000..f995fb96e6 --- /dev/null +++ b/data/presets/OpulenZ/Brass.xpf @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Bubbly_days.xpf b/data/presets/OpulenZ/Bubbly_days.xpf new file mode 100644 index 0000000000..bf4d925af9 --- /dev/null +++ b/data/presets/OpulenZ/Bubbly_days.xpf @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Cheesy_synth.xpf b/data/presets/OpulenZ/Cheesy_synth.xpf new file mode 100644 index 0000000000..d30fce903a --- /dev/null +++ b/data/presets/OpulenZ/Cheesy_synth.xpf @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Clarinet.xpf b/data/presets/OpulenZ/Clarinet.xpf new file mode 100644 index 0000000000..ec3357c533 --- /dev/null +++ b/data/presets/OpulenZ/Clarinet.xpf @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Combo_organ.xpf b/data/presets/OpulenZ/Combo_organ.xpf new file mode 100644 index 0000000000..92550e15c2 --- /dev/null +++ b/data/presets/OpulenZ/Combo_organ.xpf @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Epiano.xpf b/data/presets/OpulenZ/Epiano.xpf new file mode 100644 index 0000000000..cbfa3ea9a5 --- /dev/null +++ b/data/presets/OpulenZ/Epiano.xpf @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Funky.xpf b/data/presets/OpulenZ/Funky.xpf new file mode 100644 index 0000000000..e1c2baa479 --- /dev/null +++ b/data/presets/OpulenZ/Funky.xpf @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Halo_pad.xpf b/data/presets/OpulenZ/Halo_pad.xpf new file mode 100644 index 0000000000..d3769abe20 --- /dev/null +++ b/data/presets/OpulenZ/Halo_pad.xpf @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Harp.xpf b/data/presets/OpulenZ/Harp.xpf new file mode 100644 index 0000000000..e5c686d93d --- /dev/null +++ b/data/presets/OpulenZ/Harp.xpf @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Organ_leslie.xpf b/data/presets/OpulenZ/Organ_leslie.xpf new file mode 100644 index 0000000000..9f46ffed01 --- /dev/null +++ b/data/presets/OpulenZ/Organ_leslie.xpf @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Pad.xpf b/data/presets/OpulenZ/Pad.xpf new file mode 100644 index 0000000000..636ce36282 --- /dev/null +++ b/data/presets/OpulenZ/Pad.xpf @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Square.xpf b/data/presets/OpulenZ/Square.xpf new file mode 100644 index 0000000000..8c40992e4d --- /dev/null +++ b/data/presets/OpulenZ/Square.xpf @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/presets/OpulenZ/Vibraphone.xpf b/data/presets/OpulenZ/Vibraphone.xpf new file mode 100644 index 0000000000..b41cd40e6e --- /dev/null +++ b/data/presets/OpulenZ/Vibraphone.xpf @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/COPYING.LESSER b/plugins/opl2/COPYING.LESSER similarity index 100% rename from COPYING.LESSER rename to plugins/opl2/COPYING.LESSER From f7d58114b2192ac379bc775f8d2c4f672b6c9aa7 Mon Sep 17 00:00:00 2001 From: Vesa Date: Tue, 28 Jan 2014 22:16:25 +0200 Subject: [PATCH 78/80] Added object names for transport buttons (for theming purposes), fixed alignment issues on track labels --- data/themes/default/automation_track.png | Bin 586 -> 519 bytes data/themes/default/bb_track.png | Bin 681 -> 657 bytes data/themes/default/sample_track.png | Bin 893 -> 847 bytes data/themes/default/style.css | 11 ++++++++++ src/gui/AutomationEditor.cpp | 26 +++++++++++++---------- src/gui/MainWindow.cpp | 2 +- src/gui/bb_editor.cpp | 5 ++++- src/gui/piano_roll.cpp | 5 +++++ src/gui/song_editor.cpp | 19 +++++++++++------ src/gui/widgets/track_label_button.cpp | 2 +- 10 files changed, 49 insertions(+), 21 deletions(-) diff --git a/data/themes/default/automation_track.png b/data/themes/default/automation_track.png index d6193e4f6b6e228355b5f5c606569348f172b60c..a7480fd70fd6faa3dca4a9915d6e155a56a4500e 100644 GIT binary patch delta 507 zcmVnOfe+P6) zO+^RZ0UQ(y5GEtkYXATNrb$FWR7l5TU>F7D0u>b%c50ZzghhVTH|(dWnfW0He+LH+V$3lyF^R(!MC()Xrt`V_WV8MM&&=@mF9QP? zw=hFa*1E zT#Do55@JZmUBq_o_!V|1&)5b^zA)o*kIU&hG#K002ovPDHLkV1hv-<2V2S delta 553 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 Q*#H0l07*qoM6N<$f}ypK2LJ#7 delta 884 zcmV-)1B?962K@#xiBL{Q4GJ0x0000DNk~Le0000K0000K2nGNE0F8+q4FCWD1am@3 zR0s$N2z&@+h>;-}e;IT|SaefwW^{L9a%BK_cXuvnZfkR6VQ^(GZ*pgw?mQX*00R0+ zL_t(IjjfbVXxv2<$3Jgob~n4-ja}BJS!qlOjn*WBfto^74j{R9ZPzWjgQq&Lt={lU0R8PK>8CK1RLy1?NB z|jEWng7L7gj+f5%JL0Gxhuy$O6hdHTh-!l~*(^X@U5>n~9#^61|{jl#O;VQO30G5YZ>llL~MMM*hc^ie}+rF>(J}x_RF;-G$OJ%C22<_+Yw1S zCha6-Q9{^^seZGSZr#571Ih+~e(+Cp0P=7@9G{%{s!%GvuCG01IdRbVsw3+pq<^$9 z3wJ{Ca?5Ysx%<=F%IZbnqN@JPF3Ii&TdURHK6GT@{X(fYV!iYOnwik-G&^gzf4}v8 zI;+*%04}TQx4U6IfdC>>15N`+fl7C~39JG?s%oPb?2*9#qrU-=*;w+>EAM3h0000< KMNUMnLSTZ * Copyright (c) 2008-2013 Paul Giblock * Copyright (c) 2006-2008 Javier Serrano Polo - * + * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * * This program is free software; you can redistribute it and/or @@ -156,10 +156,14 @@ AutomationEditor::AutomationEditor() : tr( "Play/pause current pattern (Space)" ), this, SLOT( play() ), m_toolBar ); + m_stopButton = new toolButton( embed::getIconPixmap( "stop" ), tr( "Stop playing of current pattern (Space)" ), this, SLOT( stop() ), m_toolBar ); + m_playButton->setObjectName( "playButton" ); + m_stopButton->setObjectName( "stopButton" ); + m_playButton->setWhatsThis( tr( "Click here if you want to play the current pattern. " "This is useful while editing it. The pattern is " @@ -277,7 +281,7 @@ AutomationEditor::AutomationEditor() : connect( &m_tensionModel, SIGNAL( dataChanged() ), this, SLOT( tensionChanged() ) ); - + tool_button_group = new QButtonGroup( this ); tool_button_group->addButton( m_discreteButton ); tool_button_group->addButton( m_linearButton ); @@ -524,7 +528,7 @@ void AutomationEditor::updateAfterPatternChange() } if( m_pattern->progressionType() == - AutomationPattern::DiscreteProgression && + AutomationPattern::DiscreteProgression && !m_discreteButton->isChecked() ) { m_discreteButton->setChecked( true ); @@ -763,20 +767,20 @@ void AutomationEditor::drawLine( int _x0, float _y0, int _x1, float _y1 ) float yscale = deltay / ( deltax ); - if( _x0 < _x1) + if( _x0 < _x1) { xstep = quantization(); } - else + else { xstep = -( quantization() ); } if( _y0 < _y1 ) { - ystep = 1; + ystep = 1; } - else + else { ystep = -1; } @@ -878,7 +882,7 @@ void AutomationEditor::mousePressEvent( QMouseEvent * _me ) { // then set new value MidiTime value_pos( pos_ticks ); - + MidiTime new_time = m_pattern->putValue( value_pos, level ); @@ -1577,7 +1581,7 @@ void AutomationEditor::paintEvent( QPaintEvent * _pe ) is_selected ); } delete [] values; - + // Draw cross int y = yCoordOfLevel( it.value() ); p.drawLine( x - 1, y, x + 1, y ); @@ -1803,7 +1807,7 @@ void AutomationEditor::wheelEvent( QWheelEvent * _we ) m_timeLine->setPixelsPerTact( m_ppt ); update(); } - else if( _we->modifiers() & Qt::ShiftModifier + else if( _we->modifiers() & Qt::ShiftModifier || _we->orientation() == Qt::Horizontal ) { m_leftRightScroll->setValue( m_leftRightScroll->value() - @@ -2069,7 +2073,7 @@ void AutomationEditor::selectAll() const float level = it.value(); if( level < m_selectStartLevel ) { - // if we move start-level down, we have to add + // if we move start-level down, we have to add // the difference between old and new start-level // to m_selectedLevels, otherwise the selection // is just moved down... diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 8a92a5c763..c86975b3f3 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -412,7 +412,7 @@ void MainWindow::finalize( void ) toolButton * bb_editor_window = new toolButton( - embed::getIconPixmap( "bb_track" ), + embed::getIconPixmap( "bb_track_btn" ), tr( "Show/hide Beat+Bassline Editor" ) + " (F6)", this, SLOT( toggleBBEditorWin() ), diff --git a/src/gui/bb_editor.cpp b/src/gui/bb_editor.cpp index a26094e805..ec6de90344 100644 --- a/src/gui/bb_editor.cpp +++ b/src/gui/bb_editor.cpp @@ -2,7 +2,7 @@ * bb_editor.cpp - basic main-window for editing of beats and basslines * * Copyright (c) 2004-2008 Tobias Doerffel - * + * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * * This program is free software; you can redistribute it and/or @@ -85,6 +85,9 @@ bbEditor::bbEditor( bbTrackContainer* tc ) : tr( "Stop playback of current beat/bassline (Space)" ), this, SLOT( stop() ), m_toolBar ); + m_playButton->setObjectName( "playButton" ); + m_stopButton->setObjectName( "stopButton" ); + toolButton * add_bb_track = new toolButton( embed::getIconPixmap( "add_bb_track" ), tr( "Add beat/bassline" ), diff --git a/src/gui/piano_roll.cpp b/src/gui/piano_roll.cpp index ddd450faa6..4a9d8203eb 100644 --- a/src/gui/piano_roll.cpp +++ b/src/gui/piano_roll.cpp @@ -331,6 +331,11 @@ pianoRoll::pianoRoll() : m_stopButton = new toolButton( embed::getIconPixmap( "stop" ), tr( "Stop playing of current pattern (Space)" ), this, SLOT( stop() ), m_toolBar ); + + m_playButton->setObjectName( "playButton" ); + m_stopButton->setObjectName( "stopButton" ); + m_recordButton->setObjectName( "recordButton" ); + m_recordAccompanyButton->setObjectName( "recordAccompanyButton" ); m_playButton->setWhatsThis( tr( "Click here to play the current pattern. " diff --git a/src/gui/song_editor.cpp b/src/gui/song_editor.cpp index 4a2205fbd6..0992046169 100644 --- a/src/gui/song_editor.cpp +++ b/src/gui/song_editor.cpp @@ -113,7 +113,7 @@ songEditor::songEditor( song * _song, songEditor * & _engine_ptr ) : this, SLOT( adjustUiAfterProjectLoad() ) ); - // add some essential widgets to global tool-bar + // add some essential widgets to global tool-bar QWidget * tb = engine::mainWindow()->toolBar(); engine::mainWindow()->addSpacingToToolBar( 10 ); @@ -153,7 +153,7 @@ songEditor::songEditor( song * _song, songEditor * & _engine_ptr ) : engine::mainWindow()->addWidgetToToolBar( m_timeSigDisplay ); engine::mainWindow()->addSpacingToToolBar( 10 ); - + QLabel * master_vol_lbl = new QLabel( tb ); master_vol_lbl->setPixmap( embed::getIconPixmap( "master_volume" ) ); @@ -239,7 +239,7 @@ songEditor::songEditor( song * _song, songEditor * & _engine_ptr ) : m_toolBar->setFixedHeight( 32 ); m_toolBar->setAutoFillBackground( true ); QPalette pal; - pal.setBrush( m_toolBar->backgroundRole(), + pal.setBrush( m_toolBar->backgroundRole(), embed::getIconPixmap( "toolbar_bg" ) ); m_toolBar->setPalette( pal ); @@ -255,19 +255,23 @@ songEditor::songEditor( song * _song, songEditor * & _engine_ptr ) : m_playButton = new toolButton( embed::getIconPixmap( "play" ), tr( "Play song (Space)" ), this, SLOT( play() ), m_toolBar ); + m_playButton->setObjectName( "playButton" ); m_recordButton = new toolButton( embed::getIconPixmap( "record" ), tr( "Record samples from Audio-device" ), this, SLOT( record() ), m_toolBar ); - m_recordAccompanyButton = new toolButton( + m_recordButton->setObjectName( "recordButton" ); + + m_recordAccompanyButton = new toolButton( embed::getIconPixmap( "record_accompany" ), tr( "Record samples from Audio-device while playing " "song or BB track" ), this, SLOT( recordAccompany() ), m_toolBar ); + m_recordAccompanyButton->setObjectName( "recordAccompanyButton" ); // FIXME: disable record button while it is not implemented m_recordButton->setDisabled( true ); - + // disable record buttons if capturing is not supported if( !engine::mixer()->audioDev()->supportsCapture() ) { @@ -278,6 +282,7 @@ songEditor::songEditor( song * _song, songEditor * & _engine_ptr ) : m_stopButton = new toolButton( embed::getIconPixmap( "stop" ), tr( "Stop song (Space)" ), this, SLOT( stop() ), m_toolBar ); + m_stopButton->setObjectName( "stopButton" ); m_addBBTrackButton = new toolButton( embed::getIconPixmap( "add_bb_track" ), @@ -566,7 +571,7 @@ void songEditor::wheelEvent( QWheelEvent * _we ) setPixelsPerTact( pixelsPerTact() ); // and make sure, all TCO's are resized and relocated realignTracks(); - } + } else if( engine::mainWindow()->isShiftPressed() == TRUE ) { m_leftRightScroll->setValue( m_leftRightScroll->value() - @@ -720,7 +725,7 @@ void songEditor::updatePosition( const MidiTime & _t ) trackOpWidth = TRACK_OP_WIDTH; } - if( ( m_s->isPlaying() && m_s->m_playMode == song::Mode_PlaySong + if( ( m_s->isPlaying() && m_s->m_playMode == song::Mode_PlaySong && m_timeLine->autoScroll() == timeLine::AutoScrollEnabled) || m_scrollBack == true ) { diff --git a/src/gui/widgets/track_label_button.cpp b/src/gui/widgets/track_label_button.cpp index 0080c090cc..f264857019 100644 --- a/src/gui/widgets/track_label_button.cpp +++ b/src/gui/widgets/track_label_button.cpp @@ -58,7 +58,7 @@ trackLabelButton::trackLabelButton( trackView * _tv, QWidget * _parent ) : setFixedSize( 160, 29 ); } - setIconSize( QSize( 32, 32 ) ); + setIconSize( QSize( 24, 24 ) ); setText( " " ); connect( m_trackView->getTrack(), SIGNAL( dataChanged() ), From c2672651488be91f4b6c30fd1fee4829b579c939 Mon Sep 17 00:00:00 2001 From: Vesa Date: Wed, 29 Jan 2014 00:45:03 +0200 Subject: [PATCH 79/80] Retouched transport icons, commented stylesheet for better documentation, fixed faint line in bitinvader knob --- data/themes/default/pause.png | Bin 228 -> 415 bytes data/themes/default/play.png | Bin 337 -> 602 bytes data/themes/default/record.png | Bin 610 -> 742 bytes data/themes/default/record_accompany.png | Bin 692 -> 975 bytes data/themes/default/reload.png | Bin 1211 -> 962 bytes data/themes/default/stop.png | Bin 244 -> 507 bytes data/themes/default/style.css | 99 +++++++++++++++-------- src/gui/widgets/knob.cpp | 1 + 8 files changed, 68 insertions(+), 32 deletions(-) diff --git a/data/themes/default/pause.png b/data/themes/default/pause.png index c9b45d7d948f21331ae93aebf3266894b7fa0b7e..04725f997e18ab73d34ad049ddd332a9e895d866 100644 GIT binary patch delta 315 zcmV-B0mS~~0iOeqZGQnANkl1*p)l{)g0dDW~~NK zXw8VG{@QJd88zzf&tpyLyAC|_Zd0zz46XGMVFTyvZiZc3!&$R>hn}!)Y6zis2fJ-* zj8bEA?wIiQ^fb1j@7nv*^MaZ03)coNSNRMRF62Z+VyypDXam5B^vlHE<9bh&3Jl`t^$opC)|rjL5~; gpv=pRBd>r30CT$~FWiIDvd1+!7t%WBG_J3 zP%ok&eg!{DPW={zYQ^e7ZPSg$lbV9$rfquAgx%Tfdmc0)bhD<`{NcgCFhAbRJQ5Ks zGHRjPNsx$E7Y%;3);5V~<;y0!`pNh!0(==ED*Vfh%I)@;1U}n5;C;YL~DU8t@!{Kl)Tmo<1zJt(3ztOI=r1n;v6c69h1+gqF5PFf70?Y(~n;0J)? z@$nK^6eAR)5%S!_XDI;SxZlUCm)o4Qc3Fs~p#;E=h;R%l!9365y@%2o!@&T_{vLNa z9~eY!pJkO$CFrvh-g~@z`-Z=K{=_t=qmwC(O&rJE>-AVEHHLly*q;Z@1eH>$F{YE} t`9DKd9j*d+cot|T_y=`ofhxiO%`fL%O58hk^&S8K002ovPDHLkV1iM5@b>@! delta 236 zcmVEEAs9F~kkz7Q~Pok=R3Q*t%Y=Eh|7g|2>T~}Z| z6!wC~n7ad4z$z5>f@zu-Ns^p9a0x7dNgpU~Y(zu>vMej?_hps3uIEkDEZVl6*~dy? z3mjGT+3iU$=rqm;Uo3ob;UF*o-rEyDq6a%D#6zy!3yx`u7yJTMzz#V0Aou0}2b;*F m7xm|m17-~59laPUdaz#@%JH^ha%utq0000hZGQq|Nkl8mcG(0_uTz- z_uTUyDa#TMS;m9X{s+*!OW0^O8-)WCx%ENWf zTcehB;M%q`SFe+XZ36(p@fiImDu;1APLAFZ5GDx1a*T$pofp0)!w_YGw)2$pqbfslQtq{+w5nQf5Xb5~2=>2?$DaYbDa-Qf zy+8o)IDfq0IJ+$=m#?CMg3`etjxV~S(ec&E-rj`W3j_c{2*)(Ei}(=@|H`wIS$F&~ e@NeqDKiKcQA}KQcftzmt0000yvdZGQpZNkl$pC zwlDCq+l?-}-Dsb^^wyCt+U*{IA&AZa4C>_(m~R1G|Cr70_J0O`=yX0Z^9=wE00b}q zFhKPdOGKZ)Pp4o139MmX0H7(Q?Zxp!90V2sOi}1NV@~E-_VOX3PrJ}9;6=OL1JO?a zx_^B9&`**{*l464Q3(K!+0R!iHC`;b1By zlzKW+>PbtvjDLLpxt}D{rj)jB$#4@Owi`g_0B{<|k3pl6${?^xh@}!D1%R}w6aZAt z`KNLGIG@e*y5^5RthE>rz;O^*;d!M`lq(@p9fn4Sp;1DlK2a__uZ)Ah*25ZXD)oM1 zf16Bx0T?krrYLmfoL@4BX;mqk=dsQ6IISvGGKZCOzIZ7LU28O|YXR)`koguwXZOam zT2W-Oq9_5Na!vw3>0Fo>n z&1>FQ>>cP~uHHHaeH?bP_H1*SZ)Gpw|K#9e{{|Sc5)wKJ&tm`p002ovPDHLkV1g8D B^g;jt diff --git a/data/themes/default/record_accompany.png b/data/themes/default/record_accompany.png index 0dbbb91b94acfa0275a4b49a912f9b0cd0552514..7dd091a1246a3cd3218c8dc61cb7ab98a845a50c 100644 GIT binary patch delta 879 zcmV-#1Cac*1F&g{%)CMD)4F=}H%strx06s3yT zAU%|zQtL%n@uXM1`5%ZNf_m~I6vUIgNFg?aNMqYe5lmW}WYIucT5Yo3>}(Tfc4yw1 zcODNlYfZsJ$#Z_54_|n`-{(;x!d_NkPiZ?qrIf!{KqVqrmVXr}rM@)Ad?q5T2OC}; z8F{RjByYH``?krl$y}u9IL_}{>mQP0@zePmH|{+IR7%Ov(2%LsYFb1-&a&)t5s6O@ z4vtuk^K+Ny_4JfVg&yC>wr#eXO=@8%wJ=OVt;?6I)$bnyo;vj=aiXbImQ8hIBPqex z$NKu-KhWRr4}T8~;JPlBWdV>ILz<>kgMjOI?&N<)(FfOp;41)ohwQj6UEMtlKRsea zQRL0f&U|>WdRJ-N=D_~_`2VOwDRN^-;+V$^1#*!>zP|oNuj4G#wZ76;SbpbS{LW4~ zJf9BF$8}w9t*tS4ewuot&WW)x%EymWavUwswk(=;W^QnXI6Y#R`MTe{BN`Dv*)>gvSUm@2<@`u$NCat!!=0$5|Et--*aN{F`MTcn_EdmSoq} zRZ3aFFfa-{1GvB+z#4E>L`=JPXI3etc7qpTx_FgtoS@Ff&cVh<^x-F#@m$;5mR-MAYjG zZdld@1-MJVGJq?75xb0No2lx?X1QEC3fPYVfM)<+uSBD_6yOa2V~_w~NGt$6-m>kN z6M>xbdbis>3jmz4YRWXj5nWfqn)bsoj8<6FzH>$Kno=4ELWG;`cF5;E>_bO@*=+Wy zZQGfqu1=_9~`q}B2AIjxqOUfW4dhxDOc{C9? z^dD-&w)53y^U@gj%bjF$UrK2fg^2IeYUcs$Y}xkZseiy>aNV}^wK4G3XtcUyS*`b_ zQksBHz%a~X8{5N3w+AuR%#)rRJgn?sZGOJsx~^FiB2I^H+I?Fn$cey7O$l=DU9+s> zgH-CH0tDKw8*+O+{i_gRKWF>53W;(<{;F&3_ra0f>mYeZk)@2lxwi9RMdHOgl@nv)a8( gW@eg({r4OD7q~Qr*Sh@s4gdfE07*qoM6N<$f{t|^2><{9 diff --git a/data/themes/default/reload.png b/data/themes/default/reload.png index 699153a9386365535470ea21d5363d0393464d72..c92882ecdc5ef71499288811d847f265fbaf3b92 100644 GIT binary patch literal 962 zcmV;z13mnSP)$m(GYfGX0+=d${xDi4jOCJ!D zW&y>xhb0>>MvU=cVq$zS>R;fC#te-=p5}x4qR}nth8t$f#uiC7MsQ&)Oa!46TKaRW$?Nr+m*>@2V|Y3b%XTYk-+eFZLer6n3!Hm+S9 zyct~dw~9zQC(u#i>gx1$pL(*X#WD2L4=XoDu1l8&!!ri z+Y0gu3SUu5IUy@;itTpa-nx3zr{mAFc;n9b&s{|5sq8=E|neJ9?Oh6A3MrfDAn z&x*)DwJairQpyV)1}^1#H>H%e)9!q=v8koM&D*(WDY$4%-@Sd)FpMc+7&fWp93Xei z?#I5dJ4+n3dmnc@OUw1Zg5MZA`|a_9IN k1|qPR18a! z@R>P#2w9kwv!`imJ+z0Kb+Vf2dTwRDD(`UJbMEiE-}le`=boDz5w?tGG0Oq~XyWBT zQAV9P*=7VIKO`M8H_DVmp+pFvYv&U4{su6ujtE^TGUhUXB>>C+r_^ZeAqId0@G~8% zM34kfJOhfCfXoWE0PJ;!gI*w`gTev!P(aCsGH;MGAe#|ueD11fjOn+XOfiylZpU14UAKy1h@aLNJH2tE(}5_E*^)bPqY!0wm|>4uOjIy&uOsF=Vu3v>nW%I^r86p7Sj5JC zEG%}xVmB-n-~ksb2}ZRO9-NP*T-36#oQo9_tmI*p7;8hYj*lk-Q5S;^8}Rf_H29z) z3C|>AQv{w}gy+7+^C{SpjF(p7Wk0;K2(RW~Ybv(!u{|E|WMPK@I|bO4fZdtcyA1n^ z@R{LyrV5Q`n!YV6EE-Iwkj>1@%qbKKl}epzX>C1oCY^3;KX=}|dCd8)Zfv$YhqJ)L zW1+VXm&@fZ2?`dkkVM8xX%kLnH07cN|A|Km~0`(JW>66p4DQjyyh}+<)!ne%qq8?ax-!DK<+3 zw!iFdok1kEKeO`ms=vKS+KheI+2R~CFNzzJAYVRuZ+=<8iPT@hN63noPA)Y()9)wx zNKDeF1Dkju)`H8czHA@x&0z3vbyBH9O4rcCj2#cAb3XQ5eB-ex_KYK3)erjf?$S7H z>A92`Mowj{Y-sH)ED zSSbLs)=)PrK5c&nh7btTM4Te3N=lh!{lQ&EciY#5KoI%7{n>|d#5os1fB}4bRpW@a zC+uU;d#CqKt$+0_bBuvm!QH8?(p#f{MU>rVj+>nVxZBY?RyN!WccZ$$2f7=R#nT$C zH9~ld%?f4Puu{%MzXg_3PSf_*(L;m*^ww}UtQ1PwC}n#Ov}4ieyU#2}f&>Qp-B$PG z>1{7dW{hzL5Apsqu6IWK1Q!vxKBxV9lmGt5{sr+(@Day?+E&2;0000G#Hn;D8=J|~%KAXQyO1b*)Ul1w3lqXvvI?y9=o=4%F9 xGQkOs0K$J?SC^Zs=et}2oAV0x$oP+P0@HgcAlzGhCjbBd00>D%PDHLkV1i(tJy-w$ diff --git a/data/themes/default/style.css b/data/themes/default/style.css index 54c9d94120..94a4b393ca 100644 --- a/data/themes/default/style.css +++ b/data/themes/default/style.css @@ -1,4 +1,6 @@ -/* LMMS style sheet */ +/******************** + * LMMS style sheet * + ********************/ QWhatsThat { color: black; @@ -12,6 +14,7 @@ AutomationEditor { background-color: rgb(0, 0, 0); } +/* text box */ QLineEdit { border-radius: 4px; @@ -20,6 +23,8 @@ QLineEdit { color: #e0e0e0; } +/* text box when it wants text */ + QLineEdit:focus { border: 1px solid rgba(0,0,0, 128); } @@ -89,6 +94,20 @@ pianoRoll { background-color: rgb(0, 0, 0); } +/* main toolbar oscilloscope - can have transparent bg now */ + +visualizationWidget { + background: none; + border: none; +} + +/* main toolbar cpu load widget - this can have transparent bg now */ + +cpuloadWidget { + border: none; + background: url(resources:cpuload_bg.png); +} + /* scrollbar: trough */ QScrollBar:horizontal { @@ -104,15 +123,6 @@ QScrollBar:vertical { margin: 13px 0px; } -visualizationWidget { - background: none; - border: none; -} - -cpuloadWidget { - border: none; - background: url(resources:cpuload_bg.png); -} /* scrollbar: trough clicky things */ QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal, @@ -130,7 +140,7 @@ QScrollBar::add-page:vertical:pressed, QScrollBar::sub-page:vertical:pressed { QScrollBar::handle:horizontal { background: qlineargradient(spread:reflect, x1:0.5, y1:0, x2:0.5, y2:1, - stop:0 #747474, stop:0.5 #c9c9c9, stop:1 #808080); + stop:0 #969696, stop:0.5 #c9c9c9, stop:1 #aaa); border: 1px outset #888; border-radius: 2px; min-width: 24px; @@ -139,7 +149,7 @@ QScrollBar::handle:horizontal { QScrollBar::handle:horizontal:hover { background: qlineargradient(spread:reflect, x1:0.5, y1:0, x2:0.5, y2:1, - stop:0 #747474, stop:0.5 #f0f0f0, stop:1 #808080); + stop:0 #969696, stop:0.5 #f0f0f0, stop:1 #aaa); } QScrollBar::handle:horizontal:pressed { @@ -151,7 +161,7 @@ QScrollBar::handle:horizontal:pressed { QScrollBar::handle:vertical { background: qlineargradient(spread:reflect, x1:0, y1:0.5, x2:1, y2:0.5, - stop:0 #747474, stop:0.5 #c9c9c9, stop:1 #808080); + stop:0 #969696, stop:0.5 #c9c9c9, stop:1 #aaa); border: 1px outset #888; border-radius: 2px; min-height: 24px; @@ -160,7 +170,7 @@ QScrollBar::handle:vertical { QScrollBar::handle:vertical:hover { background: qlineargradient(spread:reflect, x1:0, y1:0.5, x2:1, y2:0.5, - stop:0 #747474, stop:0.5 #f0f0f0, stop:1 #808080); + stop:0 #969696, stop:0.5 #f0f0f0, stop:1 #aaa); } QScrollBar::handle:vertical:pressed { @@ -201,6 +211,8 @@ QScrollBar::add-line:disabled, QScrollBar::sub-line:disabled { background: #747474; } +/* arrow button arrows */ + QScrollBar::left-arrow:horizontal, QScrollBar::right-arrow:horizontal, QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical { border: none; @@ -218,18 +230,23 @@ QScrollBar::right-arrow:horizontal:disabled { background-image: url(resources:sb QScrollBar::up-arrow:vertical:disabled { background-image: url(resources:sbarrow_up_d.png);} QScrollBar::down-arrow:vertical:disabled { background-image: url(resources:sbarrow_down_d.png);} +/* background for song editor and bb-editor */ TrackContainerView QFrame{ background-color: #49515b; } -nStateButton { +/* autoscroll, loop, stop behaviour toggle buttons */ + +nStateButton { max-height: 26px; max-width: 26px; min-height: 26px; min-width: 26px; } +/* gear button in tracks */ + trackOperationsWidget > QPushButton { max-height: 26px; max-width: 26px; @@ -260,15 +277,19 @@ trackOperationsWidget > QPushButton::menu-indicator:checked top: 3px; } -trackWidget { -/* border-bottom: 1px solid rgb(0, 0, 0);*/ +/* actually has no effect yet so disabled */ +/*trackWidget { +/* border-bottom: 1px solid rgb(0, 0, 0);*//* background-color: rgb(0, 0, 0); -} +}*/ + +/* font sizes */ + nameLabel, effectLabel, sf2InstrumentView > QLabel { font-size:10px; } - +/* main toolbar sliders (master vol, master pitch) */ automatableSlider::groove:vertical { background: rgba(0,0,0, 128); @@ -287,11 +308,14 @@ automatableSlider::handle:vertical { margin: -4px -12px -2px; } +/* window that shows up when you add effects */ EffectSelectDialog QScrollArea { background: #5b6571; } +/* the inner boxes in LADSPA effect windows */ + EffectControlDialog QGroupBox { background: #49515b; margin-top: 1ex; @@ -300,6 +324,8 @@ EffectControlDialog QGroupBox { border: 1px solid rgba(0,0,0, 64); } +/* the inner box titles when present (channel 1, channel 2...) */ + EffectControlDialog QGroupBox::title { subcontrol-origin: margin; subcontrol-position: top left; @@ -310,10 +336,14 @@ EffectControlDialog QGroupBox::title { padding: 2px 1px; } +/* main toolbar */ + QWidget#mainToolbar { background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #98a2a7, stop:1 #5b646f); } +/* smaller toolbars */ + QToolBar { background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #98a2a7, stop:1 #5b646f); } @@ -327,16 +357,22 @@ QToolButton, toolButton { color: black; } +/* separate corner rounding for play and stop buttons! */ + toolButton#playButton { - border-top-left-radius: 10px 6px; - border-bottom-left-radius: 10px 6px; + border-top-left-radius: 8px 6px; + border-bottom-left-radius: 8px 6px; } toolButton#stopButton { - border-top-right-radius: 10px 6px; - border-bottom-right-radius: 10px 6px; + border-top-right-radius: 8px 6px; + border-bottom-right-radius: 8px 6px; } +/* record and record-accompany can be styled with #recordButton and #recordAccompanyButton respectively */ + +/* all tool buttons */ + QToolButton:hover, toolButton:hover { background: qradialgradient(cx:0.3, cy:0.3, radius:0.8, fx:0.3, fy:0.3, stop:0 #e0e0e0, stop:0.5 #c9c9c9, stop:1 #969696 ); border: 1px solid rgba(0,0,0,128); @@ -358,6 +394,8 @@ QToolButton:checked, toolButton:checked { color: black; } +/* track label buttons - the part that contains the icon and track title */ + trackLabelButton { background-color: #5b6571; color: #c9c9c9; @@ -400,7 +438,7 @@ trackLabelButton:checked:pressed { background: qlineargradient(spread:reflect, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 #49515b, stop:0.3 #5b6571, stop:1 #6b7581 ); } - +/* sidebar, sidebar buttons */ SideBar { background: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop: 0 #98a2a7, stop: 1.0 #5b646f); @@ -410,13 +448,16 @@ SideBar QToolButton { font-size: 12px; } +/* font sizes for text buttons */ + FxMixerView QPushButton, EffectRackView QPushButton, ControllerRackView QPushButton { font-size: 10px; } -timeLine { +/* has no effect yet */ +/*timeLine { font-size: 8px; -} +}*/ QTreeView { alternate-background-color: #747474; @@ -522,9 +563,3 @@ palette:brighttext {color: #4afd85} palette:highlight {color: #202020} palette:highlightedtext {color: #ffffff} -/* Notes: - -lcd-spinbox colors: (12, 250, 150), (37, 57, 42) - - -*/ diff --git a/src/gui/widgets/knob.cpp b/src/gui/widgets/knob.cpp index 44b4449b5a..e03d2a6fc6 100644 --- a/src/gui/widgets/knob.cpp +++ b/src/gui/widgets/knob.cpp @@ -352,6 +352,7 @@ void knob::drawKnob( QPainter * _p ) } case knobDark_28: { + p.setPen( QPen( QApplication::palette().color( QPalette::Active, QPalette::WindowText ), 2 ) ); const float rb = qMax( ( radius - 10 ) / 3.0, 0.0 ); const float re = qMax( ( radius - 4 ), 0.0 ); From f6ee1dd25d6833b81304ff3c28432c8eb51663cb Mon Sep 17 00:00:00 2001 From: Vesa Date: Wed, 29 Jan 2014 00:49:46 +0200 Subject: [PATCH 80/80] New files --- data/themes/default/apply-selected.png | Bin 0 -> 344 bytes data/themes/default/bb_track_btn.png | Bin 0 -> 647 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 data/themes/default/apply-selected.png create mode 100644 data/themes/default/bb_track_btn.png diff --git a/data/themes/default/apply-selected.png b/data/themes/default/apply-selected.png new file mode 100644 index 0000000000000000000000000000000000000000..f4e79fb4d613956f8db7ad67bf36ac4d35f0776a GIT binary patch literal 344 zcmV-e0jK_nP)*+_z`GSWi<+q#-fl_7!<){u>^xbx1xcN$_l_$@bzH0u)XZuT}e*SH(7D>&OX`M z%HffFNh?VkN!4EtaO)}o-(2+rR6;+vu`3=WEhRli;#)~i)>XVo>cl`F zBz=0Iq36AdnN!-pQ+^Tn!mmA03v=B~6HjvA@e9DpfF6Lldk7c2GdA^rJg_kQBk&Tf z&ixo-Yi-0&z^kuoqJa_VbpjezJNkm-l+b2epIgQ>0oqC$pg41GfZJ&%Gb!OC0_~(7 q`J{v#@P29j?qA-L;QtSjIrt1o@Yx15QZP8`Px+i zZBayNiqsnt0z|0F1^!%r8z&Ae2M!>lN(hmVwB028<@I`Y*BmHqLed^kEX`?V9=&6~ z8Y|};l(eAHkt*qFq#volo(I6697NsdM%e(WBw_xu&kRp=xkyt?G#%V&LDg#LB*Er6WmzC1 z|2J|Lg#_afO4TqrB@IKYF<5KwA9*sFtR%G7m~US(aSRGd5scR4!3FbZjeNSh5 z8&_4tvnkWb7!l#2GW2@AB_%~s(0=ingTXPm*32$12!0LW;{wp{bXM%qXf_cYuiTZ0 z;CH(8_WOiEfYB+>pf

z&57o2$A5B6cgnqRZvVMt@qF=5ASZyhvBbDr+o=4n98+-g2)EHU14EGHN% z#!ecS^p67**0I)5Ye|pj^JT05$aLHE1p+$*`|X3awDwp(+8y=)&;@h=-HGLiRqKwf zz1sg(zYK2(uLBx@I(q1}KD4H+1D5YR=WGEMDoh8kc-8JzJ635MFh!d(U$ftp#Uc83507+C3GdO^0BMHXb{Mi*IsW2BIJ4aQJzH*aX}8!x6r z`g%H}>r3^;A|~$Fy0m+kVpv|16(AB=8Gl$9-W=XOX;1c)bLBJTH_JQlxDNRKxPMJw zp|2N?n5!+)gm>1vNCAsR;?AbfuPS+^s-pf0e?*Vyr>LWWAhR&3L*mIP zdE6WFc2!=lybnx?8r2K~HZ6phq(Ygpn#MwPDr;0yQ@D_FOTF{e#8(xdT$PGi?Y~*? zy{d545Y){i)x$PH zitJRB3A%#^r@QFfz=I6L!wx#ci-#$A@h{47P8bRz>Z%71vVSqQ${1tq(9y*-X-Jkd z|6X3+d%vHD{vuh{%{JW+zWfgF`+lGA|F4hr9SsNqL;KFWelhs?&|W)VN!HV42aqjt z$I&+c@B!UE)7Yw+zKO))Cr%IVe{2sB1-bx3>2(BX>Y4xuY3h+cEdJKi=VR|p&j5o! zXf4P_0JQw9Q-2p|n$|P^+MW~doP7U9;6b2U8KHFwkN}?L6lK||`;s2HrL6hmGpS=w zoqhEU1-Z?WjRFLKTWkD%_4w?;%DL1TZLTWZODkF_;=D5c(aaHGK;=XSw2nN`Ox><7 z=I5^-Kl^s}higY!s8sdKHTr_#BZ))1_X7_AfldIciGT3v9#8@@izhFBpZsR-ko06j z(=;u*bL3cb=jb+7*1nDa>Nr3R$Yo|1&Xup{zgUH9f!NIWODY%oW&jfKfI3jP{^9SR zdQ~q8;E#l+0RLt^XoWP~nq6_KR!W7?*ZjU&KocSq$N{j@#aX}x#Qgy1O)*0Lm~chu z#@Cm=1b-~RyI%nRmYK;hqsPCkzEnA7-6&*KZiKOpv7oic-K-Brc0c^IaK+N%x92|w z$|_vaxX0tVnxKZdgQ_y_&>1~2wY_Vo_qojMwF9Lqxtpqdy|n;MOAXcTA$6OoGyB`U z3T^KTMt6Mn_a&azy!kd7=J_2XD415d}Pbsa5xid|;Tq-Y`NyJ~1+x zUe3stY3W^g_x$Cyp15thwR^C-wWf!U_QwWxM0)#)4GuFBk5jAF5JFH`DQI={k+w%g z`+q=O3(#DP0WECql2YQjF1BrxFBGxtI#sJiyz@o;3cc4-Cve|2J#Bv-YYx+ Z{{pU!VZmRDUuXaT002ovPDHLkV1m-{($xR} delta 946 zcmV;j15NzX2hInODu4d~{{a7>y{D4^000SaNLh0L00l7s00l7tx9uoW00007bV*G` z2i*Y=6cQKbe_{^+00Ub|L_t(Y$E}r1Xk1kofWLDenaNBic4i#Y8Kt(9bcD7b)+)4u z7Ni@CSi!n*(P~}zXm?T&gf4t8Tvfr1Pn1FkDs)lMQoB*XSAP{th)shHNoq0^b32*$ zo!ooQanU~`r>nEB2k17r?ikAe zm_XF(F*lf&xaYo?2Zjgtt$PSa0=k^tRX1pYD7oy9Y=Ck#3OX z0BHN!Pz^AIv47@)Lz|Ahd;E?4z#Tv|FhZ;ppaDErF8CGgHm6MHX6Ee+Pnr7 zhc`!Gzj$))NMnpz{ZEs=(AvY>UL1HDxD5!c1aKu0hJTPi8OVcqq3g{cMm6V>JK`NWcY(zr8>H@nTI* z1N0_(wgWw@^`ITH=r{bTSNHw_5T-C&-&YH0K@=dxm9SBpX`BX{fVvd`qa}94N-JNL z&kap{4u3QNd8+_Dn;yF}Ye%iY@{BuFo@nHQ+$d`aV?ngZjjRu6b|xN|zM2{Ta`Ho< z5>%PCZt}PhOi(Mh!$D_dYfGUH(9Rq&yXruj~eBS!xCC9tmzc=*)Ph zSE4fUx6y%x4OO?zy@MO>3>f?nS3UdOYM%uVhQO<*E#R}p|wUU zZL~s`+nc>>;+snc&!5N_fyF>nH$cnfh_%5QNbXC1l+A72nn`7d_pL=Lg_Cu*{8gCM z=&RFG{`mIDxsIN=X1jHIU;jNzh2@|C*#TL=vdWzvZz~sPtabYue7jWo*mFmmZZ`Mc1bq zUwCJ{Gi{}~q#fIy!Q<>?jBhByG$ z8Ws0tyA=EmYprZ$UShyjqYvl<`hfocaC`6{Hh7L~7eF>RXxrGlKh{Z7Ks&JpQgLD( z{|CNUgh(VQpnsh_1^DjCy`C`6_Qf?9j?Hzf}rR;=^?Ye2!))xy;-raq(aPK9c&)&Lt zIdv|)Qw?<34WK$GaGj$=QzD|9j|(@J7T!MvD!|VdGk^DAE&uq|s2EcPT7ZpPPw&7+ z4f7qqnb>m*I0OXVXb_Ifp1JaI?Tc3`lpX+eAnJC%|9-%`b$Vd-^dojS$EcgnQj3y{D4^000SaNLh0L00l7s00l7tx9uoW00007bV*G` z2i*Y=6cZ^w1y1Dv00Fs4L_t(Y$L*ERYZE~jhM#X|XLo}pJ*W-XC2Amu6-0#k4-^mH z1+Ri&d#?vUPf|qCqy7idt9q#-6!9YTs+VH%ASOr*B(2rPO@A^oUUsF}nwStg<%5BN zVcuun`SA`6R|15yu18p?g?-N(COH|@!sq+;-OMl z`dFE+%x#_9%5T;;y2isF#X+{BKwVX5r7XA2j(J~Qt=?Z>S$_@a`8)I1qD$eu*3@o1 z2;lW`;Hxw0qKN43YWG%crS<~Y27at9uf1vPG&+sm_J1zW16B3_$1Dk-q%Adf*i}SJ(Y4&GWGPuB zp#ij0$UYaUp92z%*)T8FX{AKObCEkPU8&o*_GV|f^B6-bbzuIsMZW;11A?-5%^aTq P0000 diff --git a/data/themes/default/note_quarter.png b/data/themes/default/note_quarter.png index 6c3acf2cd6e01763d5ba450fe43ffa39ae7c8c97..acd47baabcb56d1cab98ed6483122e28c286e67b 100644 GIT binary patch delta 520 zcmV+j0{8u+1g8X$Dt`a~0002_L%V+f000SaNLh0L00l7s00l7tx9uoW00007bV*G` z2i^f04kH0Kp^T>h00Fc~L_t(Y$L*CrZ__{+#((~&xFn9!HdPuUkVu4zL>AUA6$2lj zVr1hJu<$*Qn7c5tu!00)MnZx$0|P>(O(n-p+t_jKyO+h5s((nW?1(Y1blbhp@1FN` z&skI}18{-v;fGh>-6y^N>F4oJAP3~OMzaRM0ya$B8fcUcG^+Gh1(Xm6K$Nx$pz%Ke z%P^zLMso$>TD7W!HDC=`18S6A;nkM0V6O6#?OVjnBGAg^mSI;XHtZWh%q|3**Mu8D z2S7xORUMR(+<&5F_qGrBUhF))`^@vaEtTa-FrNPqkut7pJ1EC;#~!qY+s_{zJ=hzL z{O&HDwujab48zgM*CGKwce)Ll{1Y(9LFJ385i?QNq$G~vM(oJ3xKNg z1(qXnfsXUEe_#$;FO8=27%f_oe5{V=@AHp;KLG&{UmMen^$%j>p286~=3@W=002ov KPDHLkU;%y{D4^000SaNLh0L00l7s00l7tx9uoW00007bV*G` z2i*Y=6ciJ-NCA)l00FQ`L_t(Y$L*E9i_}0E#($F!HutgTez@ocRBnZ9+{V`Cu&`IK zvlIUX{|~|X8cQ4N1I1nh?c@qUL^vbP?Z=r-LNfE(BzPQpB!9tjUzlc?d4BV}!#v|s zuM`jfm!G_P@cz>6VEpCv_m4mU$VD5S1^^e>a6M-NHUv6#_SXee5FbE{xFt~iPr#oN zR2}g)0M+y??HsHDYrq=NsJt4lwu%L(%}e$!5O>Nzt42_TU6a`G{vxc(`2g5DBisRc z03xE=I;bLfn}2Pt4DSygjrKAo_>ms1;ML(C+8iwz?Qr3J{?@`Py0Iq#-lMe!t2DV7;7!FZ&_d1Y-))Eam4+lVk~T5|d^rztYSArWBUC4t%PG2E%f`oQFSx4U9EJIwCJ} zP8KsF9dZ0FIsg*DHf@msR_3#Lw&*OLXL;u9`3b(~Q<$97_*7P3lNb4${A~#^O}@aY zMFG(B@A~`B#CfbX)hz@oi5!`4=4EkM90D3xooUlQ>o;;bpf#qlRk;8F002ovPDHLk FV1f~{@1Otx diff --git a/data/themes/default/note_sixteenth.png b/data/themes/default/note_sixteenth.png index 661bcb7be0043519a80ee0e6b452bd71aac3ad78..44c900cebdedf97bae68dde475624606309854aa 100644 GIT binary patch delta 1085 zcmV-D1j75)2-paaDt`a~0002_L%V+f000SaNLh0L00l7s00l7tx9uoW00007bV*G` z2i^f04kH${atUAn00ZSoL_t(Y$DLJMXk0}Y{^nfvmTa=gCe7{!7LqjvYEpt!OM|u# zwc?`UjXr2B(t@`V=|d3(17fLAkcyUy2nIxaXr(EQ57Am`sDDw3=_RPCn8e6#(;Sm+ z_m;DJ_MAQE%=nPmxTYIv_J?5xX6FCq|Nig)N5q{O0pJ9%>B%z(uei1ab{i=*t}Chu zfR&BgOxOT`2*4xCQX3J4&d93|o(?{{WjlaI04}~yss$*Wl>q>h$wH$u6nJy%=aFN( zq5%8=JOHG%Ab%SH_-{lyg#hC1cyaqjN54G27eG@bkg5P^(M~hfEQs?qZYc?QI2t>= z`@(@kWgx3`Z4`h3fT`;7>0{qNof}^`LniaKbu~*eKI1^=Cy)2@oVdAfQdI;FpS!ho zi$DAOk@L^1zbJi}$>oJ#HPp*B2k+|d-2OC?>XK*^wgo*kH;qU#oUK0;KbSTXvaQI zlUP*_01#+Jh$iH~Bb$$$RYnJ9-oJRlRJHgDg`WGlq=l*gs7@1h(p1R2iBv2>-ti8- z@xXWc-+$E;+AxnotX8HB04&|Oe&w~HzU1)i0Qq_OrZk}yoeF!F>snf_6{RzMB$^iYfHu`ec0a{yMAObH>fFKF3VDz4Q?}Q@4hfp^2TZ{p)0e=_(R5P#NjGwynUTM2F+;m@QE&Y#k zftS3<*Uo>N9Vy9`@}cLaGYYerO++H*ZX|!;4`9+dua)LPEo$XW{%5+LYwl=yxUSagw=BDmnpwK+U^Wp##d7>6>k-jl>kbIJyN?b;@{Ib*w)eB9cl`|SLX$#K(ej1JGQjI98{Oea>G2~ z8p#!?e<(E`?^`-IJH-WHRm#E2ueG!J^@bLIcVk@xg3SShLm_CI21+T?*)+*AEnF_& z$jdu7XD(3?$PT6bv2tf(E^4z%Xo^Cy@fM ze|u|WjNhlFfFSW~*RNkxD zdNQ>EX!hLl2U&-3!Z3@DR3;5smSNf^)O?N=<};s}=ao?a1@4$tXok17-*Sqa05*K` zuHX)#-MgQ-r7i%J<;`iTXs67t7tR4l1JKIoSl9jmLHDSykhpZV00000NkvXXu0mjf D0UG@I delta 1083 zcmV-B1jPH;2-XOYDu4d~{{a7>y{D4^000SaNLh0L00l7s00l7tx9uoW00007bV*G` z2i*Y=6cq(qhlPLu00ZMmL_t(Y$DLJgXj@ej|K0oEYtopeNwY3Z29-3e18sEvD>!8g znX*k~W3Ug}4XNl9-SEQ@{ZJ9gL_`WxCMZ~tf#_sT>j&9}V}H8MVaM88?B-f+X{$|_ zw8=}FyuA1N-n-Wiy%}*$WzB`dy>Rb6zkAN_cg~e?dxHRQ0a*LuiJgOi4)+s_syUTU z7#09tX3GX$1%L#=BPmi;lF0h|UWpyQ>)G%l02%t)`=o z^~SaV2maJ z*Q^WO>&;y_bZyW4Z~0Dr6k2guf>*A8{h`-dcLVSNsDG&jU@2^w1X`bt{BY09k>@YI zfBn1Jq3kx!xJd{hP4_qSggY8rgtBN=001PVp8DGlG=22UH}Qi*pZs|xf5Z3?00c}B27|N8~`9p17K4nx;1p@Oyb+_f!?trR>7JAfLeb|hmbU_j%0(SjEs|5oT8YU zRLRl0o_{y@oPG4&Lel78ijPRu%9I0uW7yND4h(iqe4p-K_?66Qmt-s~=JtAGbQ1t* zH;kVF*Z>$^rE@MwUIdUD?i>H=+}k5N)FJB^eMEu_cWhubGp>Cxd0YVSs$@ziVE{A$ znS8>SIQP!g{aVU6zXVR*(XHVJZYM=V7%iKZHh%~>00)2xAa50|x$DQKJ}B+`n!OK~ z*7E;2r=sK~v38X;yOLa)Fk^01OK`>=LWz{0DO?Z_;PMKumPMh|idhkrSufaF)|O-2 zL(PN|$=2<^M!%dsDWYSQ0Av7Oc(FFPEBIVvTjP_yI$zMXY&|oUxy(5S=bYY>LfRA$ zY=2}n%Z&B^voD`sOjiOZ9rnmkITqX<>}zR@#v_dp1blutj3FIO$Nxyqa>5{&al_X% zdt^_@y(KY_=^Q_u91#MrD{-*&Yi*X^Xb1)30bc{cjbYpwX@*wRz!-zNppq=~=5qPA z?~C0%b2-~J+&4Z6zyNUbE3Fhk4e^qVjDK@Djt#>!Ft4Ven>sXIgJBxbOw$o0G62p` z-M^m~_gRVDQq9N}3WLWyUd30E zsRN+sOgM*guG|sRGHcS=3=~;`?O4cbd0zZm|J?e~ItxG-j(LSzy?;9$JSN7)QJW}UQ70Z;)H%hIvp_!ni_tN8;xg%tn*002ovPDHLkV1hE9 B{pkPz diff --git a/data/themes/default/note_thirtysecond.png b/data/themes/default/note_thirtysecond.png index a3daee57927420c2b03de184fe65194e8346a90d..204325edc50e362425b569b75a47b9d45e5f3ca2 100644 GIT binary patch delta 1168 zcmV;B1aJGN391Q@Dt`a~0002_L%V+f000SaNLh0L00l7s00l7tx9uoW00007bV*G` z2i^f04kIjbe$dhY00cKlL_t(Y$DNf~Ok7nM$N%RpvoSL)Bg;Tj3J6^(ZDS%OL1J3# z7ENR00`DpfCUi&0L&1%JbQ7`I}deMwC{cb zfDeGnbb@3GxPKj{FmNEA%GYX-wVmwPzY-)PfG*RpIuRZsW16xs9TdOcGxp)0p4VIM z2FVD(xkT6EO{r_N<%b64Y@n0&MN*PSd1J$u&%6yFFTE!GD)MgwkiDs?t~nBx5?R}d zo^w53GIQg=nfL8B@vki2{j7u7>%0%<#}_V-4+2mDuzyTzz!Q-pjxD|;PhM>~7C13D z6dRs7Xy}IS*<5(Iv~l}3(;>1Nz>?Mp&w)r3B$~op1%0t?q_acm3H+fg$fpS*oU<@{ zjhTLuQ3Nz9--`V=-%5WE{X%ZU*>QGpxA)YeU4|0_EXAbIz|;@`9e}~FvIo4In(CUP zi!q%Ocz=E9-Lr?-jCLiqW$ z=y!GxepmTs{d53NoqO6tzcLLkY$eI0sut-3ISxNr7Hm-BnP5n z*ME=B+Oum)a;>O^73RJhZlS=pZ(~z_rGJmto$X7d3^_a+?B|W8 zd%8IelF)SH?+-4tZvFV_F2QZ9Dr_j*9vukWgcb4~-n)cyZ-wvqjbD^imRA=)P=p+> z2aExsGJo~t+%3b-s5LDafE0iPO(+ZMe1Gzs;I>t13(Ayv24R`}02kj-cqq5fSDok0 zg+IRtYm1AKOeVn?gA|oW#E7p=>j?%x1F$IM*m!v^-ZuXApVt7;JBw^ZU?(22&M*w5 zQYomaijWk6tSU&zNhq2MRn>LVbCw2?r@tNfDA+r!n80NKOXoULEEb7HN}P5Fbbmv~ zY&Zx?DWs@`xlj;uebb)jzoRa_m00{s|MNUMnLSTYsnIFag delta 1165 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 delta 1061 zcmV+=1ls%22*3!CDu4d~{{a7>y{D4^000SaNLh0L00l7s00l7tx9uoW00007bV*G` z2i*c17A-TNL8b8k00YfQL_t(Y$L*EPYg|H&LbB(KGjLxS6YQiDG?DJd19t!_Z%)hke^@t zY3bWu)4ilEJe@|Ag(w~Az>VyOpE|tIb$i*}0MUq*Ykzs-y5~+Ueg!lD7m%%QwDA6c zSF@>+`R*+2;pApmzcUh?GL&=MK;Y`r80eGM#h*jGb`f z`UVhg0~n=Lq!ePfw*tVAL*npNLPY>d6UD|s912JP;ntA<29R9>rPOeT!+b|=#~RK5 ztowlbfPeoEptj|II_S1)N<`E>Jn!%@F=Xp5umB@+7f^3IX)Ot5IM{8_)*qbM>9J*+ z0&E})z2r94YEou$^Sak+kjD2NP@ zwT@fQJa}~f$+`V=rSe3XAP87lU6HW0+0u!J67M-hXQtp3s7zOwEKZWKGpg2Kw*V_O zpMP3#%FeO;s6)9lMWsATE;~vu^jW7r4%qgb{f?7&N(HCDzH)_$LWy)Lt?KS(%7~KU zW_OcXvql(&c%DbKUgi2q^&;R&N{Zcnhi1FU;>uqbW2iUl)LQju>FllVfzZd#Z*(@O zuC3zv9s_T{t$LN^$vrzF6zgX zt@cVsE)32LKBvPPFaT2KNpmPsNgT&!9~y#l!Kv`~@N#_P0p!dp=A}d~@ra~lS{~Z+ fv;Uoc8jr@`^8ux{P0dZR00000NkvXXu0mjfLFNnE diff --git a/data/themes/default/note_triplethalf.png b/data/themes/default/note_triplethalf.png index 5c8a7e90c88eef94dc05180fde462abe3c09f7d0..a2c80fe194e01c05190e0af4b0977e49d1fd239f 100644 GIT binary patch delta 1080 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 Hu0mjf5kfX9 delta 702 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 bm!-b|(SizxToL0q00000NkvXXu0mjfS&3q& diff --git a/data/themes/default/note_tripletthirtysecond.png b/data/themes/default/note_tripletthirtysecond.png index 20e2ab65aa04fe356c3741144d9eb20e36cc41aa..9f8b31122b7c30c619b91a091e9d7c79774bdc9f 100644 GIT binary patch delta 1452 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 delta 679 zcmV;Y0$Ban1;quBDu4d~{{a7>y{D4^000SaNLh0L00l7s00l7tx9uoW00007bV*G` z2i*Y~6E7~Jue^T%00L4;L_t(Y$L&>3XcJKo{$_vk)9oga)L5Dn5sG*a#Giu^EJ(2z z6?^H)Uc73B9=z$*gSQIOo(mqNMbIL65GvcztT zRM0~QhR3q+%{TMCZ{`7e_OFe0xtDhfK!G*r0N_giZU&~c5L}h6OIKttPr3_0gn?*H zf|L9o0T9>DXq~x>xpTH<+fgm*uM}2ZFN`kC18@LTCD1P*)C52W(1ugUnnUKDY*)4~ zXJxfa`~YmjhJVijm2Z{e+~oYVrSYX%0N*7@kT$3x!BqfJ?UHsxzoI`f+KuDsSelYv z@?)ajKAToLmiJky4%RuN9#StmG3V9B`;BEu8Mi`_3Lvibskg|WF0m;}m8X>(g^9wP z45Id&?diM<*C4VTBtGXQFV``8iSC->R~t$&-6)X&UfYijFyb-Maa(jWk+ z#TP}_oHFmG29giFxYrB7kcqj!tAGFyr#JxsaIq$)#iBguNdN-iuRH53Y93Z=t4^2{ zm5}CPs?b+vcFCZWKBS)j5C_l(zye_FIeov^>y3PJKEqjaJ^-jU(i5g4lI14Md**#g z(Etmsa({^@c#&Vihd?)uDp_TaB6N^_cEuBM-h1fHNXd%eMTY?>0Ae_aoO#t8CyVks zmCr7h{Wt!wJLWzQlWDU)&;UdcLBhCc3?hSmiqc^K0(F%AFa9$;#-#h!Ey>K?!1!pX z(Y8gP%WgIUq7ahvO}ToFng7YK+ipB1@a;Ev=peA8zcA8y@74Ri?FTaK-3&BC`4|8I N002ovPDHLkV1ms$K_dVF diff --git a/data/themes/default/plugins.png b/data/themes/default/plugins.png index b7cff0117d47866f34eb5f60ebdc8842761f2a54..5ba9bc3c90e74d1d35f3122aa28cda84e107782b 100644 GIT binary patch delta 2097 zcmV-12+sGX5xx+RB!2{RLP=Bz2nYy#2xN!=000SaNLh0L01e3i01e3jueHZa0000P zbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$XyGcYrR9J2?XEXU(6I1>DZ_Y2e{cie{ir78&xpU9t@)N-eh4R!n00)}_uHxKfhpS4w z%MPlsbJYvaoqun9>Hy#T&eOjO!_0&Ea^=K9ouribzK18hy71)35~>JsSqORAI#(TI z|0TD3-=46vrtPOB4!4@`WPVT!HLZ4(a*CN)g8j zV@&MelUlw0=u6N4w&nwzJ$ts`g@r#LL>dIfm@L5R(&C-{dvF5xdX09gNxRhquEF6n ztn_cYEq@3@^7$fD(?>Xc=Kf$TU;Iq<{kOjWd>{doO+5#k1Q3ah9>D(${jZewwmorZ zPg6V?P_M1=;l+RP%8P$QN=ejM|32`H{M^0we%?9vv~!8_)^7{uj^*LX-nK_4!8^ET zyBX1KH^C7Ap_E4Y&N-a3Sm$uo;+)0zy}bm7(|<6X9@TR`OayRjENSxu9L>O8S;%+? zLP$@J>M`J)O@yt*T8q_|R4TRCgC`Eb1LH~kR1V&(!^7p#Qp{!HjXIpn!4GE-1n|8P zoCKAKT8ps;V-40O0DFu)nt}OzQa_o4*K6?D6x>r7LH%t7PK?1bvrq~51@JtHkYWfB zgMZx;HU?voddl}8lrWot<74nh1+H{Q>stxoQVZ@W!s-B0GJ*Pc3(geb^>z5_J~0AF zIdZ^PfM<4yYmM_9zUSi#K0H(a?ULiK%kZt~#A-nzd}RaPZ^6Aq81rG%Ky2apTkwrT z@a+8U>aVUN#mHM96=OWPEv`L{#3eS>Vt=@>YcKd`lth1QL0NdK0q->6M{}c)`A-X~ z8}MOgUkAjOMgUTwFvg&bP7bXwS|g=I?3ak2Y`|laaJ@U6(HgXM5+5y9`cy}cMpI)!eX0JCq_u1U+ z-43wjf)qms5LoNT7fU?()DOsH(qz(UGUY#< zahsUz{s2il7*J|BYsJSOUVmnJ;Tokl}d$~ znHkFEGEz#~ohIFGmsBcXZFPx_jSe$2^UTi9GCe&_x7%f{5g}7qJbyohl#(C_D3{Ch z`+cNaB=GJk-q@n-fndc6)WOi8*mf~1*WE^n4O&^oldj7yiB{@B9qM_rH>E- z&+`bwkV>UO5Cp77UHbh2rOF{bx^QS>9Ma`%dMYXl4wzk|f z#u&f=dbAHXXM_;HEKeT(n&-WIsMki{wqA04@ zqx$+vw7#|+)qmI5IwYI3C3%Ex)q6l~c--8bhOtror-QKgcc8Qb&c#Z1TFofhXt$zv zyV-2kYtj13twy)o>Fp5N5;8yws1JqKcZhBbuUo+G`8E_ni2J_y(D#bv$zOEZty?R% zZUpOV%N;cssC{OnfX0r&w}k4zV8{L2{dRw8?*SM>cq+i%z**o75bqG#Dbxh?K45!< b4l4fzs(Kid#R2p300000NkvXXu0mjf6qXj5 delta 2203 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 delta 1464 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 delta 1540 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 delta 452 zcmV;#0XzPk1cn5VBqa%ONLh0L01FcU01FcV0GgZ_00007bV*G`2h;}x1S>lwoICcB zTP%NkNkl232;;%4Nr&J_slieE^20`>X$w}OM5?icik@(&cd&el3q-8ZiQ0000gwlo_e{_3^gN8aAsW1l3yPqUh@jq8mY9R+Ax452#7NwD z5#xZOWD!(Q@gh+qAU?pGL`)8Q*rO0Of~*H$F>z<6r{B-&E)PaQVUy5X=c@XB_5XkW zk0P9Nf9zxpPVRr8)oML%>c-s?6~(Hmeu? z!#XC^Qh#)>A&TO2q9{V55+q52qDU|r4Nyu!f5^X8srLd^RyvF^Im%_q)zn(bv2RXXeFf~IBk}&1({S^Mk5Z41V zPu#J;+v$GZo3{t^?Rl7*4gd&}2-DegGI6HMKdyYUw%z$_+O+ZF(t@t*-?m%Uz;1W2 z%N}6Q!XkF>T10=Y3#(~$)Q0>i84bl+e*ge0k|b#o6(P$qR8@v$w4o{LRlgGuP8aRM z+_&8Y*R$zDQ4~n?3{eupab4tj2F5rXe+EDF5hXFAEKX_x2q7C@;6JJ;3Istwk|mHu z8LVQ6q6m)fV&YDJh>i05S^y#E@0Jpt+?tGcCrN^a+JGpED9aK_mcWaGF@UG|f9n_7 zwj%%UB75~dQ;vxOAii{REjFKDvP%hX19%vKadn$V2>FUryb`~8;rDA+;U7T%)qRKU zcIWA)Vcx4K3aX0bNs^s+!trSH__=j58mdY_76}JSS$2uPvzgscFyhE9lHIe<4D9}a zey4|yHHSt+MOkuqfsZX`oL|}cfAiqxOJ~2XGwp)b(vRu7exPZXm~XW)u)DZ*VGnNZ z_F*+!&^29F6y+2d4QoZafQlaxAb=18PAUKb7-Ps;3C0*$#ZdC z4ZeD@ss*4#7?r%bXF7B43Zf9I{P$2X#t^3oD)0|dKVGdH>4b9*G8(E{M4v&$mjUzv nB%EL!75^-GYvcS*zBPXVx!bilX7e^U00000NkvXXu0mjfH{sSz delta 1035 zcmV+m1oZo(2%rd%B!2{RLP=Bz2nYy#2xN!=000SaNLh0L00l7s00l7tx9uoW0000P zbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$Tok>JNR7i=Xl*@}8RTRd* zQ}3#&s(w~?wQ=HNz<(g1q9CYi9}F=IaT6jz42DRYxRDGEf`6D%5JAO_M3I2_0Jn-{ zkwp*}ZU!aHCI-iZba%b$R&~9u3&$X0#-TjxbH3j>_ni9?=N$hhCYzJTI-SmQmSH_0 zi?Y=4=GT;^Uv3}T{)9ivYibLiDQRPjKX3=`@o|5IuHA*Es3^)3K^)+=H~aqj?E1RY zwsSq!->}E_@qfPE!)P#qJ9J?g7NRtQD2T|H`4j!Le@1B4{V6gfQF>XHB*>BsMOL7z z8cbsak|=>_FOj3&1e&4^tGZH_#S$!M2;&d}37Go}qzx@PBTP19`xl|_+% zJ7?afH_qMoolcQy>6R8}an9f8$=_@L6JVdS9~litU$}$uWY8VJG)w?M!V)Zk#eC+? z*RO3{yMJ=G`hAydoHbUvcIUgE-P4_(gNZZ2us1;6G?;la)J;81v*a_H(i-37)xT-% z{|^Wok|gVjBtuaY=$Z!G>_As_h@uE00zikI(s{Vm1OQgcvP53wNLY$R;9*%TQC1cF z$VZe!NV61ao@T881lkUh@EJ{2K_nnsW>94XRexO}VJW=O!`z?$%q;fPT{ZSwvUS>W zYNh@Wz7H=<&I`6_Kcp!tIByD;WtYR)oBs0Z&Q+R{rbg;v z;(t`-RldvLPBLJ|>QfwbeD;J354(-GgbYD5|PnpeePob^#nGi3AW4i2gK_vMNzj zC90}IRadB+`u=Xvwc7wB09Lll_RcN52X#8mxoh0?0V=t7!0f_D*)WtvCSu0fsodP?GsK5&!@I07*qoL`3f=)34k#NbH>?(sNi2V)Nkl!0@+McYd@B3@xR#bUJq^hdQ z%vDttMNyVz0KkUsbSFQ2WQl*g`)@mU4z8Lx5s`>6Gc!Bq00aQOuN4OmY2#h!f!;ru z_~-M%*k7EgYST2j-S4di0M2*K;Ca^U z6@YfTD`$_d@W)waf4)egszlW9t$F~c(bh>#vj&-qPAdS#Ex(G{2|Iu1>Xu|X0RSJs z`Xq^tELkWC{bs0MJXwj3ZS<`XAio=aeKy#79eM!by_}}bsT0SP*XC0RpuBDBHe8Hy zGg2Q*HBD1hRZ&q@QEw`6nmz5B<9XflevNv`%gM&L698c5OSNPiezrij*fvB2Ao@@& z)g(z20#?C7R?2Fxl-WFPT5Yzjz4#fwnceJPzpTn%81btM|I7j~ho$DcY->0i{_9P) am-`Qe^XQ~N%*ti}0000(_; delta 478 zcmV<40U`dt1fT?vBqa%ONLh0L01FcU01FcV0GgZ_00007bV*G`2h;}x1TzV5Q1UO4 zTP%N;Nkl}4sA99=-HqAz_EHdoM1h!QnxoNZ?uGxB0K?(XTr>0TJP3mJm$qG6 z5m8lD_1-U+%QQ{1EDM3$Am;PIp=^7IBB26cjC>L zn-!_--QEkPLFaQvpj6eeES$^pJc^;J+C)GnM-_QhmWKq&?T2zs7aaiB2Cl3>Z#%{yJhTbmk)W4KadsYi30T8{9bg}9>7!3aPCO0npCyOP> ULv#HQegFUf07*qoM6N<$f>e>(MF0Q* diff --git a/data/themes/default/square_wave_active.png b/data/themes/default/square_wave_active.png index a79a22b98b98e0b2002db440aa7a2df8c337c85a..487b5aff74f5a1f795fbb26121483c85598d2ef6 100644 GIT binary patch delta 439 zcmV;o0Z9J&1Cs=hBo78+OGiWi000000Qp0^e~}>`3f=)34k#JNIn6qeNi2VNNkl4f26ot=y^Cq*zAZt*O6oLwZsKiE6#7;biA_|D#-wV+0o{$ zqde4o1n}W?fAFrl{XGKsapQmd{mT;u1Ofzu%(4Hr+O81+q)kn|olH_u6!nnYbob-N zwQnZbuUmffB+WG6Mi~J}YMSQwCqiM9Nx>B3=SBI6Cd56{6y6v;)vI zmzc**b7m(Ufa$a%uXf#Rg@TgYnMIHUKqhAvj0AwC#$^!h?t>6WQYL>gxVzCv$VBEf zN-`^lEHZ(R+y@y*5*Jo$l-UU^^K_Rp1K>)-1sbe>Fp>mne!o&_WODaqI5NrqJdink zapmm!7=TK%M9l_wH%POgsI$7fD)#!}qjl3%=(+Kw53K{>W*F{_%CC$4-Mt9lX?O46 hT|E4IDZ2ph8{~}t;8qV7;%Wc@002ovPDHLkV1n@P(;@%> delta 439 zcmV;o0Z9In1o;DyBqa%ONLh0L01FcU01FcV0GgZ_00007bV*G`2h;}x1p*gRz@o{K zTP%NXNkl@-lCH+sN|_XiM#0+yBuY9gGTaxIDbm hiwsZiHst`|FG$=7Nf(ewA^-pY07(Z$PDHLkV1oCN%Mkzo diff --git a/data/themes/default/style.css b/data/themes/default/style.css index d1a43900ab..8f2c0b699b 100644 --- a/data/themes/default/style.css +++ b/data/themes/default/style.css @@ -104,11 +104,15 @@ QScrollBar:vertical { margin: 13px 0px; } -visualizationWidget, cpuloadWidget { +visualizationWidget { background: none; border: none; } +cpuloadWidget { + border: none; + background: url(resources:cpuload_bg.png); +} /* scrollbar: trough clicky things */ QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal, diff --git a/data/themes/default/trackop.png b/data/themes/default/trackop.png index dcb8036e2ba698f510e4463cf7470842eb2c4ce3..bc089652ecd5fa3139d584eae9daad35261ea90a 100644 GIT binary patch delta 890 zcmV-=1BLwR1-AzwiBL{Q4GJ0x0000DNk~Le0000H0000H2nGNE06T3*`jH__e*-j0 zL_t(Ijb&6pOk7nIJ@?O_kvAHNR-2|Il}M0C1r2V5MblOxCM3Es!6lKv%2*JiI~O1< zTnNc9p<8Aajf|f_A^}{86bBe=f@rM9v}uJn#7Gwc&Y$`7-a9V(hm87?m%N*I&pjvS z-TOci)jN~PoU5EY&s+CA?^^&df0CG=pFj8Ce3EcbwH6l_-&IQ8otT(-5df4@&&6V~ zW&oF0R#qC7Qg;^?7Ty<;Y8c$=Kq>VNfOu0=)5`Ml^4ChKr$j_jsnkbGsd^EKCzHuC zfMx)xyEY&QFrh%Adp0N?PW_`6;|X2K~O3b3J>D(_!*Lqtgf!UF*Y{#rG#eo)YjIfL?l*W z*IN4|ElG%o<4Me;)ogFfi~jfE>vKnVp@z0pNL(7p=7}0F+9l2fe+$eE@y{ zaGxa8>Gbce>z)@81VLbZ-@m7n`i|s#uJ8L-0GuUBYb^laydXlRo>%%TIB(2u^rt7)^fGZ*r5s|317QXNQ>3QA< zySuw70Fd$V@r$8Bk6LRD00B-rnc?e5sL&c?2q0pNDemv@U!9qm*>rv1zoWIjvAMZ< zZ*On!u&1YIQbbf}f5mBklZ4i~}w@JsFO?e741z3ToDjUm Q=l}o!07*qoM6N<$f@0#Qb^rhX delta 684 zcmV;d0#p6B2kHeOiBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZzBe*$Mo zL_t(IjdfE!OJhM4J@+L~W5_lx1U9a0uo3(R5<3gEN)_4EHWo=C*a#N>ffONy)po+J zO6(*^NSEM02y7!+`~pFn4f7^>Z|>P*lVDc&z=atuGu(5}IUtGGb#ZZ#9-r&=daGWq zx8CcG%fl;NUS1YvW@dVgMq>p4e-eqr^4#3qG5|Chjg?d?)oV7Jh1YL{f z{1(82h_ppyd(=7uuojEOG9t2=%jF)XKDfTVE~siJ48x~HB5?!YGXTLf2;k0IyX5gwvbbUK|h$sT}NlJ_J(0!ZQ=L{Ve_Jge%0hzz1A$_h!eTCEl5f83RbERYlc zRMkF!ml4Hz&+}3uBF;HF=kA?z8~J>`>jA*}`g+$|+cw6CF$Tt%eh>sZo12^2t*x!B zwRWf9@Ar){2!cS2G3|Ul-vt0UJw0s!SXR|fB*&`!Di({`*W;g@ob)`;`!b@UBp*rs zj2mMhA|MG>eUCZ-z*-9te;My$;)98d$H&LtRrM=Lh{$h}JEcx5)n~VI_K_1WaHrApesj5M`_>p zd#XAM;9gb#E2DGHkbEY&Kyu*w{$Cjn4-X4r7W#w|YoQcQdw>ILt_geVfCMx-Ie2Lxl#szeP^ zOtor*(in@?AeNRU5?ZX$5N)W`RPBp_3Z>QswKQyv+GWcrd#>~Oz!qDaWHOV?e82fm z=KBUDF|)t+Q_HgH`KHmP{HD>Se>?z-B$W-rUvE zS8+Rzp#wh-16cAuNb|YR8~2QUIk(hI^^{ABs>Cv;=1O(kv|*bTyoIs(e>!29DcbyI zch||9hG(MYYHUJSp$Pfq#IXr%_<v1Z){= z&P}Afa)2-+fj!{#wXJV_e;+`!uB~?S)Gf(75mV6ANc{!p!^O`(0bqb+RyJpL{ZX*O z$_oiU5kUh0;;y0Fuig4EfI$GiljLJ(-w6FU4H1PP43KgRKOUIlSLLkx&8#(9Q-LJn=i&cw&&M@We@}V<3PKVazTS50Z`U}zPQo`y zLTP~zD9gqEfry?ccPk+Plpvyp?MPI3_r!~XpZ4tp09pG*?SmtW@`nP0K+(opIQ_mw zBNRtXgw)U=%n+#he;$t?+1R?@^e(!+sWF`LzRUJc92?819ZTQz%}9vRj>AfxmN`Na#Vjnj`PB!?&#t!nB?4leXg97ENLa3D&(bPV8i^N% zpZ)V_<|6w;x(t(LK4(2@6Q9 zuC4)KlDt6jB*|!20F!z3)S`Z)Dbw)nK>!13*K$i;I{?7b^}XwFI#Kb~`Q1N%0AS&) zyI%P>6hm1_5_hz3c;tpHcW(!n|cVkMU~{{qIB-5sXOT8jVx002ovPDHLkV1iLH Bw#@(l delta 725 zcmV;`0xJF72a^UNiBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZzBe*%z6 zL_t(Ijb&3!NK|1IJ@i&{jxHWkvM zpN&B-YEdM$sZD{abmJzX5CX9Y^C!d1d~e>&eDAxb#ppEFg$wuNe&=wx=N^zmeO{O! zNUhcRrGb%iO9Lad-pb$JS{l^Ff5qTIuEF0_=nC$)1Aw1Mw)u%<8vyhKgYCZO7kZ0KC>D}0Sv+Brq)Zq^|Q0wk&Y_I-J=b^F#WDHX3{asSKVb*H@J{mFC; znWp0`preGGAqaxcNgRPNP0u!m2j13Bd7YVl+o&TfN9D+coxcvg%7-?Z3vD#Fa`1KD zYN@jl+j3k&$2xibE48OTcC2PufBg7JU`1K%N=lkTq=zD|tVj&02~qlkVr{9gJy@IF=F9gb@Atmb!y1V@FfcIl zJTnaQ444`9zPY)1trqX@?mo%oe{xR%Sj>#=?d@yN*E2IT)LAZY^1%ty`@Mb z@|w-B(IM2q6r^Fzd%<<_i)b1S*w^ZADUgg75o~QetasD=|7c`T)Qqs(}iH!oPt)APfLXDeUj> zKbn}Bm6=frBEyuOMQKPHvwdr`7!P6?EIYIV->&OkH>8wTiAeK24@xNjfa|&ffUFS!fa5q7 zDP^!m!pxRZ>S{b5f0Y1O&CSg>mY0{mvnb}u3IqZXB7&xAP)fn`Jh{5M zdN+|sd}%z6`Qhp5f9bF5>+1_MGczBR%VqXF53cK8a>sE{DwTMCe*VLajg4z>5HiT5XZc z{7W<%{n&L~q|@mKlarHgJC4JS<8Uk%dncRC-gjLW{r&y7UjP`){2w#_%*^tV06ovU zeSCcU_0rN(0zd|U2S5Pe#l^+pVzKynDwUcA@X{q2KmQxfl^tPbOifL_J3Ku6DS#Vw f`77s>TwwkOC|wJ(#1!$h00000NkvXXu0mjfh%~WD delta 684 zcmV;d0#p6Q2kHeOiBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZzBe*$Mo zL_t(Ijct=ZOJh+G#n0RqS+ZmcV+gJqH<5r~XB}IKUm&v9X%zf8qSe}1?4n>RBC(2{ zg+d4{JS6+#KSW~@&Ark0=4@dSj5siGhq-sSGruz+iT8efexB~1YqeUXR;yL|vG4oo zkM|AUneY3hL?Y4feSZ!B;_>)we>@(a1%Mz3=3=o}BM5@h`!_;z5Hy?33D5JI0ImU4 zjWNprAR@aWvH)Ph7?Vk*QrANTTCG+|RZmi>)ZOFb;{|{z0D@s7fXmU*(V6@E`?N8p zkW41`DV094f{ z04)F@nKZ^EL`1?cB*`lP#e61o3l^8*0FFjSH^s`@wP zoI{_4s(#iw0Khp1k+->qe_=S#!2sj&@$qkxKS@GF+NxS!TwL4(fTN?M63Jhl=Y3OE zL{ao-X=!O?fbrnqV2t#PHzeil?d^#$44WjcNmcjTg zy1Kezt-Z0<-mI;ytvKh3udlD&D2fV0eSKWdt*x!W%5H3IR5mv^E1%{1{vR9!%R#`{ S!{Yz|002ovPDHLk0$_rf7C(9b diff --git a/data/themes/default/triangle_wave_active.png b/data/themes/default/triangle_wave_active.png index 79a4c6807df21cbcf2dcf92f055ee053611f3a0d..f3ef94abc01c8988b94af7827b8caaf88932e876 100644 GIT binary patch delta 521 zcmV+k0`~ox1eXMm8Gix*0059Gx`qG%00v@9M??Ss00000`9r&Z00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-vi84f8Br~X9W0004`Nkl>1lZl(P17_<66c(V03u>$W~Qn|QA{Qi@4W*;2&$^8KsC>gD+RFn ztr_Pw^Fs)L1J30pV`v`|_mpS(KTG^tvk%aB1~o zwIGA7`N8%=cRy>r@$P3CO>A&KrK;nv1x4NMb{!CE&8{c?oyDd7ar;?@H=zCeOy{J( zv*=Eyiw9GnF}pfnkAdXa%Xw*9)f!|}C&xLEug?`t1Aii*@#xz4UaPY=Oka7Xbv=8j z)iPA^I)2dBrd;h`h=A$iJDt5@`^iYMV1I!^<1eK(8>bI@H=o81peA~sF)FoTm;i`j zBAA`2`{1ehU10SjN#1!Y)c$18$V|zgYQ8;RlNASS$p*LnJ(piAg#L?%QE6rX0000< LMNUMnLIPld0o3gI literal 537 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F?i!z-ScU6XFWwGQVJEe$C8rorB{B z2j@*Lu47z0CwO>H^6=i}<-N-%^iW8wSxl@&OsrL0yj5HxTtcE+Lb6&?vQ1Jd8i=H% z+oh#Dq~vtuvRrw?S?>Kg)q zgQ1b3k&%O;2?&^)m;!-`d4+{}rMb;~8)s){7Z+zYcQv-s z85tcD9TO81n;jdQ9Ty)TpOBD{n2?a1oSc=Not>4HmzS4co1b4>P*_-4Qc_Y{T3S(2 zQCV48RaMn<;nr_ps4enzaSY**4L#_~caTAV?Lxkl^1nq(d^=bvm~+Bc+ma)=1N@^1{jQs+L)#ezlu^RI13H>s~WGh=7y?3)SZT&02; zHx4rGiWk@}5o|r@bKv(<&C9!#E9CuuT9iCmeolaMm625E)muH;tj8An81G<<4m`v9 zJul5|!HKO63bWi=6rPuHI>w8{AFJgE`|*)cE-k25^WYpeplcaCUHx3vIVCg!0D;h^ APXGV_ diff --git a/data/themes/default/usr_wave_active.png b/data/themes/default/usr_wave_active.png index 336ca87c6e85c49035eb2ccb979338742404fabc..2309967d5d47f9146c91c68006391321e9ef5e8d 100644 GIT binary patch delta 459 zcmV;+0W|)G1lj|T8Gix*0059Gx`qG%00v@9M??Ss00000`9r&Z00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-vi84f8AD)vb#0004JNklCS`PM5tnj>9mFqR0VYt!3uYTG&am zHz0@-Q83>-+YK72n3=7$01SXm6f*PDwYzdXlC7A&FPD2!HOB)_Zx`yzC3L%8-}eoG z*LtJvnZ*;=x_=ai0!ZF?$oT-m=VtBMTIo+^vIan_)%vO*&zSP&Gyu2B&c$P`DMa*v zie)8$)TZ2Ef1GL0Vek)1NrhrU6J$)e5)7RHC($#a&)AQBSI}R2A3ISz+piAG-(9j5kjEun8$jQ(I z1WbX@#1sfjtQJ@~J3G6$IJ>#Kxx0IKczSvPfwz}mqkk|Egak)MMn=a($Hc_MWyQr! zi;ItsPfkuw0ivdqtnBRUtgO7eywcLr#-9fQfT1+c)5S4_LpJo_-d-j{frg9c)6UF) zARwSDs1V2|=zBp$^a6{Ei9=cYkxj4fe!WqwxraSoW_iJW*PK$B=vTI3>kKWv+pLy! zT7Ua*h<^Rc@^$xwAD_GTmVZxj`-I7#e|~jn3ly-*|GM|&V&9^_J{L01ciprzS=SIsuAM MPgg&ebxsLQ08kdA(f|Me diff --git a/data/themes/default/white_noise_wave_active.png b/data/themes/default/white_noise_wave_active.png index 8c8fa9d7f8b1abd5ca1b1b19fcde6ad77c7c65ea..38b089c63d7ff48ee786656a620cae7281a88d3d 100644 GIT binary patch delta 518 zcmV+h0{Q*+1C<1j8Gix*0059Gx`qG%00v@9M??Ss00000`9r&Z00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-vi84f88#P}!%0004^NklvV27f~oT_yi!d#0V9>F&=% za`Cox`cYNXsep5f0F1}uG)=YEQc5BMKt#;U%pnBlTu~I(S_!~=Z>3-M!cn2~i=q8T z=_;u-uRE@Fnji%4Jpciqb?@5t*uTG@TVH;jg&Squ048;@(#TAOX-h zS&1whzRk%+VM6PL5hfnKJnNjS_kPX$>cNLx{i+*NCx1+AKVPP=G71dKYU+}b8&fB; z06+pzll=Ip4_zg1rHx4eK&(9S3V_)7#^=2EE(2~5fWcq@;@A{bU+Z}dpt`E`yk?HR z-&C_Qv2i#YN&q1Q05DNaY6bwPNwov{#V`M@j3;+NC07*qo IM6N<$g5&DqL;wH) delta 487 zcmV~_W=R;0Ri~|0r~*} z`vC*(0|W2_1Mma{=>!Dr1O?><1?B|?>jnqx2M6s32-64%-UtZl2o1aq4!jKywGR-t z5D>l)61Wl*vJ?~E6BL&e6y6jR-xL*%6&05i7mpVjavK|G8-E*U8yrs?98Vk^TpS!- z92{vK9BLgLbQ~O%8y-_0A739JARr+uAt5axAub>xFCihWAtI(CBO@XsBO@d)BqyLJ zFo`fUtTZ@nI6Z$oKukYCjX*+QLP&{7N{dQMi%L^dQ(0MAT8vs;TwGj_TwRb|UteEh zWMX4uV`OnUZ+mcbbaZufb$EDqd3kwydU{!*^&$WO0HaAn zK~xAGRl&;&!Y~j8(3?!sq>T^6suXnL2l??X#f?irP!Rh{lNq;q4)90eWJxP15lPc% zz^V09N!)s25Sn;#*MQHZlB6`w-7voUwtJ6l1c6gGzF;2Rt)K2@PCy)D&OPV&c^)+= z784AweJnCG_HLov%GZrs5;PW-_q!R1x2}LeweMXC!?5lE11U)b)Im0(0HMyX%$CJU d3I<#J_ySDLNX&Mrn*jg-002ovPDHLkV1jJnuQ~t# diff --git a/src/gui/widgets/cpuload_widget.cpp b/src/gui/widgets/cpuload_widget.cpp index 508581a742..f634a6b1ef 100644 --- a/src/gui/widgets/cpuload_widget.cpp +++ b/src/gui/widgets/cpuload_widget.cpp @@ -45,6 +45,7 @@ cpuloadWidget::cpuloadWidget( QWidget * _parent ) : setFixedSize( m_background.width(), m_background.height() ); m_temp = QPixmap( width(), height() ); + connect( &m_updateTimer, SIGNAL( timeout() ), this, SLOT( updateCpuLoad() ) ); @@ -66,7 +67,8 @@ void cpuloadWidget::paintEvent( QPaintEvent * ) if( m_changed == true ) { m_changed = false; - + + m_temp.fill( QColor(0,0,0,0) ); QPainter p( &m_temp ); p.drawPixmap( 0, 0, m_background ); From dbe80e9f2be631825eba67e29004778aa3056c14 Mon Sep 17 00:00:00 2001 From: Vesa Date: Sat, 25 Jan 2014 18:20:48 +0200 Subject: [PATCH 12/80] Peak controller artwork fix --- plugins/peak_controller_effect/artwork.png | Bin 30448 -> 26354 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/plugins/peak_controller_effect/artwork.png b/plugins/peak_controller_effect/artwork.png index 1c5d5defb7155bd556f21a726ab82bb2f30cd00a..31296ca909354ca9680d46b0fbbcd12de5cfaa15 100644 GIT binary patch delta 7620 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 FV1g}E8rA>+ From 14e9694ecc5023e81a21a2e6abcf06c4edc14e15 Mon Sep 17 00:00:00 2001 From: Hexasoft Date: Sat, 25 Jan 2014 17:37:05 +0100 Subject: [PATCH 13/80] Added a vocoder LADSPA plugin into the tree. --- plugins/ladspa_effect/swh/vocoder_1337.c | 456 +++++++++++++++++++++++ 1 file changed, 456 insertions(+) create mode 100644 plugins/ladspa_effect/swh/vocoder_1337.c diff --git a/plugins/ladspa_effect/swh/vocoder_1337.c b/plugins/ladspa_effect/swh/vocoder_1337.c new file mode 100644 index 0000000000..086faffb55 --- /dev/null +++ b/plugins/ladspa_effect/swh/vocoder_1337.c @@ -0,0 +1,456 @@ +/* vocoder.c + Version 0.3 + + LADSPA Unique ID: 1337 + + Version 0.31 + Added stereo output, renamed input/output ports, added, + added a control for stereo balance + + Version 0.3 + Added support for changing bands in real time 2003-12-09 + + Version 0.2 + Adapted to LADSPA by Josh Green + 15.6.2001 (for the LinuxTag 2001!) + + Original program can be found at: + http://www.sirlab.de/linux/ + Author: Achim Settelmeier + + Adapted to LMMS by Hexasoft (hexasoft.corp@free.fr) + + + Licence: GPL + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +*/ + + +/* not familiar with WINDOWS stuff. Saw this in other sources, it should be needed */ + +#ifdef WIN32 +#define _WINDOWS_DLL_EXPORT_ __declspec(dllexport) +int bIsFirstTime = 1; +void _init(); // forward declaration +#else +#define _WINDOWS_DLL_EXPORT_ +#endif + + +/*****************************************************************************/ +/* general includes */ +#include +#include +#include +#include + +/*****************************************************************************/ +/* LADSPA headers */ +#include + +/*****************************************************************************/ + + +#define LADSPA_UNIQUE_ID 1337 + +#define MAX_BANDS 16 /* max 16 bandsn should be increased */ +#define AMPLIFIER 16.0 + +struct bandpass +{ + LADSPA_Data c, f, att; + + LADSPA_Data freq; + LADSPA_Data low1, low2; + LADSPA_Data mid1, mid2; + LADSPA_Data high1, high2; + LADSPA_Data y; +}; + +struct bands_out{ + LADSPA_Data decay; + LADSPA_Data oldval; + LADSPA_Data level; /* 0.0 - 1.0 level of this output band */ +}; + +const LADSPA_Data decay_table[] = +{ + 1/100.0, + 1/100.0, 1/100.0, 1/100.0, + 1/125.0, 1/125.0, 1/125.0, + 1/166.0, 1/166.0, 1/166.0, + 1/200.0, 1/200.0, 1/200.0, + 1/250.0, 1/250.0, 1/250.0 +}; + +/* The port numbers for the plugin: */ + +#define PORT_FORMANT 0 /* the track to "vocodify */ +#define PORT_CARRIER 1 /* the track to control 1st track */ +#define PORT_OUTPUT 2 /* left output */ +#define PORT_OUTPUT2 3 /* right output */ +#define CTRL_BANDCOUNT 4 /* selected # of bands to use */ +#define CTRL_PAN 5 /* stereo balance for outputs */ +#define CTRL_BAND1LVL 6 /* start of bands level */ + +#define PORT_COUNT 6 + MAX_BANDS /* bands level */ + + +/* useful macros */ +#undef CLAMP +#define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) + +/* Instance data for the vocoder plugin */ +typedef struct { + LADSPA_Data SampleRate; + + int num_bands; /* current number of bands */ + float mainvol; /* main volume */ + + struct bandpass bands_formant[MAX_BANDS]; /* one structure per band */ + struct bandpass bands_carrier[MAX_BANDS]; /* one structure per band */ + struct bands_out bands_out[MAX_BANDS]; /* one structure per band */ + + /* Ports */ + + LADSPA_Data * portFormant; /* Formant signal port data location */ + LADSPA_Data * portCarrier; /* Carrier signal port data location */ + LADSPA_Data * portOutput; /* Output audio port data location */ + LADSPA_Data * portOutput2; /* Output audio port data location (copy of previous one) */ + LADSPA_Data * ctrlPan; /* PAN for output */ + LADSPA_Data * ctrlBandCount; /* Band count control */ + LADSPA_Data * ctrlBandLevels[MAX_BANDS]; /* level controls for each band */ + +} VocoderInstance; + +/*****************************************************************************/ + +/* Construct a new plugin instance. */ +LADSPA_Handle +instantiateVocoder(const LADSPA_Descriptor * Descriptor, + unsigned long SampleRate) { + VocoderInstance * vocoder; + + vocoder = (VocoderInstance *)malloc(sizeof(VocoderInstance)); + + if (vocoder == NULL) + return NULL; + + vocoder->SampleRate = (LADSPA_Data)SampleRate; + vocoder->num_bands = -1; + + return vocoder; +} + +/*****************************************************************************/ + +/* Initialise and activate a plugin instance. */ +void +activateVocoder(LADSPA_Handle Instance) { + VocoderInstance *vocoder = (VocoderInstance *)Instance; + int i; + + vocoder->mainvol = 1.0 * AMPLIFIER; + + for (i = 0; i < MAX_BANDS; i++) + vocoder->bands_out[i].oldval = 0.0; +} + +/*****************************************************************************/ + +/* Connect a port to a data location. */ +void +connectPortToVocoder(LADSPA_Handle Instance, + unsigned long Port, + LADSPA_Data * DataLocation) { + + VocoderInstance * vocoder; + + vocoder = (VocoderInstance *)Instance; + switch (Port) { + case PORT_FORMANT: /* formant port? */ + vocoder->portFormant = DataLocation; + break; + case PORT_CARRIER: /* carrier port? */ + vocoder->portCarrier = DataLocation; + break; + case PORT_OUTPUT: /* output port? */ + vocoder->portOutput = DataLocation; + break; + case PORT_OUTPUT2: /* output port? */ + vocoder->portOutput2 = DataLocation; + break; + case CTRL_BANDCOUNT: /* band count control? */ + vocoder->ctrlBandCount = DataLocation; + break; + case CTRL_PAN: /* Pan control? */ + vocoder->ctrlPan = DataLocation; + break; + default: /* a band level control? */ + if (Port >= CTRL_BAND1LVL && Port < CTRL_BAND1LVL + MAX_BANDS) + vocoder->ctrlBandLevels[Port - CTRL_BAND1LVL] = DataLocation; + break; + } +} + +/*****************************************************************************/ + +// vocoder_do_bandpasses /*fold00*/ +void vocoder_do_bandpasses(struct bandpass *bands, LADSPA_Data sample, + VocoderInstance *vocoder) +{ + int i; + for (i=0; i < vocoder->num_bands; i++) + { + bands[i].high1 = sample - bands[i].f * bands[i].mid1 - bands[i].low1; + bands[i].mid1 += bands[i].high1 * bands[i].c; + bands[i].low1 += bands[i].mid1; + + bands[i].high2 = bands[i].low1 - bands[i].f * bands[i].mid2 + - bands[i].low2; + bands[i].mid2 += bands[i].high2 * bands[i].c; + bands[i].low2 += bands[i].mid2; + bands[i].y = bands[i].high2 * bands[i].att; + } +} + +/* Run a vocoder instance for a block of SampleCount samples. */ +void +runVocoder(LADSPA_Handle Instance, + unsigned long SampleCount) +{ + VocoderInstance *vocoder = (VocoderInstance *)Instance; + int i, j, numbands, pan; + float a; + LADSPA_Data x, c; + float fl, fr; + + numbands = (int)(*vocoder->ctrlBandCount); + if (numbands < 1 || numbands > MAX_BANDS) numbands = MAX_BANDS; + + /* initialize bandpass information if num_bands control has changed, + or on first run */ + if (vocoder->num_bands != numbands) + { + vocoder->num_bands = numbands; + + for(i=0; i < numbands; i++) + { + memset(&vocoder->bands_formant[i], 0, sizeof(struct bandpass)); + + a = 16.0 * i/(double)numbands; // stretch existing bands + + if (a < 4.0) + vocoder->bands_formant[i].freq = 150 + 420 * a / 4.0; + else + vocoder->bands_formant[i].freq = 600 * pow (1.23, a - 4.0); + + c = vocoder->bands_formant[i].freq * 2 * M_PI / vocoder->SampleRate; + vocoder->bands_formant[i].c = c * c; + + vocoder->bands_formant[i].f = 0.4/c; + vocoder->bands_formant[i].att = + 1/(6.0 + ((exp (vocoder->bands_formant[i].freq + / vocoder->SampleRate) - 1) * 10)); + + memcpy(&vocoder->bands_carrier[i], + &vocoder->bands_formant[i], sizeof(struct bandpass)); + + vocoder->bands_out[i].decay = decay_table[(int)a]; + vocoder->bands_out[i].level = + CLAMP (*vocoder->ctrlBandLevels[i], 0.0, 1.0); + } + } + else /* get current values of band level controls */ + { + for (i = 0; i < numbands; i++) + vocoder->bands_out[i].level = CLAMP (*vocoder->ctrlBandLevels[i], + 0.0, 1.0); + } + + for (i=0; i < SampleCount; i++) + { + vocoder_do_bandpasses (vocoder->bands_carrier, + vocoder->portCarrier[i], vocoder); + vocoder_do_bandpasses (vocoder->bands_formant, + vocoder->portFormant[i], vocoder); + + vocoder->portOutput[i] = 0.0; + vocoder->portOutput2[i] = 0.0; + for (j=0; j < numbands; j++) + { + vocoder->bands_out[j].oldval = vocoder->bands_out[j].oldval + + (fabs (vocoder->bands_formant[j].y) + - vocoder->bands_out[j].oldval) + * vocoder->bands_out[j].decay; + x = vocoder->bands_carrier[j].y * vocoder->bands_out[j].oldval; + vocoder->portOutput[i] += x * vocoder->bands_out[j].level; + vocoder->portOutput2[i] += x * vocoder->bands_out[j].level; + } + /* treat paning + main volume */ + pan = (int)(*vocoder->ctrlPan); + fl = fr = 1.; + if (pan != 0) { /* no paning, don't compute useless values */ + if (pan > 0) { /* reduce left */ + fl = (100.-pan)/100.; + } else { + fr = (100.+pan)/100.; + } + } + /* apply volume and paning */ + vocoder->portOutput[i] *= vocoder->mainvol * fl; + vocoder->portOutput2[i] *= vocoder->mainvol * fr; + } +} + + +/*****************************************************************************/ + +/* Throw away a vocoder instance. */ +void +cleanupVocoder(LADSPA_Handle Instance) +{ + VocoderInstance * Vocoder; + Vocoder = (VocoderInstance *)Instance; + free(Vocoder); +} + +/*****************************************************************************/ + +LADSPA_Descriptor * g_psDescriptor = NULL; + +/*****************************************************************************/ + +/* _init() is called automatically when the plugin library is first + loaded. */ +void +_init() { + char ** pcPortNames; + LADSPA_PortDescriptor * piPortDescriptors; + LADSPA_PortRangeHint * psPortRangeHints; + int i; + + g_psDescriptor = (LADSPA_Descriptor *)malloc(sizeof(LADSPA_Descriptor)); + + if (g_psDescriptor) { + g_psDescriptor->UniqueID = LADSPA_UNIQUE_ID; + g_psDescriptor->Label = strdup("vocoder-lmms"); + g_psDescriptor->Properties = LADSPA_PROPERTY_HARD_RT_CAPABLE; + g_psDescriptor->Name = strdup("Vocoder for LMMS"); + g_psDescriptor->Maker = strdup("Achim Settelmeier (adapted to LADSPA by Josh Green, adapted to LMMS by Hexasoft)"); + g_psDescriptor->Copyright = strdup("GPL"); + g_psDescriptor->PortCount = PORT_COUNT; + piPortDescriptors = (LADSPA_PortDescriptor *)calloc(PORT_COUNT, + sizeof(LADSPA_PortDescriptor)); + g_psDescriptor->PortDescriptors + = (const LADSPA_PortDescriptor *)piPortDescriptors; + piPortDescriptors[PORT_FORMANT] + = LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO; + piPortDescriptors[PORT_CARRIER] + = LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO; + piPortDescriptors[PORT_OUTPUT] + = LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO; + piPortDescriptors[PORT_OUTPUT2] + = LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO; + piPortDescriptors[CTRL_BANDCOUNT] + = LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL; + piPortDescriptors[CTRL_PAN] + = LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL; + + pcPortNames = (char **)calloc(PORT_COUNT, sizeof(char *)); + g_psDescriptor->PortNames = (const char **)pcPortNames; + pcPortNames[PORT_FORMANT] = strdup("Formant-in"); + pcPortNames[PORT_CARRIER] = strdup("Carrier-in"); + pcPortNames[PORT_OUTPUT] = strdup("Output-out"); + pcPortNames[PORT_OUTPUT2] = strdup("Output2-out"); + pcPortNames[CTRL_BANDCOUNT] = strdup("Number of bands"); + pcPortNames[CTRL_PAN] = strdup("Left/Right"); + + psPortRangeHints = ((LADSPA_PortRangeHint *) + calloc(PORT_COUNT, sizeof(LADSPA_PortRangeHint))); + g_psDescriptor->PortRangeHints + = (const LADSPA_PortRangeHint *)psPortRangeHints; + psPortRangeHints[PORT_FORMANT].HintDescriptor = 0; + psPortRangeHints[PORT_CARRIER].HintDescriptor = 0; + psPortRangeHints[PORT_OUTPUT].HintDescriptor = 0; + psPortRangeHints[PORT_OUTPUT2].HintDescriptor = 0; + psPortRangeHints[CTRL_BANDCOUNT].HintDescriptor + = LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE + | LADSPA_HINT_INTEGER; + psPortRangeHints[CTRL_BANDCOUNT].LowerBound = 1; + psPortRangeHints[CTRL_BANDCOUNT].UpperBound = MAX_BANDS; + psPortRangeHints[CTRL_PAN].HintDescriptor + = LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE + | LADSPA_HINT_INTEGER; + psPortRangeHints[CTRL_PAN].LowerBound = -100; + psPortRangeHints[CTRL_PAN].UpperBound = +100; + + for (i=CTRL_BAND1LVL; i < CTRL_BAND1LVL + MAX_BANDS; i++) + { + piPortDescriptors[i] = LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL; + pcPortNames[i] = malloc (sizeof ("Band 99 Level")); + sprintf(pcPortNames[i], "Band %d Level", i - CTRL_BAND1LVL + 1); + psPortRangeHints[i].HintDescriptor + = LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE; + psPortRangeHints[i].LowerBound = 0; + psPortRangeHints[i].UpperBound = 1; + } + + g_psDescriptor->instantiate = instantiateVocoder; + g_psDescriptor->connect_port = connectPortToVocoder; + g_psDescriptor->activate = activateVocoder; + g_psDescriptor->run = runVocoder; + g_psDescriptor->run_adding = NULL; + g_psDescriptor->set_run_adding_gain = NULL; + g_psDescriptor->deactivate = NULL; + g_psDescriptor->cleanup = cleanupVocoder; + } +} + +/*****************************************************************************/ + +/* _fini() is called automatically when the library is unloaded. */ +void +_fini() { + long lIndex; + if (g_psDescriptor) { + free((char *)g_psDescriptor->Label); + free((char *)g_psDescriptor->Name); + free((char *)g_psDescriptor->Maker); + free((char *)g_psDescriptor->Copyright); + free((LADSPA_PortDescriptor *)g_psDescriptor->PortDescriptors); + for (lIndex = 0; lIndex < g_psDescriptor->PortCount; lIndex++) + free((char *)(g_psDescriptor->PortNames[lIndex])); + free((char **)g_psDescriptor->PortNames); + free((LADSPA_PortRangeHint *)g_psDescriptor->PortRangeHints); + free(g_psDescriptor); + } +} + +/*****************************************************************************/ + +/* Return a descriptor of the requested plugin type. Only one plugin + type is available in this library. */ +const LADSPA_Descriptor * +ladspa_descriptor(unsigned long Index) { + if (Index == 0) + return g_psDescriptor; + else + return NULL; +} + +/*****************************************************************************/ + +/* EOF */ From fa0201ffd7c63d42a8aaa038d0c177afdc2eac22 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 25 Jan 2014 20:41:20 +0100 Subject: [PATCH 14/80] AUTHORS: small updates & typo fixes --- AUTHORS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AUTHORS b/AUTHORS index 8650caad18..579d21dd92 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,6 +1,6 @@ Tobias Doerffel - Maintainer, main-development, artwork etc. + Development Manager Jonathan Aquilina @@ -32,7 +32,7 @@ Andreas Brandmaier Juan Fabián Simón - Version 4.0 plugin artwork + Version 0.4 plugin artwork Sebastian Tilsch From 2116cf840b5589379f013e06304d91303e2b33a4 Mon Sep 17 00:00:00 2001 From: "Raine M. Ekman" Date: Sat, 25 Jan 2014 21:48:24 +0200 Subject: [PATCH 15/80] OpulenZ: Velocity works OK now. --- plugins/opl2/fmopl.c | 2 +- plugins/opl2/opl2instrument.cpp | 138 ++++++++++++++++++++++++-------- plugins/opl2/opl2instrument.h | 13 ++- 3 files changed, 119 insertions(+), 34 deletions(-) diff --git a/plugins/opl2/fmopl.c b/plugins/opl2/fmopl.c index 2b0e82b0cc..db5180189c 100644 --- a/plugins/opl2/fmopl.c +++ b/plugins/opl2/fmopl.c @@ -596,7 +596,7 @@ static void init_timetables( FM_OPL *OPL , int ARRATE , int DRRATE ) OPL->AR_TABLE[i] = rate / ARRATE; OPL->DR_TABLE[i] = rate / DRRATE; } - for (i = 60;i < 76;i++) + for (i = 60;i < 75;i++) { OPL->AR_TABLE[i] = EG_AED-1; OPL->DR_TABLE[i] = OPL->DR_TABLE[60]; diff --git a/plugins/opl2/opl2instrument.cpp b/plugins/opl2/opl2instrument.cpp index ab94eb8344..0718a3796c 100644 --- a/plugins/opl2/opl2instrument.cpp +++ b/plugins/opl2/opl2instrument.cpp @@ -23,8 +23,7 @@ */ // TODO: -// - Velocity (and aftertouch) sensitivity -// * in FM mode: OP2 level, add mode: OP1 and OP2 levels +// - Better voice allocation: long releases get cut short :( // - .sbi (or similar) file loading into models // - RT safety = get rid of mutex = make emulator code thread-safe @@ -92,6 +91,9 @@ Plugin * PLUGIN_EXPORT lmms_plugin_main( Model *, void * _data ) // the emulator code isn't really ready for threads QMutex opl2instrument::emulatorMutex; +// Weird ordering of voice parameters +const unsigned int adlib_opadd[9] = {0x00, 0x01, 0x02, 0x08, 0x09, 0x0A, 0x10, 0x11, 0x12}; + opl2instrument::opl2instrument( InstrumentTrack * _instrument_track ) : Instrument( _instrument_track, &OPL2_plugin_descriptor ), m_patchModel( 0, 0, 127, this, tr( "Patch" ) ), @@ -139,10 +141,11 @@ opl2instrument::opl2instrument( InstrumentTrack * _instrument_track ) : InstrumentPlayHandle * iph = new InstrumentPlayHandle( this ); engine::mixer()->addPlayHandle( iph ); + // Voices are laid out in a funny way... + // adlib_opadd = {0x00, 0x01, 0x02, 0x08, 0x09, 0x0A, 0x10, 0x11, 0x12}; + // Create an emulator - samplerate, 16 bit, mono - // CTemuopl is the better one, CKemuopl kinda sucks (some sounds silent, pitch goes flat after a while) emulatorMutex.lock(); - // theEmulator = new CKemuopl(engine::mixer()->processingSampleRate(), true, false); theEmulator = new CTemuopl(engine::mixer()->processingSampleRate(), true, false); theEmulator->init(); // Enable waveform selection @@ -161,6 +164,7 @@ opl2instrument::opl2instrument( InstrumentTrack * _instrument_track ) : for(int i=1; i<9; ++i) { voiceNote[i] = OPL2_VOICE_FREE; + voiceLRU[i] = i; } connect( engine::mixer(), SIGNAL( sampleRateChanged() ), @@ -225,39 +229,95 @@ void opl2instrument::reloadEmulator() { emulatorMutex.unlock(); for(int i=1; i<9; ++i) { voiceNote[i] = OPL2_VOICE_FREE; + voiceLRU[i] = i; } updatePatch(); } +// This shall only be called from code protected by the holy Mutex! +void opl2instrument::setVoiceVelocity(int voice, int vel) { + int vel_adjusted; + // Velocity calculation, some kind of approximation + // Only calculate for operator 1 if in adding mode, don't want to change timbre + if( fm_mdl.value() == false ) { + vel_adjusted = 63 - ( op1_lvl_mdl.value() * vel/127.0) ; + } else { + vel_adjusted = 63 - op1_lvl_mdl.value(); + } + theEmulator->write(0x40+adlib_opadd[voice], + ( (int)op1_scale_mdl.value() & 0x03 << 6) + + ( vel_adjusted & 0x3f ) ); + + + vel_adjusted = 63 - ( op2_lvl_mdl.value() * vel/127.0 ); + // vel_adjusted = 63 - op2_lvl_mdl.value(); + theEmulator->write(0x43+adlib_opadd[voice], + ( (int)op2_scale_mdl.value() & 0x03 << 6) + + ( vel_adjusted & 0x3f ) ); + // printf("vel %d for voice %d (%f)\n",vel_adjusted,voice,op2_lvl_mdl.value() ); +} + +// Pop least recently used voice - why does it sometimes lose a voice (mostly 0)? +int opl2instrument::popVoice() { + int tmp = voiceLRU[0]; + for( int i=0; i<8; ++i) { + voiceLRU[i] = voiceLRU[i+1]; + } + voiceLRU[8] = OPL2_NO_VOICE; + /* printf("pop: %d %d %d %d %d %d %d %d %d \n", + voiceLRU[0],voiceLRU[1],voiceLRU[2], + voiceLRU[3],voiceLRU[4],voiceLRU[5], + voiceLRU[6],voiceLRU[7],voiceLRU[8]); */ + return tmp; +} + +int opl2instrument::pushVoice(int v) { + int i; + for(i=8; i>0; --i) { + if( voiceLRU[i-1] != OPL2_NO_VOICE ) { + break; + } + } + voiceLRU[i] = v; + /*printf("%d %d %d %d %d %d %d %d %d \n", + voiceLRU[0],voiceLRU[1],voiceLRU[2], + voiceLRU[3],voiceLRU[4],voiceLRU[5], + voiceLRU[6],voiceLRU[7],voiceLRU[8]); */ + return i; +} + bool opl2instrument::handleMidiEvent( const midiEvent & _me, const midiTime & _time ) { emulatorMutex.lock(); - int key, vel, tmp_pb; - static int lastvoice=0; + int key, vel, voice, tmp_pb; + switch(_me.m_type) { case MidiNoteOn: // to get us in line with MIDI(?) key = _me.key() +12; vel = _me.velocity(); - for(int i=lastvoice+1; i!=lastvoice; ++i,i%=9) { - if( voiceNote[i] == OPL2_VOICE_FREE ) { - theEmulator->write(0xA0+i, fnums[key] & 0xff); - theEmulator->write(0xB0+i, 32 + ((fnums[key] & 0x1f00) >> 8) ); - voiceNote[i] = key; - velocities[key] = vel; - lastvoice=i; - break; - } + + voice = popVoice(); + if( voice != OPL2_NO_VOICE ) { + // Turn voice on, NB! the frequencies are straight by voice number, + // not by the adlib_opadd table! + theEmulator->write(0xA0+voice, fnums[key] & 0xff); + theEmulator->write(0xB0+voice, 32 + ((fnums[key] & 0x1f00) >> 8) ); + setVoiceVelocity(voice, vel); + voiceNote[voice] = key; + velocities[key] = vel; + // printf("%d %d\n",voice,vel); } break; case MidiNoteOff: key = _me.key() +12; - for(int i=0; i<9; ++i) { - if( voiceNote[i] == key ) { - theEmulator->write(0xA0+i, fnums[key] & 0xff); - theEmulator->write(0xB0+i, (fnums[key] & 0x1f00) >> 8 ); - voiceNote[i] = OPL2_VOICE_FREE; + for(voice=0; voice<9; ++voice) { + if( voiceNote[voice] == key ) { + theEmulator->write(0xA0+voice, fnums[key] & 0xff); + theEmulator->write(0xB0+voice, (fnums[key] & 0x1f00) >> 8 ); + voiceNote[voice] = OPL2_VOICE_FREE; + pushVoice(voice); } } velocities[key] = 0; @@ -268,22 +328,32 @@ bool opl2instrument::handleMidiEvent( const midiEvent & _me, if( velocities[key] != 0) { velocities[key] = vel; } + for(voice=0; voice<9; ++voice) { + if(voiceNote[voice] == key) { + setVoiceVelocity(voice, vel); + } + } break; case MidiPitchBend: // Update fnumber table - tmp_pb = (2*BEND_CENTS)*((float)_me.m_data.m_param[0]/16383)-BEND_CENTS; + // Pitchbend should be in the range 0...16383 but the new range knob gets it wrong. + // tmp_pb = (2*BEND_CENTS)*((float)_me.m_data.m_param[0]/16383)-BEND_CENTS; + + // Something like 100 cents = 8192, but offset by 8192 so the +/-100 cents range goes from 0...16383? + tmp_pb = ( _me.m_data.m_param[0]-8192 ) * BEND_CENTS / 8192; + + printf("Pitch bend: %d -> %d cents\n",_me.m_data.m_param[0],tmp_pb); if( tmp_pb != pitchbend ) { pitchbend = tmp_pb; tuneEqual(69, 440.0); } // Update pitch of sounding notes - for( int i=0; i<9; ++i ) { - if( voiceNote[i] != OPL2_VOICE_FREE ) { - theEmulator->write(0xA0+i, fnums[voiceNote[i] ] & 0xff); - theEmulator->write(0xB0+i, 32 + ((fnums[voiceNote[i]] & 0x1f00) >> 8) ); + for( int v=0; v<9; ++v ) { + if( voiceNote[v] != OPL2_VOICE_FREE ) { + theEmulator->write(0xA0+v, fnums[voiceNote[v] ] & 0xff); + theEmulator->write(0xB0+v, 32 + ((fnums[voiceNote[v]] & 0x1f00) >> 8) ); } } - // printf("Pitch bend: %d\n", pitchbend); break; default: printf("Midi event type %d\n",_me.m_type); @@ -393,16 +463,14 @@ void opl2instrument::loadSettings( const QDomElement & _this ) } -// Load a preset in binary form +// Load a patch into the emulator void opl2instrument::loadPatch(unsigned char inst[14]) { - const unsigned int adlib_opadd[] = {0x00, 0x01, 0x02, 0x08, 0x09, 0x0A, 0x10, 0x11, 0x12}; - emulatorMutex.lock(); for(int v=0; v<9; ++v) { theEmulator->write(0x20+adlib_opadd[v],inst[0]); // op1 AM/VIB/EG/KSR/Multiplier theEmulator->write(0x23+adlib_opadd[v],inst[1]); // op2 - theEmulator->write(0x40+adlib_opadd[v],inst[2]); // op1 KSL/Output Level - theEmulator->write(0x43+adlib_opadd[v],inst[3]); // op2 + // theEmulator->write(0x40+adlib_opadd[v],inst[2]); // op1 KSL/Output Level - these are handled by noteon/aftertouch code + // theEmulator->write(0x43+adlib_opadd[v],inst[3]); // op2 theEmulator->write(0x60+adlib_opadd[v],inst[4]); // op1 A/D theEmulator->write(0x63+adlib_opadd[v],inst[5]); // op2 theEmulator->write(0x80+adlib_opadd[v],inst[6]); // op1 S/R @@ -478,10 +546,16 @@ void opl2instrument::updatePatch() { inst[12] = 0; inst[13] = 0; - // Not part of the patch per se + // Not part of the per-voice patch info theEmulator->write(0xBD, (trem_depth_mdl.value() ? 128 : 0 ) + (vib_depth_mdl.value() ? 64 : 0 )); + // have to do this, as the level knobs might've changed + for( int voice = 0; voice < 9 ; ++voice) { + if(voiceNote[voice]!=OPL2_VOICE_FREE) { + setVoiceVelocity(voice, velocities[voiceNote[voice]] ); + } + } loadPatch(inst); } diff --git a/plugins/opl2/opl2instrument.h b/plugins/opl2/opl2instrument.h index 7c81ba1924..af2493f95a 100644 --- a/plugins/opl2/opl2instrument.h +++ b/plugins/opl2/opl2instrument.h @@ -34,6 +34,9 @@ #include "pixmap_button.h" #define OPL2_VOICE_FREE 255 +#define OPL2_NO_VOICE 255 +// The "normal" range for LMMS pitchbends +#define BEND_CENTS 100 class opl2instrument : public Instrument { @@ -109,19 +112,27 @@ private: fpp_t frameCount; short *renderbuffer; int voiceNote[9]; + // Least recently used voices + int voiceLRU[9]; // 0 - no note, >0 - note on velocity int velocities[128]; // These include both octave and Fnumber int fnums[128]; // in cents, range defaults to +/-100 cents (should this be changeable?) int pitchbend; - #define BEND_CENTS 100 + + + + int popVoice(); + int pushVoice(int v); int Hz2fnum(float Hz); static QMutex emulatorMutex; + void setVoiceVelocity(int voice, int vel); }; + class opl2instrumentView : public InstrumentView { Q_OBJECT From 1f351439275a4b7dcfcf3f1a6c003646f27e5fac Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 25 Jan 2014 20:49:02 +0100 Subject: [PATCH 16/80] Fader: fixed drawing of peaks As the fader background graphics recently have changed, the code for drawing the peaks had to be fixed as well. --- src/gui/widgets/fader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/widgets/fader.cpp b/src/gui/widgets/fader.cpp index b9f3016633..f2dc4c5fd8 100644 --- a/src/gui/widgets/fader.cpp +++ b/src/gui/widgets/fader.cpp @@ -290,7 +290,7 @@ void fader::paintEvent( QPaintEvent * ev) if( m_persistentPeak_L > 0.05 ) { - painter.fillRect( QRect( 2, persistentPeak_L, 4, 1 ), (m_persistentPeak_L < 1.0 )? QColor( 74, 253, 133) : QColor( 255, 100, 100)); + painter.fillRect( QRect( 2, persistentPeak_L, 7, 1 ), (m_persistentPeak_L < 1.0 )? QColor( 74, 253, 133) : QColor( 255, 100, 100)); } int peak_R = calculateDisplayPeak( m_fPeakValue_R - m_fMinPeak ); @@ -299,7 +299,7 @@ void fader::paintEvent( QPaintEvent * ev) if( m_persistentPeak_R > 0.05 ) { - painter.fillRect( QRect( 16, persistentPeak_R, 4, 1 ), (m_persistentPeak_R < 1.0 )? QColor( 74, 253, 133) : QColor( 255, 100, 100)); + painter.fillRect( QRect( 14, persistentPeak_R, 7, 1 ), (m_persistentPeak_R < 1.0 )? QColor( 74, 253, 133) : QColor( 255, 100, 100)); } // knob From 3a827f061f71541d7373ee9453f14a4a9425a11d Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 25 Jan 2014 23:52:25 +0100 Subject: [PATCH 17/80] Reworked MIDI event handling in InstrumentTrack and renamed MIDI classes The MIDI event handling in InstrumentTrack was complex and buggy. It has been simplified now such that processInEvent() tries to handle note on, note off and key pressure events. The actions taken should result in equivalent calls to processOutEvent() by NotePlayHandle instances. The processOutEvent() function sends according MIDI events to the attached instruments. All unhandled MIDI events are directly forwarded to the instrument in processInEvent(). It's possible that some corner-cases are not handled yet with the new code and we have regressions now. Furthermore renamed midiTime/midiEvent to MidiTime/MidiEvent to match coding style. Closes #72. --- include/AutomationEditor.h | 8 +- include/AutomationPattern.h | 14 +- include/AutomationTrack.h | 4 +- include/Instrument.h | 6 +- include/InstrumentTrack.h | 12 +- include/{midi.h => Midi.h} | 144 +-------------- include/MidiAlsaSeq.h | 6 +- include/MidiClient.h | 14 +- include/MidiController.h | 8 +- include/MidiEvent.h | 209 ++++++++++++++++++++++ include/MidiEventProcessor.h | 14 +- include/MidiPort.h | 15 +- include/{midi_time.h => MidiTime.h} | 58 +++--- include/MidiWinMM.h | 6 +- include/RemotePlugin.h | 11 +- include/SampleRecordHandle.h | 2 +- include/SampleTrack.h | 8 +- include/TrackContainerView.h | 6 +- include/bb_track.h | 4 +- include/bb_track_container.h | 2 +- include/note.h | 40 ++--- include/note_play_handle.h | 24 ++- include/panning.h | 4 +- include/pattern.h | 4 +- include/piano_roll.h | 14 +- include/song.h | 4 +- include/song_editor.h | 2 +- include/timeline.h | 26 +-- include/track.h | 36 ++-- include/volume.h | 4 +- plugins/flp_import/FlpImport.cpp | 3 +- plugins/midi_import/MidiImport.cpp | 13 +- plugins/midi_import/MidiImport.h | 6 +- plugins/opl2/opl2instrument.cpp | 23 ++- plugins/opl2/opl2instrument.h | 3 +- plugins/vestige/vestige.cpp | 8 +- plugins/vestige/vestige.h | 6 +- plugins/zynaddsubfx/LocalZynAddSubFx.cpp | 32 ++-- plugins/zynaddsubfx/LocalZynAddSubFx.h | 5 +- plugins/zynaddsubfx/RemoteZynAddSubFx.cpp | 7 +- plugins/zynaddsubfx/ZynAddSubFx.cpp | 16 +- plugins/zynaddsubfx/ZynAddSubFx.h | 3 +- src/core/AutomationPattern.cpp | 18 +- src/core/InstrumentFunctions.cpp | 2 +- src/core/Piano.cpp | 5 +- src/core/RemotePlugin.cpp | 12 +- src/core/SampleRecordHandle.cpp | 2 +- src/core/bb_track_container.cpp | 12 +- src/core/midi/MidiAlsaSeq.cpp | 80 ++++----- src/core/midi/MidiClient.cpp | 57 +++--- src/core/midi/MidiController.cpp | 11 +- src/core/midi/MidiPort.cpp | 58 +++--- src/core/midi/MidiWinMM.cpp | 18 +- src/core/note.cpp | 8 +- src/core/note_play_handle.cpp | 48 +++-- src/core/song.cpp | 8 +- src/core/timeline.cpp | 16 +- src/core/track.cpp | 80 ++++----- src/gui/AutomationEditor.cpp | 33 ++-- src/gui/AutomationPatternView.cpp | 6 +- src/gui/ControllerConnectionDialog.cpp | 10 +- src/gui/PianoView.cpp | 14 +- src/gui/TrackContainerView.cpp | 4 +- src/gui/piano_roll.cpp | 126 +++++++------ src/gui/song_editor.cpp | 22 +-- src/tracks/AutomationTrack.cpp | 10 +- src/tracks/InstrumentTrack.cpp | 206 +++++++++------------ src/tracks/SampleTrack.cpp | 8 +- src/tracks/bb_track.cpp | 12 +- src/tracks/pattern.cpp | 72 ++++---- 70 files changed, 901 insertions(+), 891 deletions(-) rename include/{midi.h => Midi.h} (53%) create mode 100644 include/MidiEvent.h rename include/{midi_time.h => MidiTime.h} (62%) diff --git a/include/AutomationEditor.h b/include/AutomationEditor.h index d725366a4d..1e37cd9b42 100644 --- a/include/AutomationEditor.h +++ b/include/AutomationEditor.h @@ -31,7 +31,7 @@ #include "lmms_basics.h" #include "JournallingObject.h" -#include "midi_time.h" +#include "MidiTime.h" #include "AutomationPattern.h" #include "ComboBoxModel.h" @@ -127,7 +127,7 @@ protected slots: void pasteValues(); void deleteSelectedValues(); - void updatePosition( const midiTime & _t ); + void updatePosition( const MidiTime & _t ); void zoomingXChanged(); void zoomingYChanged(); @@ -218,7 +218,7 @@ private: QScrollBar * m_leftRightScroll; QScrollBar * m_topBottomScroll; - midiTime m_currentPosition; + MidiTime m_currentPosition; actions m_action; @@ -258,7 +258,7 @@ private: signals: void currentPatternChanged(); - void positionChanged( const midiTime & ); + void positionChanged( const MidiTime & ); } ; diff --git a/include/AutomationPattern.h b/include/AutomationPattern.h index 8b11c332c3..ea20bb3a03 100644 --- a/include/AutomationPattern.h +++ b/include/AutomationPattern.h @@ -33,7 +33,7 @@ class AutomationTrack; -class midiTime; +class MidiTime; @@ -72,12 +72,12 @@ public: } void setTension( QString _new_tension ); - virtual midiTime length() const; + virtual MidiTime length() const; - midiTime putValue( const midiTime & _time, const float _value, + MidiTime putValue( const MidiTime & _time, const float _value, const bool _quant_pos = true ); - void removeValue( const midiTime & _time ); + void removeValue( const MidiTime & _time ); inline const timeMap & getTimeMap() const { @@ -104,8 +104,8 @@ public: return m_timeMap.isEmpty() == false; } - float valueAt( const midiTime & _time ) const; - float *valuesAfter( const midiTime & _time ) const; + float valueAt( const MidiTime & _time ) const; + float *valuesAfter( const MidiTime & _time ) const; const QString name() const; @@ -123,7 +123,7 @@ public: return classNodeName(); } - void processMidiTime( const midiTime & _time ); + void processMidiTime( const MidiTime & _time ); virtual trackContentObjectView * createView( trackView * _tv ); diff --git a/include/AutomationTrack.h b/include/AutomationTrack.h index 834174ecea..a4c44b302e 100644 --- a/include/AutomationTrack.h +++ b/include/AutomationTrack.h @@ -36,7 +36,7 @@ public: AutomationTrack( TrackContainer* tc, bool _hidden = false ); virtual ~AutomationTrack(); - virtual bool play( const midiTime & _start, const fpp_t _frames, + virtual bool play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _frame_base, int _tco_num = -1 ); virtual QString nodeName() const @@ -45,7 +45,7 @@ public: } virtual trackView * createView( TrackContainerView* ); - virtual trackContentObject * createTCO( const midiTime & _pos ); + virtual trackContentObject * createTCO( const MidiTime & _pos ); virtual void saveTrackSpecificSettings( QDomDocument & _doc, QDomElement & _parent ); diff --git a/include/Instrument.h b/include/Instrument.h index 7cec410198..f0ff145c22 100644 --- a/include/Instrument.h +++ b/include/Instrument.h @@ -35,8 +35,8 @@ // forward-declarations class InstrumentTrack; class InstrumentView; -class midiEvent; -class midiTime; +class MidiEvent; +class MidiTime; class notePlayHandle; class track; @@ -99,7 +99,7 @@ public: // sub-classes can re-implement this for receiving all incoming // MIDI-events - inline virtual bool handleMidiEvent( const midiEvent &, const midiTime & ) + inline virtual bool handleMidiEvent( const MidiEvent&, const MidiTime& = MidiTime() ) { return false; } diff --git a/include/InstrumentTrack.h b/include/InstrumentTrack.h index 3514b0aa75..0217cb19a1 100644 --- a/include/InstrumentTrack.h +++ b/include/InstrumentTrack.h @@ -69,12 +69,10 @@ public: void processAudioBuffer( sampleFrame * _buf, const fpp_t _frames, notePlayHandle * _n ); - midiEvent applyMasterKey( const midiEvent & _me ); + MidiEvent applyMasterKey( const MidiEvent& event ); - virtual void processInEvent( const midiEvent & _me, - const midiTime & _time ); - virtual void processOutEvent( const midiEvent & _me, - const midiTime & _time ); + virtual void processInEvent( const MidiEvent& event, const MidiTime& time = MidiTime() ); + virtual void processOutEvent( const MidiEvent& event, const MidiTime& time = MidiTime() ); // silence all running notes played by this track void silenceAllNotes(); @@ -117,13 +115,13 @@ public: } // play everything in given frame-range - creates note-play-handles - virtual bool play( const midiTime & _start, const fpp_t _frames, + virtual bool play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _frame_base, int _tco_num = -1 ); // create new view for me virtual trackView * createView( TrackContainerView* tcv ); // create new track-content-object = pattern - virtual trackContentObject * createTCO( const midiTime & _pos ); + virtual trackContentObject * createTCO( const MidiTime & _pos ); // called by track diff --git a/include/midi.h b/include/Midi.h similarity index 53% rename from include/midi.h rename to include/Midi.h index 09a9afa1b9..25a9fecc8b 100644 --- a/include/midi.h +++ b/include/Midi.h @@ -1,7 +1,7 @@ /* - * midi.h - constants, structs etc. concerning MIDI + * Midi.h - constants, structs etc. concerning MIDI * - * Copyright (c) 2005-2013 Tobias Doerffel + * Copyright (c) 2005-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -26,8 +26,6 @@ #define _MIDI_H #include "lmms_basics.h" -#include "panning_constants.h" -#include enum MidiEventTypes @@ -60,7 +58,7 @@ enum MidiEventTypes MidiMetaEvent = 0xFF } ; -enum MidiMetaEvents +enum MidiMetaEventTypes { MidiMetaInvalid = 0x00, MidiCopyright = 0x02, @@ -79,6 +77,7 @@ enum MidiMetaEvents MidiMetaCustom = 0x80, MidiNotePanning } ; +typedef MidiMetaEventTypes MidiMetaEventType; enum MidiStandardControllers @@ -120,139 +119,4 @@ const int MidiMaxNote = 127; const int MidiMaxPanning = 127; const int MidiMinPanning = -128; - -struct midiEvent -{ - midiEvent( MidiEventTypes _type = MidiActiveSensing, - int8_t _channel = 0, - int16_t _param1 = 0, - int16_t _param2 = 0, - const void * _sourcePort = NULL ) : - m_type( _type ), - m_metaEvent( MidiMetaInvalid ), - m_channel( _channel ), - m_sysExData( NULL ), - m_sourcePort( _sourcePort ), - m_fromMidiPort( false ) - { - m_data.m_param[0] = _param1; - m_data.m_param[1] = _param2; - } - - midiEvent( MidiEventTypes _type, const char * _sysex_data, - int _data_len ) : - m_type( _type ), - m_metaEvent( MidiMetaInvalid ), - m_channel( 0 ), - m_sysExData( _sysex_data ), - m_sourcePort( NULL ), - m_fromMidiPort( false ) - { - m_data.m_sysExDataLen = _data_len; - } - - midiEvent( const midiEvent & _copy ) : - m_type( _copy.m_type ), - m_metaEvent( _copy.m_metaEvent ), - m_channel( _copy.m_channel ), - m_data( _copy.m_data ), - m_sysExData( _copy.m_sysExData ), - m_sourcePort( _copy.m_sourcePort ), - m_fromMidiPort( _copy.m_fromMidiPort ) - { - } - - inline MidiEventTypes type() const - { - return m_type; - } - - inline int channel() const - { - return m_channel; - } - - inline int16_t key() const - { - return m_data.m_param[0]; - } - - inline int16_t & key() - { - return m_data.m_param[0]; - } - - inline uint8_t controllerNumber() const - { - return m_data.m_param[0]; - } - - inline uint8_t controllerValue() const - { - return m_data.m_param[1]; - } - - inline int16_t velocity() const - { - return m_data.m_param[1]; - } - - inline int16_t & velocity() - { - return m_data.m_param[1]; - } - - inline int16_t midiPanning() const - { - return m_data.m_param[1]; - } - - inline volume_t getVolume() const - { - return (volume_t)( velocity() * 100 / MidiMaxVelocity ); - } - - inline const void * sourcePort() const - { - return m_sourcePort; - } - - inline panning_t getPanning() const - { - return (panning_t) ( PanningLeft + - ( (float)( midiPanning() - MidiMinPanning ) ) / - ( (float)( MidiMaxPanning - MidiMinPanning ) ) * - ( (float)( PanningRight - PanningLeft ) ) ); - } - - void setFromMidiPort( bool enabled ) - { - m_fromMidiPort = enabled; - } - - bool isFromMidiPort() const - { - return m_fromMidiPort; - } - - MidiEventTypes m_type; // MIDI event type - MidiMetaEvents m_metaEvent; // Meta event (mostly unused) - int8_t m_channel; // MIDI channel - union - { - int16_t m_param[2]; // first/second parameter (key/velocity) - uint8_t m_bytes[4]; // raw bytes - int32_t m_sysExDataLen; // len of m_sysExData - } m_data; - - const char * m_sysExData; - const void * m_sourcePort; - - -private: - bool m_fromMidiPort; - -} ; - - #endif diff --git a/include/MidiAlsaSeq.h b/include/MidiAlsaSeq.h index 13d250c3f1..70640ae3a0 100644 --- a/include/MidiAlsaSeq.h +++ b/include/MidiAlsaSeq.h @@ -62,8 +62,8 @@ public: - virtual void processOutEvent( const midiEvent & _me, - const midiTime & _time, + virtual void processOutEvent( const MidiEvent & _me, + const MidiTime & _time, const MidiPort * _port ); virtual void applyPortMode( MidiPort * _port ); @@ -84,7 +84,7 @@ public: } // return name of port which specified MIDI event came from - virtual QString sourcePortName( const midiEvent & ) const; + virtual QString sourcePortName( const MidiEvent & ) const; // (un)subscribe given MidiPort to/from destination-port virtual void subscribeReadablePort( MidiPort * _port, diff --git a/include/MidiClient.h b/include/MidiClient.h index b8f0b459ad..2888999aca 100644 --- a/include/MidiClient.h +++ b/include/MidiClient.h @@ -29,7 +29,7 @@ #include -#include "midi.h" +#include "MidiEvent.h" #include "MidiEventProcessor.h" #include "tab_widget.h" @@ -45,8 +45,8 @@ public: virtual ~MidiClient(); // to be implemented by sub-classes - virtual void processOutEvent( const midiEvent & _me, - const midiTime & _time, + virtual void processOutEvent( const MidiEvent & _me, + const MidiTime & _time, const MidiPort * _port ) = 0; // inheriting classes can re-implement this for being able to update @@ -78,13 +78,13 @@ public: } // return name of port which specified MIDI event came from - virtual QString sourcePortName( const midiEvent & ) const + virtual QString sourcePortName( const MidiEvent & ) const { return QString(); } - // (un)subscribe given MidiPort to/from destination-port + // (un)subscribe given MidiPort to/from destination-port virtual void subscribeReadablePort( MidiPort * _port, const QString & _dest, bool _subscribe = true ); @@ -167,7 +167,7 @@ protected: private: // this does MIDI-event-process void processParsedEvent(); - virtual void processOutEvent( const midiEvent& event, const midiTime& time, const MidiPort* port ); + virtual void processOutEvent( const MidiEvent& event, const MidiTime& time, const MidiPort* port ); // small helper function returning length of a certain event - this // is necessary for parsing raw-MIDI-data @@ -188,7 +188,7 @@ private: // event type include? uint32_t m_buffer[RAW_MIDI_PARSE_BUF_SIZE]; // buffer for incoming data - midiEvent m_midiEvent; // midi-event + MidiEvent m_midiEvent; // midi-event } m_midiParseData; } ; diff --git a/include/MidiController.h b/include/MidiController.h index f9d3a0d333..2271e8659f 100644 --- a/include/MidiController.h +++ b/include/MidiController.h @@ -43,11 +43,11 @@ public: MidiController( Model * _parent ); virtual ~MidiController(); - virtual void processInEvent( const midiEvent & _me, - const midiTime & _time ); + virtual void processInEvent( const MidiEvent & _me, + const MidiTime & _time ); - virtual void processOutEvent( const midiEvent& _me, - const midiTime & _time) + virtual void processOutEvent( const MidiEvent& _me, + const MidiTime & _time) { // No output yet } diff --git a/include/MidiEvent.h b/include/MidiEvent.h new file mode 100644 index 0000000000..38bf33f904 --- /dev/null +++ b/include/MidiEvent.h @@ -0,0 +1,209 @@ +/* + * MidiEvent.h - MidiEvent class + * + * Copyright (c) 2005-2014 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + +#ifndef _MIDI_EVENT_H +#define _MIDI_EVENT_H + +#include +#include "Midi.h" +#include "panning_constants.h" + +class MidiEvent +{ +public: + MidiEvent( MidiEventTypes type = MidiActiveSensing, + int8_t channel = 0, + int16_t param1 = 0, + int16_t param2 = 0, + const void* sourcePort = NULL ) : + m_type( type ), + m_metaEvent( MidiMetaInvalid ), + m_channel( channel ), + m_sysExData( NULL ), + m_sourcePort( sourcePort ) + { + m_data.m_param[0] = param1; + m_data.m_param[1] = param2; + } + + MidiEvent( MidiEventTypes type, const char* sysExData, int dataLen ) : + m_type( type ), + m_metaEvent( MidiMetaInvalid ), + m_channel( 0 ), + m_sysExData( sysExData ), + m_sourcePort( NULL ) + { + m_data.m_sysExDataLen = dataLen; + } + + MidiEvent( const MidiEvent& other ) : + m_type( other.m_type ), + m_metaEvent( other.m_metaEvent ), + m_channel( other.m_channel ), + m_data( other.m_data ), + m_sysExData( other.m_sysExData ), + m_sourcePort( other.m_sourcePort ) + { + } + + MidiEventTypes type() const + { + return m_type; + } + + void setType( MidiEventTypes type ) + { + m_type = type; + } + + void setMetaEvent( MidiMetaEventType metaEvent ) + { + m_metaEvent = metaEvent; + } + + MidiMetaEventType metaEvent() const + { + return m_metaEvent; + } + + int8_t channel() const + { + return m_channel; + } + + void setChannel( int8_t channel ) + { + m_channel = channel; + } + + int16_t param( int i ) const + { + return m_data.m_param[i]; + } + + void setParam( int i, uint16_t value ) + { + m_data.m_param[i] = value; + } + + int16_t key() const + { + return param( 0 ); + } + + void setKey( int16_t key ) + { + m_data.m_param[0] = key; + } + + uint8_t velocity() const + { + return m_data.m_param[1] & 0x7F; + } + + void setVelocity( int16_t velocity ) + { + m_data.m_param[1] = velocity; + } + + panning_t panning() const + { + return (panning_t) ( PanningLeft + + ( (float)( midiPanning() - MidiMinPanning ) ) / + ( (float)( MidiMaxPanning - MidiMinPanning ) ) * + ( (float)( PanningRight - PanningLeft ) ) ); + } + int16_t midiPanning() const + { + return m_data.m_param[1]; + } + + volume_t volume() const + { + return (volume_t)( velocity() * 100 / MidiMaxVelocity ); + } + + const void* sourcePort() const + { + return m_sourcePort; + } + + uint8_t controllerNumber() const + { + return param( 0 ) & 0x7F; + } + + void setControllerNumber( uint8_t num ) + { + setParam( 0, num ); + } + + uint8_t controllerValue() const + { + return param( 1 ); + } + + void setControllerValue( uint8_t value ) + { + setParam( 1, value ); + } + + uint8_t program() const + { + return param( 0 ); + } + + uint8_t channelPressure() const + { + return param( 0 ); + } + + int16_t pitchBend() const + { + return param( 0 ); + } + + void setPitchBend( uint16_t pitchBend ) + { + setParam( 0, pitchBend ); + } + + +private: + MidiEventTypes m_type; // MIDI event type + MidiMetaEventType m_metaEvent; // Meta event (mostly unused) + int8_t m_channel; // MIDI channel + union + { + int16_t m_param[2]; // first/second parameter (key/velocity) + uint8_t m_bytes[4]; // raw bytes + int32_t m_sysExDataLen; // len of m_sysExData + } m_data; + + const char* m_sysExData; + const void* m_sourcePort; + +} ; + +#endif diff --git a/include/MidiEventProcessor.h b/include/MidiEventProcessor.h index 1b3d0dd333..dafcfb6cde 100644 --- a/include/MidiEventProcessor.h +++ b/include/MidiEventProcessor.h @@ -25,27 +25,25 @@ #ifndef _MIDI_EVENT_PROCESSOR_H #define _MIDI_EVENT_PROCESSOR_H -class midiEvent; -class midiTime; +#include "MidiEvent.h" +#include "MidiTime.h" // all classes being able to process MIDI-events should inherit from this class MidiEventProcessor { public: - inline MidiEventProcessor() + MidiEventProcessor() { } - virtual inline ~MidiEventProcessor() + virtual ~MidiEventProcessor() { } // to be implemented by inheriting classes - virtual void processInEvent( const midiEvent & _me, - const midiTime & _time ) = 0; - virtual void processOutEvent( const midiEvent & _me, - const midiTime & _time ) = 0; + virtual void processInEvent( const MidiEvent& event, const MidiTime& time = MidiTime() ) = 0; + virtual void processOutEvent( const MidiEvent& event, const MidiTime& time = MidiTime() ) = 0; } ; diff --git a/include/MidiPort.h b/include/MidiPort.h index a5b1aee0e0..c407f1f8fc 100644 --- a/include/MidiPort.h +++ b/include/MidiPort.h @@ -1,8 +1,8 @@ /* - * MidiPort.h - abstraction of MIDI ports which are part of LMMS's MIDI- + * MidiPort.h - abstraction of MIDI ports which are part of LMMS' MIDI * sequencing system * - * Copyright (c) 2005-2009 Tobias Doerffel + * Copyright (c) 2005-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -28,16 +28,17 @@ #include #include -#include +#include -#include "midi.h" +#include "Midi.h" +#include "MidiTime.h" #include "AutomatableModel.h" class MidiClient; +class MidiEvent; class MidiEventProcessor; class MidiPortMenu; -class midiTime; // class for abstraction of MIDI-port @@ -104,8 +105,8 @@ public: return outputChannel() - 1; } - void processInEvent( const midiEvent & _me, const midiTime & _time ); - void processOutEvent( const midiEvent & _me, const midiTime & _time ); + void processInEvent( const MidiEvent& event, const MidiTime& time = MidiTime() ); + void processOutEvent( const MidiEvent& event, const MidiTime& time = MidiTime() ); virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); diff --git a/include/midi_time.h b/include/MidiTime.h similarity index 62% rename from include/midi_time.h rename to include/MidiTime.h index f7f857624e..9a86f3b486 100644 --- a/include/midi_time.h +++ b/include/MidiTime.h @@ -1,8 +1,8 @@ /* - * midi_time.h - declaration of class midiTime which provides data-type for - * position- and length-variables + * MidiTime.h - declaration of class MidiTime which provides data type for + * position- and length-variables * - * Copyright (c) 2004-2009 Tobias Doerffel + * Copyright (c) 2004-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -35,25 +35,25 @@ const int DefaultStepsPerTact = 16; const int DefaultBeatsPerTact = DefaultTicksPerTact / DefaultStepsPerTact; -class EXPORT midiTime +class EXPORT MidiTime { public: - inline midiTime( const tact_t _tact, const tick_t _ticks ) : - m_ticks( _tact * s_ticksPerTact + _ticks ) + MidiTime( const tact_t tact, const tick_t ticks ) : + m_ticks( tact * s_ticksPerTact + ticks ) { } - inline midiTime( const tick_t _ticks = 0 ) : - m_ticks( _ticks ) + MidiTime( const tick_t ticks = 0 ) : + m_ticks( ticks ) { } - inline midiTime( const midiTime & _t ) : - m_ticks( _t.m_ticks ) + MidiTime( const MidiTime& time ) : + m_ticks( time.m_ticks ) { } - inline midiTime toNearestTact() const + MidiTime toNearestTact() const { if( m_ticks % s_ticksPerTact >= s_ticksPerTact/2 ) { @@ -62,30 +62,30 @@ public: return getTact() * s_ticksPerTact; } - inline midiTime & operator=( const midiTime & _t ) + MidiTime& operator=( const MidiTime& time ) { - m_ticks = _t.m_ticks; + m_ticks = time.m_ticks; return *this; } - inline midiTime & operator+=( const midiTime & _t ) + MidiTime& operator+=( const MidiTime& time ) { - m_ticks += _t.m_ticks; + m_ticks += time.m_ticks; return *this; } - inline midiTime & operator-=( const midiTime & _t ) + MidiTime& operator-=( const MidiTime& time ) { - m_ticks -= _t.m_ticks; + m_ticks -= time.m_ticks; return *this; } - inline tact_t getTact() const + tact_t getTact() const { return m_ticks / s_ticksPerTact; } - inline tact_t nextFullTact() const + tact_t nextFullTact() const { if( m_ticks % s_ticksPerTact == 0 ) { @@ -94,37 +94,34 @@ public: return m_ticks / s_ticksPerTact + 1; } - inline void setTicks( tick_t _t ) + void setTicks( tick_t ticks ) { - m_ticks = _t; + m_ticks = ticks; } - inline tick_t getTicks() const + tick_t getTicks() const { return m_ticks; } - inline operator int() const + operator int() const { return m_ticks; } // calculate number of frame that are needed this time - inline f_cnt_t frames( const float _frames_per_tick ) const + f_cnt_t frames( const float framesPerTick ) const { if( m_ticks >= 0 ) { - return static_cast( m_ticks * - _frames_per_tick ); + return static_cast( m_ticks * framesPerTick ); } return 0; } - static inline midiTime fromFrames( const f_cnt_t _frames, - const float _frames_per_tick ) + static MidiTime fromFrames( const f_cnt_t frames, const float framesPerTick ) { - return midiTime( static_cast( _frames / - _frames_per_tick ) ); + return MidiTime( static_cast( frames / framesPerTick ) ); } @@ -143,6 +140,7 @@ public: s_ticksPerTact = _tpt; } + private: tick_t m_ticks; diff --git a/include/MidiWinMM.h b/include/MidiWinMM.h index 51cccae71c..54b6bdf0de 100644 --- a/include/MidiWinMM.h +++ b/include/MidiWinMM.h @@ -56,8 +56,8 @@ public: - virtual void processOutEvent( const midiEvent & _me, - const midiTime & _time, + virtual void processOutEvent( const MidiEvent & _me, + const MidiTime & _time, const MidiPort * _port ); virtual void applyPortMode( MidiPort * _port ); @@ -78,7 +78,7 @@ public: #endif // return name of port which specified MIDI event came from - virtual QString sourcePortName( const midiEvent & ) const; + virtual QString sourcePortName( const MidiEvent & ) const; // (un)subscribe given MidiPort to/from destination-port virtual void subscribeReadablePort( MidiPort * _port, diff --git a/include/RemotePlugin.h b/include/RemotePlugin.h index 46ffc5e150..8eb097ebd4 100644 --- a/include/RemotePlugin.h +++ b/include/RemotePlugin.h @@ -1,7 +1,7 @@ /* * RemotePlugin.h - base class providing RPC like mechanisms * - * Copyright (c) 2008-2012 Tobias Doerffel + * Copyright (c) 2008-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -26,7 +26,7 @@ #define _REMOTE_PLUGIN_H #include "export.h" -#include "midi.h" +#include "MidiEvent.h" #include "VST_sync_shm.h" #include @@ -724,7 +724,7 @@ public: bool process( const sampleFrame * _in_buf, sampleFrame * _out_buf ); - void processMidiEvent( const midiEvent &, const f_cnt_t _offset ); + void processMidiEvent( const MidiEvent&, const f_cnt_t _offset ); void updateSampleRate( sample_rate_t _sr ) { @@ -820,8 +820,7 @@ public: virtual void process( const sampleFrame * _in_buf, sampleFrame * _out_buf ) = 0; - virtual void processMidiEvent( const midiEvent &, - const f_cnt_t /* _offset */ ) + virtual void processMidiEvent( const MidiEvent&, const f_cnt_t /* _offset */ ) { } @@ -1120,7 +1119,7 @@ bool RemotePluginClient::processMessage( const message & _m ) case IdMidiEvent: processMidiEvent( - midiEvent( static_cast( + MidiEvent( static_cast( _m.getInt( 0 ) ), _m.getInt( 1 ), _m.getInt( 2 ), diff --git a/include/SampleRecordHandle.h b/include/SampleRecordHandle.h index 465005fbec..6ff8a3d638 100644 --- a/include/SampleRecordHandle.h +++ b/include/SampleRecordHandle.h @@ -61,7 +61,7 @@ private: typedef QList > bufferList; bufferList m_buffers; f_cnt_t m_framesRecorded; - midiTime m_minLength; + MidiTime m_minLength; track * m_track; bbTrack * m_bbTrack; diff --git a/include/SampleTrack.h b/include/SampleTrack.h index 975ba2477e..fed7856571 100644 --- a/include/SampleTrack.h +++ b/include/SampleTrack.h @@ -43,7 +43,7 @@ public: SampleTCO( track * _track ); virtual ~SampleTCO(); - virtual void changeLength( const midiTime & _length ); + virtual void changeLength( const MidiTime & _length ); const QString & sampleFile() const; virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); @@ -58,7 +58,7 @@ public: return m_sampleBuffer; } - midiTime sampleLength() const; + MidiTime sampleLength() const; virtual trackContentObjectView * createView( trackView * _tv ); @@ -121,10 +121,10 @@ public: SampleTrack( TrackContainer* tc ); virtual ~SampleTrack(); - virtual bool play( const midiTime & _start, const fpp_t _frames, + virtual bool play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _frame_base, int _tco_num = -1 ); virtual trackView * createView( TrackContainerView* tcv ); - virtual trackContentObject * createTCO( const midiTime & _pos ); + virtual trackContentObject * createTCO( const MidiTime & _pos ); virtual void saveTrackSpecificSettings( QDomDocument & _doc, diff --git a/include/TrackContainerView.h b/include/TrackContainerView.h index 2203fb8683..a18bf5a78e 100644 --- a/include/TrackContainerView.h +++ b/include/TrackContainerView.h @@ -56,7 +56,7 @@ public: return( m_scrollArea ); } - inline const midiTime & currentPosition() const + inline const MidiTime & currentPosition() const { return( m_currentPosition ); } @@ -142,7 +142,7 @@ protected: virtual void undoStep( JournalEntry & _je ); virtual void redoStep( JournalEntry & _je ); - midiTime m_currentPosition; + MidiTime m_currentPosition; private: @@ -180,7 +180,7 @@ private: signals: - void positionChanged( const midiTime & _pos ); + void positionChanged( const MidiTime & _pos ); } ; diff --git a/include/bb_track.h b/include/bb_track.h index 8b0dbff99f..a4c440f4c9 100644 --- a/include/bb_track.h +++ b/include/bb_track.h @@ -109,10 +109,10 @@ public: bbTrack( TrackContainer* tc ); virtual ~bbTrack(); - virtual bool play( const midiTime & _start, const fpp_t _frames, + virtual bool play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _frame_base, int _tco_num = -1 ); virtual trackView * createView( TrackContainerView* tcv ); - virtual trackContentObject * createTCO( const midiTime & _pos ); + virtual trackContentObject * createTCO( const MidiTime & _pos ); virtual void saveTrackSpecificSettings( QDomDocument & _doc, QDomElement & _parent ); diff --git a/include/bb_track_container.h b/include/bb_track_container.h index bc9bf70645..3ad0b91572 100644 --- a/include/bb_track_container.h +++ b/include/bb_track_container.h @@ -38,7 +38,7 @@ public: bbTrackContainer(); virtual ~bbTrackContainer(); - virtual bool play( midiTime _start, const fpp_t _frames, + virtual bool play( MidiTime _start, const fpp_t _frames, const f_cnt_t _frame_base, int _tco_num = -1 ); virtual void updateAfterTrackAdd(); diff --git a/include/note.h b/include/note.h index 36bf1640de..199254f9d0 100644 --- a/include/note.h +++ b/include/note.h @@ -30,7 +30,7 @@ #include "volume.h" #include "panning.h" -#include "midi_time.h" +#include "MidiTime.h" #include "SerializingObject.h" class DetuningHelper; @@ -81,8 +81,8 @@ const float MaxDetuning = 4 * 12.0f; class EXPORT note : public SerializingObject { public: - note( const midiTime & _length = midiTime( 0 ), - const midiTime & _pos = midiTime( 0 ), + note( const MidiTime & _length = MidiTime( 0 ), + const MidiTime & _pos = MidiTime( 0 ), int key = DefaultKey, volume_t _volume = DefaultVolume, panning_t _panning = DefaultPanning, @@ -93,8 +93,8 @@ public: // used by GUI inline void setSelected( const bool _selected ){ m_selected = _selected; } inline void setOldKey( const int _oldKey ){ m_oldKey = _oldKey; } - inline void setOldPos( const midiTime & _oldPos ){ m_oldPos = _oldPos; } - inline void setOldLength( const midiTime & _oldLength ) + inline void setOldPos( const MidiTime & _oldPos ){ m_oldPos = _oldPos; } + inline void setOldLength( const MidiTime & _oldLength ) { m_oldLength = _oldLength; } @@ -104,11 +104,11 @@ public: } - void setLength( const midiTime & _length ); - void setPos( const midiTime & _pos ); + void setLength( const MidiTime & _length ); + void setPos( const MidiTime & _pos ); void setKey( const int _key ); - virtual void setVolume( const volume_t _volume = DefaultVolume ); - void setPanning( const panning_t _panning = DefaultPanning ); + virtual void setVolume( const volume_t volume = DefaultVolume ); + virtual void setPanning( const panning_t panning = DefaultPanning ); void quantizeLength( const int _q_grid ); void quantizePos( const int _q_grid ); @@ -129,12 +129,12 @@ public: return m_oldKey; } - inline midiTime oldPos() const + inline MidiTime oldPos() const { return m_oldPos; } - inline midiTime oldLength() const + inline MidiTime oldLength() const { return m_oldLength; } @@ -144,23 +144,23 @@ public: return m_isPlaying; } - inline midiTime endPos() const + inline MidiTime endPos() const { const int l = length(); return pos() + l; } - inline const midiTime & length() const + inline const MidiTime & length() const { return m_length; } - inline const midiTime & pos() const + inline const MidiTime & pos() const { return m_pos; } - inline midiTime pos( midiTime _base_pos ) const + inline MidiTime pos( MidiTime _base_pos ) const { const int bp = _base_pos; return m_pos - bp; @@ -191,7 +191,7 @@ public: return classNodeName(); } - static midiTime quantized( const midiTime & _m, const int _q_grid ); + static MidiTime quantized( const MidiTime & _m, const int _q_grid ); DetuningHelper * detuning() const { @@ -226,15 +226,15 @@ private: // for piano roll editing bool m_selected; int m_oldKey; - midiTime m_oldPos; - midiTime m_oldLength; + MidiTime m_oldPos; + MidiTime m_oldLength; bool m_isPlaying; int m_key; volume_t m_volume; panning_t m_panning; - midiTime m_length; - midiTime m_pos; + MidiTime m_length; + MidiTime m_pos; DetuningHelper * m_detuning; void createDetuning(); diff --git a/include/note_play_handle.h b/include/note_play_handle.h index 2c2b2e3f1f..e1374276a2 100644 --- a/include/note_play_handle.h +++ b/include/note_play_handle.h @@ -2,7 +2,7 @@ * note_play_handle.h - declaration of class notePlayHandle which is needed * by LMMS-Play-Engine * - * Copyright (c) 2004-2012 Tobias Doerffel + * Copyright (c) 2004-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -52,13 +52,19 @@ public: const f_cnt_t _offset, const f_cnt_t _frames, const note & _n, notePlayHandle * _parent = NULL, - const bool _part_of_arp = false ); + const bool _part_of_arp = false, + int midiChannel = -1 ); virtual ~notePlayHandle(); - virtual void setVolume( const volume_t _volume = DefaultVolume ); + virtual void setVolume( const volume_t volume = DefaultVolume ); + virtual void setPanning( const panning_t panning = DefaultPanning ); int midiVelocity() const; int midiKey() const; + int midiChannel() const + { + return m_midiChannel; + } const float & frequency() const { @@ -189,15 +195,15 @@ public: m_bbTrack = _bb_track; } - void processMidiTime( const midiTime & _time ); + void processMidiTime( const MidiTime & _time ); void resize( const bpm_t _new_tempo ); - void setSongGlobalParentOffset( const midiTime &offset ) + void setSongGlobalParentOffset( const MidiTime &offset ) { m_songGlobalParentOffset = offset; } - const midiTime &songGlobalParentOffset() const + const MidiTime &songGlobalParentOffset() const { return m_songGlobalParentOffset; } @@ -266,13 +272,15 @@ private: bpm_t m_origTempo; // original tempo f_cnt_t m_origFrames; // original m_frames - int m_origBaseNote; + const int m_origBaseNote; float m_frequency; float m_unpitchedFrequency; BaseDetuning * m_baseDetuning; - midiTime m_songGlobalParentOffset; + MidiTime m_songGlobalParentOffset; + + const int m_midiChannel; } ; diff --git a/include/panning.h b/include/panning.h index 29d2e5365b..60188e3f84 100644 --- a/include/panning.h +++ b/include/panning.h @@ -2,7 +2,7 @@ * panning.h - declaration of some types, concerning the * panning of a note * - * Copyright (c) 2004-2009 Tobias Doerffel + * Copyright (c) 2004-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -30,7 +30,7 @@ #include "volume.h" #include "templates.h" #include "panning_constants.h" -#include "midi.h" +#include "Midi.h" inline stereoVolumeVector panningToVolumeVector( panning_t _p, float _scale = 1.0f ) diff --git a/include/pattern.h b/include/pattern.h index 26b51849e3..fcb66fed9b 100644 --- a/include/pattern.h +++ b/include/pattern.h @@ -64,8 +64,8 @@ public: void init(); - virtual midiTime length() const; - midiTime beatPatternLength() const; + virtual MidiTime length() const; + MidiTime beatPatternLength() const; // note management note * addNote( const note & _new_note, const bool _quant_pos = true ); diff --git a/include/piano_roll.h b/include/piano_roll.h index 55e193b992..596a29f1af 100644 --- a/include/piano_roll.h +++ b/include/piano_roll.h @@ -135,8 +135,8 @@ protected slots: void pasteNotes(); void deleteSelectedNotes(); - void updatePosition( const midiTime & _t ); - void updatePositionAccompany( const midiTime & _t ); + void updatePosition( const MidiTime & _t ); + void updatePositionAccompany( const MidiTime & _t ); void zoomingChanged(); void quantizeChanged(); @@ -203,9 +203,9 @@ private: pianoRoll( const pianoRoll & ); virtual ~pianoRoll(); - void autoScroll( const midiTime & _t ); + void autoScroll( const MidiTime & _t ); - midiTime newNoteLen() const; + MidiTime newNoteLen() const; void shiftPos(int amount); void shiftSemiTone(int amount); @@ -276,7 +276,7 @@ private: QScrollBar * m_leftRightScroll; QScrollBar * m_topBottomScroll; - midiTime m_currentPosition; + MidiTime m_currentPosition; bool m_recording; QList m_recordingNotes; @@ -315,7 +315,7 @@ private: // remember these values to use them // for the next note that is set - midiTime m_lenOfNewNotes; + MidiTime m_lenOfNewNotes; volume_t m_lastNoteVolume; panning_t m_lastNotePanning; @@ -345,7 +345,7 @@ private: signals: - void positionChanged( const midiTime & ); + void positionChanged( const MidiTime & ); } ; diff --git a/include/song.h b/include/song.h index ed6c188724..32b36e34b1 100644 --- a/include/song.h +++ b/include/song.h @@ -65,11 +65,11 @@ public: } ; - class playPos : public midiTime + class playPos : public MidiTime { public: playPos( const int _abs = 0 ) : - midiTime( _abs ), + MidiTime( _abs ), m_timeLine( NULL ), m_timeLineUpdate( true ), m_currentFrame( 0.0f ) diff --git a/include/song_editor.h b/include/song_editor.h index 9896367900..af10cd51cf 100644 --- a/include/song_editor.h +++ b/include/song_editor.h @@ -84,7 +84,7 @@ private slots: void masterPitchReleased(); void updateScrollBar( int ); - void updatePosition( const midiTime & _t ); + void updatePosition( const MidiTime & _t ); void zoomingChanged(); diff --git a/include/timeline.h b/include/timeline.h index 298f42a7ba..ff46618370 100644 --- a/include/timeline.h +++ b/include/timeline.h @@ -61,7 +61,7 @@ public: timeLine( int _xoff, int _yoff, float _ppt, song::playPos & _pos, - const midiTime & _begin, QWidget * _parent ); + const MidiTime & _begin, QWidget * _parent ); virtual ~timeLine(); inline song::playPos & pos() @@ -84,23 +84,23 @@ public: return m_loopPoints == LoopPointsEnabled; } - inline const midiTime & loopBegin() const + inline const MidiTime & loopBegin() const { return ( m_loopPos[0] < m_loopPos[1] ) ? m_loopPos[0] : m_loopPos[1]; } - inline const midiTime & loopEnd() const + inline const MidiTime & loopEnd() const { return ( m_loopPos[0] > m_loopPos[1] ) ? m_loopPos[0] : m_loopPos[1]; } - inline void savePos( const midiTime & _pos ) + inline void savePos( const MidiTime & _pos ) { m_savedPos = _pos; } - inline const midiTime & savedPos() const + inline const MidiTime & savedPos() const { return m_savedPos; } @@ -121,18 +121,18 @@ public: return "timeline"; } - inline int markerX( const midiTime & _t ) const + inline int markerX( const MidiTime & _t ) const { return m_xOffset + static_cast( ( _t - m_begin ) * - m_ppt / midiTime::ticksPerTact() ); + m_ppt / MidiTime::ticksPerTact() ); } public slots: - void updatePosition( const midiTime & ); + void updatePosition( const MidiTime & ); void updatePosition() { - updatePosition( midiTime() ); + updatePosition( MidiTime() ); } void toggleAutoScroll( int _n ); void toggleLoopPoints( int _n ); @@ -162,10 +162,10 @@ private: int m_posMarkerX; float m_ppt; song::playPos & m_pos; - const midiTime & m_begin; - midiTime m_loopPos[2]; + const MidiTime & m_begin; + MidiTime m_loopPos[2]; - midiTime m_savedPos; + MidiTime m_savedPos; textFloat * m_hint; @@ -183,7 +183,7 @@ private: signals: - void positionChanged( const midiTime & _t ); + void positionChanged( const MidiTime & _t ); void loopPointStateLoaded( int _n ); } ; diff --git a/include/track.h b/include/track.h index cbb5faaebb..e30e62e485 100644 --- a/include/track.h +++ b/include/track.h @@ -31,7 +31,7 @@ #include #include "lmms_basics.h" -#include "midi_time.h" +#include "MidiTime.h" #include "rubberband.h" #include "JournallingObject.h" #include "AutomatableModel.h" @@ -101,24 +101,24 @@ public: } - inline const midiTime & startPosition() const + inline const MidiTime & startPosition() const { return m_startPosition; } - inline midiTime endPosition() const + inline MidiTime endPosition() const { const int sp = m_startPosition; return sp + m_length; } - inline const midiTime & length() const + inline const MidiTime & length() const { return m_length; } - virtual void movePosition( const midiTime & _pos ); - virtual void changeLength( const midiTime & _length ); + virtual void movePosition( const MidiTime & _pos ); + virtual void changeLength( const MidiTime & _length ); virtual trackContentObjectView * createView( trackView * _tv ) = 0; @@ -151,8 +151,8 @@ private: track * m_track; QString m_name; - midiTime m_startPosition; - midiTime m_length; + MidiTime m_startPosition; + MidiTime m_length; BoolModel m_mutedModel; BoolModel m_soloModel; @@ -230,7 +230,7 @@ private: textFloat * m_hint; - midiTime m_oldTime;// used for undo/redo while mouse-button is pressed + MidiTime m_oldTime;// used for undo/redo while mouse-button is pressed } ; @@ -258,11 +258,11 @@ public: } } - midiTime endPosition( const midiTime & _pos_start ); + MidiTime endPosition( const MidiTime & _pos_start ); public slots: void update(); - void changePosition( const midiTime & _new_pos = midiTime( -1 ) ); + void changePosition( const MidiTime & _new_pos = MidiTime( -1 ) ); protected: @@ -289,7 +289,7 @@ private: } ; track * getTrack(); - midiTime getPosition( int _mouse_x ); + MidiTime getPosition( int _mouse_x ); trackView * m_trackView; @@ -382,12 +382,12 @@ public: return m_type; } - virtual bool play( const midiTime & _start, const fpp_t _frames, + virtual bool play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _frame_base, int _tco_num = -1 ) = 0; virtual trackView * createView( TrackContainerView * _view ) = 0; - virtual trackContentObject * createTCO( const midiTime & _pos ) = 0; + virtual trackContentObject * createTCO( const MidiTime & _pos ) = 0; virtual void saveTrackSpecificSettings( QDomDocument & _doc, QDomElement & _parent ) = 0; @@ -415,13 +415,13 @@ public: { return( m_trackContentObjects ); } - void getTCOsInRange( tcoVector & _tco_v, const midiTime & _start, - const midiTime & _end ); + void getTCOsInRange( tcoVector & _tco_v, const MidiTime & _start, + const MidiTime & _end ); void swapPositionOfTCOs( int _tco_num1, int _tco_num2 ); - void insertTact( const midiTime & _pos ); - void removeTact( const midiTime & _pos ); + void insertTact( const MidiTime & _pos ); + void removeTact( const MidiTime & _pos ); tact_t length() const; diff --git a/include/volume.h b/include/volume.h index aeb1daf1c2..dedecd504c 100644 --- a/include/volume.h +++ b/include/volume.h @@ -2,7 +2,7 @@ * volume.h - declaration of some constants and types, concerning the volume * of a note * - * Copyright (c) 2004-2009 Tobias Doerffel + * Copyright (c) 2004-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -29,7 +29,7 @@ #include "lmmsconfig.h" #include "lmms_basics.h" -#include "midi.h" +#include "Midi.h" const volume_t MinVolume = 0; const volume_t MaxVolume = 200; diff --git a/plugins/flp_import/FlpImport.cpp b/plugins/flp_import/FlpImport.cpp index c374595f86..c238fee100 100644 --- a/plugins/flp_import/FlpImport.cpp +++ b/plugins/flp_import/FlpImport.cpp @@ -1744,8 +1744,7 @@ p->putValue( jt->pos, value, false ); { continue; } - trackContentObject * tco = - bb_tracks[it->pattern]->createTCO( midiTime() ); + trackContentObject * tco = bb_tracks[it->pattern]->createTCO( MidiTime() ); tco->movePosition( it->position ); if( it->length != DefaultTicksPerTact ) { diff --git a/plugins/midi_import/MidiImport.cpp b/plugins/midi_import/MidiImport.cpp index 585c2f5eba..0444ce51a9 100644 --- a/plugins/midi_import/MidiImport.cpp +++ b/plugins/midi_import/MidiImport.cpp @@ -38,6 +38,7 @@ #include "pattern.h" #include "Instrument.h" #include "MainWindow.h" +#include "MidiTime.h" #include "debug.h" #include "embed.h" #include "song.h" @@ -152,7 +153,7 @@ public: AutomationTrack * at; AutomationPattern * ap; - midiTime lastPos; + MidiTime lastPos; smfMidiCC & create( TrackContainer* tc ) { @@ -172,11 +173,11 @@ public: } - smfMidiCC & putValue( midiTime time, AutomatableModel * objModel, float value ) + smfMidiCC & putValue( MidiTime time, AutomatableModel * objModel, float value ) { if( !ap || time > lastPos + DefaultTicksPerTact ) { - midiTime pPos = midiTime( time.getTact(), 0 ); + MidiTime pPos = MidiTime( time.getTact(), 0 ); ap = dynamic_cast( at->createTCO(0) ); ap->movePosition( pPos ); @@ -186,7 +187,7 @@ public: lastPos = time; time = time - ap->startPosition(); ap->putValue( time, value, false ); - ap->changeLength( midiTime( time.getTact() + 1, 0 ) ); + ap->changeLength( MidiTime( time.getTact() + 1, 0 ) ); return *this; } @@ -212,7 +213,7 @@ public: Instrument * it_inst; bool isSF2; bool hasNotes; - midiTime lastEnd; + MidiTime lastEnd; smfMidiChannel * create( TrackContainer* tc ) { @@ -247,7 +248,7 @@ public: { if( !p || n.pos() > lastEnd + DefaultTicksPerTact ) { - midiTime pPos = midiTime(n.pos().getTact(), 0 ); + MidiTime pPos = MidiTime( n.pos().getTact(), 0 ); p = dynamic_cast( it->createTCO( 0 ) ); p->movePosition( pPos ); } diff --git a/plugins/midi_import/MidiImport.h b/plugins/midi_import/MidiImport.h index 47ad494864..66b839334f 100644 --- a/plugins/midi_import/MidiImport.h +++ b/plugins/midi_import/MidiImport.h @@ -29,7 +29,7 @@ #include #include -#include "midi.h" +#include "MidiEvent.h" #include "ImportFilter.h" @@ -117,8 +117,8 @@ private: } - typedef QVector > eventVector; - eventVector m_events; + typedef QVector > EventVector; + EventVector m_events; int m_timingDivision; } ; diff --git a/plugins/opl2/opl2instrument.cpp b/plugins/opl2/opl2instrument.cpp index 0718a3796c..2288e0d328 100644 --- a/plugins/opl2/opl2instrument.cpp +++ b/plugins/opl2/opl2instrument.cpp @@ -286,17 +286,16 @@ int opl2instrument::pushVoice(int v) { return i; } -bool opl2instrument::handleMidiEvent( const midiEvent & _me, - const midiTime & _time ) +bool opl2instrument::handleMidiEvent( const MidiEvent& event, const MidiTime& time ) { emulatorMutex.lock(); int key, vel, voice, tmp_pb; - switch(_me.m_type) { + switch(event.type()) { case MidiNoteOn: // to get us in line with MIDI(?) - key = _me.key() +12; - vel = _me.velocity(); + key = event.key() +12; + vel = event.velocity(); voice = popVoice(); if( voice != OPL2_NO_VOICE ) { @@ -311,7 +310,7 @@ bool opl2instrument::handleMidiEvent( const midiEvent & _me, } break; case MidiNoteOff: - key = _me.key() +12; + key = event.key() +12; for(voice=0; voice<9; ++voice) { if( voiceNote[voice] == key ) { theEmulator->write(0xA0+voice, fnums[key] & 0xff); @@ -323,8 +322,8 @@ bool opl2instrument::handleMidiEvent( const midiEvent & _me, velocities[key] = 0; break; case MidiKeyPressure: - key = _me.key() +12; - vel = _me.velocity(); + key = event.key() +12; + vel = event.velocity(); if( velocities[key] != 0) { velocities[key] = vel; } @@ -337,12 +336,12 @@ bool opl2instrument::handleMidiEvent( const midiEvent & _me, case MidiPitchBend: // Update fnumber table // Pitchbend should be in the range 0...16383 but the new range knob gets it wrong. - // tmp_pb = (2*BEND_CENTS)*((float)_me.m_data.m_param[0]/16383)-BEND_CENTS; + // tmp_pb = (2*BEND_CENTS)*((float)event.m_data.m_param[0]/16383)-BEND_CENTS; // Something like 100 cents = 8192, but offset by 8192 so the +/-100 cents range goes from 0...16383? - tmp_pb = ( _me.m_data.m_param[0]-8192 ) * BEND_CENTS / 8192; + tmp_pb = ( event.pitchBend()-8192 ) * BEND_CENTS / 8192; - printf("Pitch bend: %d -> %d cents\n",_me.m_data.m_param[0],tmp_pb); + printf("Pitch bend: %d -> %d cents\n",event.pitchBend(),tmp_pb); if( tmp_pb != pitchbend ) { pitchbend = tmp_pb; tuneEqual(69, 440.0); @@ -356,7 +355,7 @@ bool opl2instrument::handleMidiEvent( const midiEvent & _me, } break; default: - printf("Midi event type %d\n",_me.m_type); + printf("Midi event type %d\n",event.type()); } emulatorMutex.unlock(); return true; diff --git a/plugins/opl2/opl2instrument.h b/plugins/opl2/opl2instrument.h index af2493f95a..39c9d13c2e 100644 --- a/plugins/opl2/opl2instrument.h +++ b/plugins/opl2/opl2instrument.h @@ -50,8 +50,7 @@ public: inline virtual bool isMidiBased() const { return true; } - virtual bool handleMidiEvent( const midiEvent & _me, - const midiTime & _time ); + virtual bool handleMidiEvent( const MidiEvent& event, const MidiTime& time ); virtual void play( sampleFrame * _working_buffer ); void saveSettings( QDomDocument & _doc, QDomElement & _this ); diff --git a/plugins/vestige/vestige.cpp b/plugins/vestige/vestige.cpp index e8f59c1f45..f47efe689a 100644 --- a/plugins/vestige/vestige.cpp +++ b/plugins/vestige/vestige.cpp @@ -310,13 +310,12 @@ void vestigeInstrument::play( sampleFrame * _buf ) -bool vestigeInstrument::handleMidiEvent( const midiEvent & _me, - const midiTime & _time ) +bool vestigeInstrument::handleMidiEvent( const MidiEvent& event, const MidiTime& time ) { m_pluginMutex.lock(); if( m_plugin != NULL ) { - m_plugin->processMidiEvent( _me, _time ); + m_plugin->processMidiEvent( event, time ); } m_pluginMutex.unlock(); @@ -779,8 +778,7 @@ void VestigeInstrumentView::noteOffAll( void ) { for( int key = 0; key <= MidiMaxNote; ++key ) { - m_vi->m_plugin->processMidiEvent( - midiEvent( MidiNoteOff, 0, key, 0 ), 0 ); + m_vi->m_plugin->processMidiEvent( MidiEvent( MidiNoteOff, 0, key, 0 ), 0 ); } } m_vi->m_pluginMutex.unlock(); diff --git a/plugins/vestige/vestige.h b/plugins/vestige/vestige.h index 600e87e22c..b3e6703054 100644 --- a/plugins/vestige/vestige.h +++ b/plugins/vestige/vestige.h @@ -1,7 +1,7 @@ /* * vestige.h - instrument VeSTige for hosting VST-plugins * - * Copyright (c) 2005-2012 Tobias Doerffel + * Copyright (c) 2005-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -34,7 +34,6 @@ #include "Instrument.h" #include "InstrumentView.h" -#include "midi.h" #include "note.h" #include "knob.h" @@ -69,8 +68,7 @@ public: return true; } - virtual bool handleMidiEvent( const midiEvent & _me, - const midiTime & _time ); + virtual bool handleMidiEvent( const MidiEvent& event, const MidiTime& time ); virtual PluginView * instantiateView( QWidget * _parent ); diff --git a/plugins/zynaddsubfx/LocalZynAddSubFx.cpp b/plugins/zynaddsubfx/LocalZynAddSubFx.cpp index 24e4ff182e..6705bb33d0 100644 --- a/plugins/zynaddsubfx/LocalZynAddSubFx.cpp +++ b/plugins/zynaddsubfx/LocalZynAddSubFx.cpp @@ -1,7 +1,7 @@ /* * LocalZynAddSubFx.cpp - local implementation of ZynAddSubFx plugin * - * Copyright (c) 2009-2013 Tobias Doerffel + * Copyright (c) 2009-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -190,47 +190,43 @@ void LocalZynAddSubFx::setLmmsWorkingDir( const std::string & _dir ) -void LocalZynAddSubFx::processMidiEvent( const midiEvent & _e ) +void LocalZynAddSubFx::processMidiEvent( const MidiEvent& event ) { // all functions are called while m_master->mutex is held static NULLMidiIn midiIn; - switch( _e.m_type ) + switch( event.type() ) { case MidiNoteOn: - if( _e.velocity() > 0 ) + if( event.velocity() > 0 ) { - if( _e.key() <= 0 || _e.key() >= 128 ) + if( event.key() <= 0 || event.key() >= 128 ) { break; } - if( m_runningNotes[_e.key()] > 0 ) + if( m_runningNotes[event.key()] > 0 ) { - m_master->NoteOff( _e.channel(), _e.key() ); + m_master->NoteOff( event.channel(), event.key() ); } - ++m_runningNotes[_e.key()]; - m_master->NoteOn( _e.channel(), _e.key(), _e.velocity() ); + ++m_runningNotes[event.key()]; + m_master->NoteOn( event.channel(), event.key(), event.velocity() ); break; } case MidiNoteOff: - if( _e.key() <= 0 || _e.key() >= 128 ) + if( event.key() <= 0 || event.key() >= 128 ) { break; } - if( --m_runningNotes[_e.key()] <= 0 ) + if( --m_runningNotes[event.key()] <= 0 ) { - m_master->NoteOff( _e.channel(), _e.key() ); + m_master->NoteOff( event.channel(), event.key() ); } break; case MidiPitchBend: - m_master->SetController( _e.channel(), C_pitchwheel, - _e.m_data.m_param[0] + - _e.m_data.m_param[1]*128-8192 ); + m_master->SetController( event.channel(), C_pitchwheel, event.pitchBend()-8192 ); break; case MidiControlChange: - m_master->SetController( _e.channel(), - midiIn.getcontroller( _e.m_data.m_param[0] ), - _e.m_data.m_param[1] ); + m_master->SetController( event.channel(), midiIn.getcontroller( event.controllerNumber() ), event.controllerValue() ); break; default: break; diff --git a/plugins/zynaddsubfx/LocalZynAddSubFx.h b/plugins/zynaddsubfx/LocalZynAddSubFx.h index 9d6d663453..3aeab8ba55 100644 --- a/plugins/zynaddsubfx/LocalZynAddSubFx.h +++ b/plugins/zynaddsubfx/LocalZynAddSubFx.h @@ -1,7 +1,7 @@ /* * LocalZynAddSubFx.h - local implementation of ZynAddSubFx plugin * - * Copyright (c) 2009 Tobias Doerffel + * Copyright (c) 2009-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -25,6 +25,7 @@ #ifndef _LOCAL_ZYNADDSUBFX_H #define _LOCAL_ZYNADDSUBFX_H +#include "MidiEvent.h" #include "note.h" class Master; @@ -48,7 +49,7 @@ public: void setPresetDir( const std::string & _dir ); void setLmmsWorkingDir( const std::string & _dir ); - void processMidiEvent( const midiEvent & _e ); + void processMidiEvent( const MidiEvent& event ); void processAudio( sampleFrame * _out ); diff --git a/plugins/zynaddsubfx/RemoteZynAddSubFx.cpp b/plugins/zynaddsubfx/RemoteZynAddSubFx.cpp index 29300bf751..5e25de9fa2 100644 --- a/plugins/zynaddsubfx/RemoteZynAddSubFx.cpp +++ b/plugins/zynaddsubfx/RemoteZynAddSubFx.cpp @@ -1,7 +1,7 @@ /* * RemoteZynAddSubFx.cpp - ZynAddSubFx-embedding plugin * - * Copyright (c) 2008-2012 Tobias Doerffel + * Copyright (c) 2008-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -126,10 +126,9 @@ public: } // all functions are called while m_master->mutex is held - virtual void processMidiEvent( const midiEvent & _e, - const f_cnt_t /* _offset */ ) + virtual void processMidiEvent( const MidiEvent& event, const f_cnt_t /* _offset */ ) { - LocalZynAddSubFx::processMidiEvent( _e ); + LocalZynAddSubFx::processMidiEvent( event ); } diff --git a/plugins/zynaddsubfx/ZynAddSubFx.cpp b/plugins/zynaddsubfx/ZynAddSubFx.cpp index ad2dde50a4..0984bfecfa 100644 --- a/plugins/zynaddsubfx/ZynAddSubFx.cpp +++ b/plugins/zynaddsubfx/ZynAddSubFx.cpp @@ -340,14 +340,13 @@ void ZynAddSubFxInstrument::play( sampleFrame * _buf ) -bool ZynAddSubFxInstrument::handleMidiEvent( const midiEvent & _me, - const midiTime & _time ) +bool ZynAddSubFxInstrument::handleMidiEvent( const MidiEvent& event, const MidiTime& time ) { // do not forward external MIDI Control Change events if the according // LED is not checked - if( _me.type() == MidiControlChange && - _me.sourcePort() != this && - m_forwardMidiCcModel.value() == false ) + if( event.type() == MidiControlChange && + event.sourcePort() != this && + m_forwardMidiCcModel.value() == false ) { return true; } @@ -355,11 +354,11 @@ bool ZynAddSubFxInstrument::handleMidiEvent( const midiEvent & _me, m_pluginMutex.lock(); if( m_remotePlugin ) { - m_remotePlugin->processMidiEvent( _me, 0 ); + m_remotePlugin->processMidiEvent( event, 0 ); } else { - m_plugin->processMidiEvent( _me ); + m_plugin->processMidiEvent( event ); } m_pluginMutex.unlock(); @@ -446,8 +445,7 @@ void ZynAddSubFxInstrument::initPlugin() void ZynAddSubFxInstrument::sendControlChange( MidiControllers midiCtl, float value ) { - handleMidiEvent( midiEvent( MidiControlChange, instrumentTrack()->midiPort()->realOutputChannel(), midiCtl, (int) value, this ), - midiTime() ); + handleMidiEvent( MidiEvent( MidiControlChange, instrumentTrack()->midiPort()->realOutputChannel(), midiCtl, (int) value, this ) ); } diff --git a/plugins/zynaddsubfx/ZynAddSubFx.h b/plugins/zynaddsubfx/ZynAddSubFx.h index f37ba857b4..8ea46a1248 100644 --- a/plugins/zynaddsubfx/ZynAddSubFx.h +++ b/plugins/zynaddsubfx/ZynAddSubFx.h @@ -70,8 +70,7 @@ public: virtual void play( sampleFrame * _working_buffer ); - virtual bool handleMidiEvent( const midiEvent & _me, - const midiTime & _time ); + virtual bool handleMidiEvent( const MidiEvent& event, const MidiTime& time = MidiTime() ); virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); virtual void loadSettings( const QDomElement & _this ); diff --git a/src/core/AutomationPattern.cpp b/src/core/AutomationPattern.cpp index 4babc3c50c..1ce04941ce 100644 --- a/src/core/AutomationPattern.cpp +++ b/src/core/AutomationPattern.cpp @@ -45,7 +45,7 @@ AutomationPattern::AutomationPattern( AutomationTrack * _auto_track ) : m_tension( "1.0" ), m_progressionType( DiscreteProgression ) { - changeLength( midiTime( 1, 0 ) ); + changeLength( MidiTime( 1, 0 ) ); } @@ -166,7 +166,7 @@ const AutomatableModel * AutomationPattern::firstObject() const //TODO: Improve this -midiTime AutomationPattern::length() const +MidiTime AutomationPattern::length() const { tick_t max_length = 0; @@ -175,19 +175,19 @@ midiTime AutomationPattern::length() const { max_length = qMax( max_length, it.key() ); } - return midiTime( qMax( midiTime( max_length ).getTact() + 1, 1 ), 0 ); + return MidiTime( qMax( MidiTime( max_length ).getTact() + 1, 1 ), 0 ); } -midiTime AutomationPattern::putValue( const midiTime & _time, +MidiTime AutomationPattern::putValue( const MidiTime & _time, const float _value, const bool _quant_pos ) { cleanObjects(); - midiTime newTime = _quant_pos && engine::automationEditor() ? + MidiTime newTime = _quant_pos && engine::automationEditor() ? note::quantized( _time, engine::automationEditor()->quantization() ) : _time; @@ -215,7 +215,7 @@ midiTime AutomationPattern::putValue( const midiTime & _time, -void AutomationPattern::removeValue( const midiTime & _time ) +void AutomationPattern::removeValue( const MidiTime & _time ) { cleanObjects(); @@ -240,7 +240,7 @@ void AutomationPattern::removeValue( const midiTime & _time ) -float AutomationPattern::valueAt( const midiTime & _time ) const +float AutomationPattern::valueAt( const MidiTime & _time ) const { if( m_timeMap.isEmpty() ) { @@ -306,7 +306,7 @@ float AutomationPattern::valueAt( timeMap::const_iterator v, int offset ) const -float *AutomationPattern::valuesAfter( const midiTime & _time ) const +float *AutomationPattern::valuesAfter( const MidiTime & _time ) const { timeMap::ConstIterator v = m_timeMap.lowerBound( _time ); if( v == m_timeMap.end() || (v+1) == m_timeMap.end() ) @@ -417,7 +417,7 @@ const QString AutomationPattern::name() const -void AutomationPattern::processMidiTime( const midiTime & _time ) +void AutomationPattern::processMidiTime( const MidiTime & _time ) { if( _time >= 0 && hasAutomation() ) { diff --git a/src/core/InstrumentFunctions.cpp b/src/core/InstrumentFunctions.cpp index 1de453df81..985fd31528 100644 --- a/src/core/InstrumentFunctions.cpp +++ b/src/core/InstrumentFunctions.cpp @@ -477,7 +477,7 @@ void InstrumentFunctionArpeggio::processNote( notePlayHandle * _n ) } // create new arp-note - note new_note( midiTime( 0 ), midiTime( 0 ), + note new_note( MidiTime( 0 ), MidiTime( 0 ), sub_note_key, (volume_t) qRound( _n->getVolume() * vol_level ), diff --git a/src/core/Piano.cpp b/src/core/Piano.cpp index 3bd85ee8dc..584362f46f 100644 --- a/src/core/Piano.cpp +++ b/src/core/Piano.cpp @@ -38,6 +38,7 @@ #include "Piano.h" #include "InstrumentTrack.h" +#include "MidiEvent.h" #include "MidiEventProcessor.h" @@ -96,7 +97,7 @@ void Piano::handleKeyPress( int key, int midiVelocity ) { if( isValidKey( key ) ) { - m_midiEvProc->processInEvent( midiEvent( MidiNoteOn, 0, key, midiVelocity ), midiTime() ); + m_midiEvProc->processInEvent( MidiEvent( MidiNoteOn, 0, key, midiVelocity ) ); m_pressedKeys[key] = true; } } @@ -113,7 +114,7 @@ void Piano::handleKeyRelease( int key ) { if( isValidKey( key ) ) { - m_midiEvProc->processInEvent( midiEvent( MidiNoteOff, 0, key, 0 ), midiTime() ); + m_midiEvProc->processInEvent( MidiEvent( MidiNoteOff, 0, key, 0 ) ); m_pressedKeys[key] = false; } } diff --git a/src/core/RemotePlugin.cpp b/src/core/RemotePlugin.cpp index 24e047d995..0128444e8b 100644 --- a/src/core/RemotePlugin.cpp +++ b/src/core/RemotePlugin.cpp @@ -1,7 +1,7 @@ /* * RemotePlugin.cpp - base class providing RPC like mechanisms * - * Copyright (c) 2008-2010 Tobias Doerffel + * Copyright (c) 2008-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -281,14 +281,14 @@ bool RemotePlugin::process( const sampleFrame * _in_buf, -void RemotePlugin::processMidiEvent( const midiEvent & _e, +void RemotePlugin::processMidiEvent( const MidiEvent & _e, const f_cnt_t _offset ) { message m( IdMidiEvent ); - m.addInt( _e.m_type ); - m.addInt( _e.m_channel ); - m.addInt( _e.m_data.m_param[0] ); - m.addInt( _e.m_data.m_param[1] ); + m.addInt( _e.type() ); + m.addInt( _e.channel() ); + m.addInt( _e.param( 0 ) ); + m.addInt( _e.param( 1 ) ); m.addInt( _offset ); lock(); sendMessage( m ); diff --git a/src/core/SampleRecordHandle.cpp b/src/core/SampleRecordHandle.cpp index 9d0cff4ad1..674af8d938 100644 --- a/src/core/SampleRecordHandle.cpp +++ b/src/core/SampleRecordHandle.cpp @@ -73,7 +73,7 @@ void SampleRecordHandle::play( sampleFrame * /*_working_buffer*/ ) writeBuffer( recbuf, frames ); m_framesRecorded += frames; - midiTime len = (tick_t)( m_framesRecorded / engine::framesPerTick() ); + MidiTime len = (tick_t)( m_framesRecorded / engine::framesPerTick() ); if( len > m_minLength ) { // m_tco->changeLength( len ); diff --git a/src/core/bb_track_container.cpp b/src/core/bb_track_container.cpp index d199f8454d..0cbcef43b1 100644 --- a/src/core/bb_track_container.cpp +++ b/src/core/bb_track_container.cpp @@ -54,7 +54,7 @@ bbTrackContainer::~bbTrackContainer() -bool bbTrackContainer::play( midiTime _start, fpp_t _frames, +bool bbTrackContainer::play( MidiTime _start, fpp_t _frames, f_cnt_t _offset, int _tco_num ) { bool played_a_note = false; @@ -63,7 +63,7 @@ bool bbTrackContainer::play( midiTime _start, fpp_t _frames, return false; } - _start = _start % ( lengthOfBB( _tco_num ) * midiTime::ticksPerTact() ); + _start = _start % ( lengthOfBB( _tco_num ) * MidiTime::ticksPerTact() ); TrackList tl = tracks(); for( TrackList::iterator it = tl.begin(); it != tl.end(); ++it ) @@ -99,7 +99,7 @@ void bbTrackContainer::updateAfterTrackAdd() tact_t bbTrackContainer::lengthOfBB( int _bb ) { - midiTime max_length = midiTime::ticksPerTact(); + MidiTime max_length = MidiTime::ticksPerTact(); const TrackList & tl = tracks(); for( TrackList::const_iterator it = tl.begin(); it != tl.end(); ++it ) @@ -172,7 +172,7 @@ void bbTrackContainer::fixIncorrectPositions() { for( int i = 0; i < numOfBBs(); ++i ) { - ( *it )->getTCO( i )->movePosition( midiTime( i, 0 ) ); + ( *it )->getTCO( i )->movePosition( MidiTime( i, 0 ) ); } } } @@ -252,10 +252,10 @@ void bbTrackContainer::createTCOsForBB( int _bb ) { while( tl[i]->numOfTCOs() < _bb + 1 ) { - midiTime position = midiTime( tl[i]->numOfTCOs(), 0 ); + MidiTime position = MidiTime( tl[i]->numOfTCOs(), 0 ); trackContentObject * tco = tl[i]->createTCO( position ); tco->movePosition( position ); - tco->changeLength( midiTime( 1, 0 ) ); + tco->changeLength( MidiTime( 1, 0 ) ); } } } diff --git a/src/core/midi/MidiAlsaSeq.cpp b/src/core/midi/MidiAlsaSeq.cpp index 95b351197b..662dc43eac 100644 --- a/src/core/midi/MidiAlsaSeq.cpp +++ b/src/core/midi/MidiAlsaSeq.cpp @@ -31,6 +31,7 @@ #include "gui_templates.h" #include "song.h" #include "MidiPort.h" +#include "MidiTime.h" #include "note.h" @@ -160,73 +161,70 @@ QString MidiAlsaSeq::probeDevice() -void MidiAlsaSeq::processOutEvent( const midiEvent & _me, - const midiTime & _time, - const MidiPort * _port ) +void MidiAlsaSeq::processOutEvent( const MidiEvent& event, const MidiTime& time, const MidiPort* port ) { // HACK!!! - need a better solution which isn't that easy since we // cannot store const-ptrs in our map because we need to call non-const // methods of MIDI-port - it's a mess... - MidiPort * p = const_cast( _port ); + MidiPort* p = const_cast( port ); snd_seq_event_t ev; snd_seq_ev_clear( &ev ); snd_seq_ev_set_source( &ev, ( m_portIDs[p][1] != -1 ) ? m_portIDs[p][1] : m_portIDs[p][0] ); snd_seq_ev_set_subs( &ev ); - snd_seq_ev_schedule_tick( &ev, m_queueID, 1, static_cast( _time ) ); + snd_seq_ev_schedule_tick( &ev, m_queueID, 1, static_cast( time ) ); ev.queue = m_queueID; - switch( _me.m_type ) + switch( event.type() ) { case MidiNoteOn: snd_seq_ev_set_noteon( &ev, - _me.channel(), - _me.key() + KeysPerOctave, - _me.velocity() ); + event.channel(), + event.key() + KeysPerOctave, + event.velocity() ); break; case MidiNoteOff: snd_seq_ev_set_noteoff( &ev, - _me.channel(), - _me.key() + KeysPerOctave, - _me.velocity() ); + event.channel(), + event.key() + KeysPerOctave, + event.velocity() ); break; case MidiKeyPressure: snd_seq_ev_set_keypress( &ev, - _me.channel(), - _me.key() + KeysPerOctave, - _me.velocity() ); + event.channel(), + event.key() + KeysPerOctave, + event.velocity() ); break; case MidiControlChange: snd_seq_ev_set_controller( &ev, - _me.channel(), - _me.m_data.m_param[0], - _me.m_data.m_param[1] ); + event.channel(), + event.controllerNumber(), + event.controllerValue() ); break; case MidiProgramChange: snd_seq_ev_set_pgmchange( &ev, - _me.channel(), - _me.m_data.m_param[0] ); + event.channel(), + event.program() ); break; case MidiChannelPressure: snd_seq_ev_set_chanpress( &ev, - _me.channel(), - _me.m_data.m_param[0] ); + event.channel(), + event.channelPressure() ); break; case MidiPitchBend: snd_seq_ev_set_pitchbend( &ev, - _me.channel(), - _me.m_data.m_param[0] - 8192 ); + event.channel(), + event.param( 0 ) - 8192 ); break; default: - fprintf( stderr, "ALSA-sequencer: unhandled output " - "event %d\n", (int) _me.m_type ); + qWarning( "MidiAlsaSeq: unhandled output event %d\n", (int) event.type() ); return; } @@ -353,7 +351,7 @@ void MidiAlsaSeq::removePort( MidiPort * _port ) -QString MidiAlsaSeq::sourcePortName( const midiEvent & _event ) const +QString MidiAlsaSeq::sourcePortName( const MidiEvent & _event ) const { if( _event.sourcePort() ) { @@ -535,70 +533,70 @@ void MidiAlsaSeq::run() switch( ev->type ) { case SND_SEQ_EVENT_NOTEON: - dest->processInEvent( midiEvent( MidiNoteOn, + dest->processInEvent( MidiEvent( MidiNoteOn, ev->data.note.channel, ev->data.note.note - KeysPerOctave, ev->data.note.velocity, source ), - midiTime( ev->time.tick ) ); + MidiTime( ev->time.tick ) ); break; case SND_SEQ_EVENT_NOTEOFF: - dest->processInEvent( midiEvent( MidiNoteOff, + dest->processInEvent( MidiEvent( MidiNoteOff, ev->data.note.channel, ev->data.note.note - KeysPerOctave, ev->data.note.velocity, source ), - midiTime( ev->time.tick) ); + MidiTime( ev->time.tick) ); break; case SND_SEQ_EVENT_KEYPRESS: - dest->processInEvent( midiEvent( + dest->processInEvent( MidiEvent( MidiKeyPressure, ev->data.note.channel, ev->data.note.note - KeysPerOctave, ev->data.note.velocity, source - ), midiTime() ); + ), MidiTime() ); break; case SND_SEQ_EVENT_CONTROLLER: - dest->processInEvent( midiEvent( + dest->processInEvent( MidiEvent( MidiControlChange, ev->data.control.channel, ev->data.control.param, ev->data.control.value, source ), - midiTime() ); + MidiTime() ); break; case SND_SEQ_EVENT_PGMCHANGE: - dest->processInEvent( midiEvent( + dest->processInEvent( MidiEvent( MidiProgramChange, ev->data.control.channel, ev->data.control.param, ev->data.control.value, source ), - midiTime() ); + MidiTime() ); break; case SND_SEQ_EVENT_CHANPRESS: - dest->processInEvent( midiEvent( + dest->processInEvent( MidiEvent( MidiChannelPressure, ev->data.control.channel, ev->data.control.param, ev->data.control.value, source ), - midiTime() ); + MidiTime() ); break; case SND_SEQ_EVENT_PITCHBEND: - dest->processInEvent( midiEvent( MidiPitchBend, + dest->processInEvent( MidiEvent( MidiPitchBend, ev->data.control.channel, ev->data.control.value + 8192, 0, source ), - midiTime() ); + MidiTime() ); break; case SND_SEQ_EVENT_SENSING: diff --git a/src/core/midi/MidiClient.cpp b/src/core/midi/MidiClient.cpp index 8e3895d24e..673d5f20d2 100644 --- a/src/core/midi/MidiClient.cpp +++ b/src/core/midi/MidiClient.cpp @@ -25,7 +25,6 @@ #include "MidiClient.h" #include "MidiPort.h" -#include "templates.h" #include "note.h" @@ -44,32 +43,32 @@ MidiClient::~MidiClient() -void MidiClient::applyPortMode( MidiPort * ) +void MidiClient::applyPortMode( MidiPort* ) { } -void MidiClient::applyPortName( MidiPort * ) +void MidiClient::applyPortName( MidiPort* ) { } -void MidiClient::addPort( MidiPort * _port ) +void MidiClient::addPort( MidiPort* port ) { - m_midiPorts.push_back( _port ); + m_midiPorts.push_back( port ); } -void MidiClient::removePort( MidiPort * _port ) +void MidiClient::removePort( MidiPort* port ) { QVector::Iterator it = - qFind( m_midiPorts.begin(), m_midiPorts.end(), _port ); + qFind( m_midiPorts.begin(), m_midiPorts.end(), port ); if( it != m_midiPorts.end() ) { m_midiPorts.erase( it ); @@ -79,14 +78,14 @@ void MidiClient::removePort( MidiPort * _port ) -void MidiClient::subscribeReadablePort( MidiPort *, const QString & , bool ) +void MidiClient::subscribeReadablePort( MidiPort*, const QString& , bool ) { } -void MidiClient::subscribeWritablePort( MidiPort * , const QString & , bool ) +void MidiClient::subscribeWritablePort( MidiPort* , const QString& , bool ) { } @@ -124,7 +123,7 @@ void MidiClientRaw::parseData( const unsigned char c ) { if( c == MidiSystemReset ) { - m_midiParseData.m_midiEvent.m_type = MidiSystemReset; + m_midiParseData.m_midiEvent.setType( MidiSystemReset ); m_midiParseData.m_status = 0; processParsedEvent(); } @@ -206,34 +205,30 @@ void MidiClientRaw::parseData( const unsigned char c ) * We simply keep the status as it is, just reset the parameter counter. * If another status byte comes in, it will overwrite the status. */ - m_midiParseData.m_midiEvent.m_type = static_cast( m_midiParseData.m_status ); - m_midiParseData.m_midiEvent.m_channel = m_midiParseData.m_channel; + m_midiParseData.m_midiEvent.setType( static_cast( m_midiParseData.m_status ) ); + m_midiParseData.m_midiEvent.setChannel( m_midiParseData.m_channel ); m_midiParseData.m_bytes = 0; /* Related to running status! */ - switch( m_midiParseData.m_midiEvent.m_type ) + switch( m_midiParseData.m_midiEvent.type() ) { case MidiNoteOff: case MidiNoteOn: case MidiKeyPressure: case MidiProgramChange: case MidiChannelPressure: - m_midiParseData.m_midiEvent.m_data.m_param[0] = - m_midiParseData.m_buffer[0] - KeysPerOctave; - m_midiParseData.m_midiEvent.m_data.m_param[1] = - m_midiParseData.m_buffer[1]; + m_midiParseData.m_midiEvent.setKey( m_midiParseData.m_buffer[0] - KeysPerOctave ); + m_midiParseData.m_midiEvent.setVelocity( m_midiParseData.m_buffer[1] ); break; case MidiControlChange: - m_midiParseData.m_midiEvent.m_data.m_param[0] = m_midiParseData.m_buffer[0]; - m_midiParseData.m_midiEvent.m_data.m_param[1] = m_midiParseData.m_buffer[1]; + m_midiParseData.m_midiEvent.setControllerNumber( m_midiParseData.m_buffer[0] ); + m_midiParseData.m_midiEvent.setControllerValue( m_midiParseData.m_buffer[1] ); break; case MidiPitchBend: // Pitch-bend is transmitted with 14-bit precision. // Note: '|' does here the same as '+' (no common bits), // but might be faster - m_midiParseData.m_midiEvent.m_data.m_param[0] = - ( ( m_midiParseData.m_buffer[1] * 128 ) | - m_midiParseData.m_buffer[0] ); + m_midiParseData.m_midiEvent.setPitchBend( ( m_midiParseData.m_buffer[1] * 128 ) | m_midiParseData.m_buffer[0] ); break; default: @@ -251,33 +246,29 @@ void MidiClientRaw::processParsedEvent() { for( int i = 0; i < m_midiPorts.size(); ++i ) { - m_midiPorts[i]->processInEvent( m_midiParseData.m_midiEvent, - midiTime() ); + m_midiPorts[i]->processInEvent( m_midiParseData.m_midiEvent ); } } -void MidiClientRaw::processOutEvent( const midiEvent & _me, - const midiTime & , - const MidiPort * _port ) +void MidiClientRaw::processOutEvent( const MidiEvent& event, const MidiTime & , const MidiPort* port ) { // TODO: also evaluate _time and queue event if necessary - switch( _me.m_type ) + switch( event.type() ) { case MidiNoteOn: case MidiNoteOff: case MidiKeyPressure: - sendByte( _me.m_type | _me.channel() ); - sendByte( _me.m_data.m_param[0] + KeysPerOctave ); - sendByte( tLimit( (int) _me.m_data.m_param[1], - 0, 127 ) ); + sendByte( event.type() | event.channel() ); + sendByte( event.key() + KeysPerOctave ); + sendByte( event.velocity() ); break; default: qWarning( "MidiClientRaw: unhandled MIDI-event %d\n", - (int) _me.m_type ); + (int) event.type() ); break; } } diff --git a/src/core/midi/MidiController.cpp b/src/core/midi/MidiController.cpp index d323e6e7fc..5e65b5cd06 100644 --- a/src/core/midi/MidiController.cpp +++ b/src/core/midi/MidiController.cpp @@ -73,20 +73,19 @@ void MidiController::updateName() -void MidiController::processInEvent( const midiEvent & _me, - const midiTime & _time ) +void MidiController::processInEvent( const MidiEvent& event, const MidiTime& time ) { unsigned char controllerNum; - switch( _me.m_type ) + switch( event.type() ) { case MidiControlChange: - controllerNum = _me.m_data.m_bytes[0] & 0x7F; + controllerNum = event.controllerNumber(); if( m_midiPort.inputController() == controllerNum + 1 && - ( m_midiPort.inputChannel() == _me.m_channel + 1 || + ( m_midiPort.inputChannel() == event.channel() + 1 || m_midiPort.inputChannel() == 0 ) ) { - unsigned char val = _me.m_data.m_bytes[2] & 0x7F; + unsigned char val = event.controllerValue(); m_lastValue = (float)( val ) / 127.0f; emit valueChanged(); } diff --git a/src/core/midi/MidiPort.cpp b/src/core/midi/MidiPort.cpp index eb69493565..c798fd265d 100644 --- a/src/core/midi/MidiPort.cpp +++ b/src/core/midi/MidiPort.cpp @@ -2,7 +2,7 @@ * MidiPort.cpp - abstraction of MIDI-ports which are part of LMMS's MIDI- * sequencing system * - * Copyright (c) 2005-2013 Tobias Doerffel + * Copyright (c) 2005-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -123,64 +123,58 @@ void MidiPort::setMode( Modes _mode ) -void MidiPort::processInEvent( const midiEvent & _me, const midiTime & _time ) +void MidiPort::processInEvent( const MidiEvent& event, const MidiTime& time ) { // mask event if( inputEnabled() && - ( inputChannel()-1 == _me.m_channel || inputChannel() == 0 ) ) + ( inputChannel() == 0 || inputChannel()-1 == event.channel() ) ) { - midiEvent ev = _me; - if( _me.m_type == MidiNoteOn || - _me.m_type == MidiNoteOff || - _me.m_type == MidiKeyPressure ) + MidiEvent inEvent = event; + if( event.type() == MidiNoteOn || + event.type() == MidiNoteOff || + event.type() == MidiKeyPressure ) { - ev.key() = ev.key() + KeysPerOctave; - if( ev.key() < 0 || ev.key() >= NumKeys ) + inEvent.setKey( inEvent.key() + KeysPerOctave ); + if( inEvent.key() < 0 || inEvent.key() >= NumKeys ) { return; } } - if( fixedInputVelocity() >= 0 && _me.velocity() > 0 ) + if( fixedInputVelocity() >= 0 && inEvent.velocity() > 0 ) { - ev.velocity() = fixedInputVelocity(); + inEvent.setVelocity( fixedInputVelocity() ); } - ev.setFromMidiPort( true ); - m_midiEventProcessor->processInEvent( ev, _time ); + m_midiEventProcessor->processInEvent( inEvent, time ); } } -void MidiPort::processOutEvent( const midiEvent & _me, const midiTime & _time ) +void MidiPort::processOutEvent( const MidiEvent& event, const MidiTime& time ) { // mask event - if( outputEnabled() && realOutputChannel() == _me.m_channel ) + if( outputEnabled() && realOutputChannel() == event.channel() ) { - midiEvent ev = _me; - // we use/display MIDI channels 1...16 but we need 0...15 for - // the outside world - // We are already in "real" MIDI channel space here - /* if( ev.m_channel > 0 ) - { - --ev.m_channel; - } */ - if( ( _me.m_type == MidiNoteOn || _me.m_type == MidiNoteOff ) && + MidiEvent outEvent = event; + + if( ( event.type() == MidiNoteOn || event.type() == MidiNoteOff ) && fixedOutputNote() >= 0 ) { // Convert MIDI note number (from spinbox) -> LMMS note number // that will be converted back when outputted. - ev.key() = fixedOutputNote() - KeysPerOctave; + outEvent.setKey( fixedOutputNote() - KeysPerOctave ); } - if( fixedOutputVelocity() >= 0 && _me.velocity() > 0 && - ( _me.m_type == MidiNoteOn || - _me.m_type == MidiKeyPressure ) ) + + if( fixedOutputVelocity() >= 0 && event.velocity() > 0 && + ( event.type() == MidiNoteOn || event.type() == MidiKeyPressure ) ) { - ev.velocity() = fixedOutputVelocity(); + outEvent.setVelocity( fixedOutputVelocity() ); } - m_midiClient->processOutEvent( ev, _time, this ); + + m_midiClient->processOutEvent( outEvent, time, this ); } } @@ -420,9 +414,9 @@ void MidiPort::updateWritablePorts( void ) void MidiPort::updateOutputProgram( void ) { - processOutEvent( midiEvent( MidiProgramChange, + processOutEvent( MidiEvent( MidiProgramChange, realOutputChannel(), - outputProgram()-1 ), midiTime( 0 ) ); + outputProgram()-1 ), MidiTime( 0 ) ); } diff --git a/src/core/midi/MidiWinMM.cpp b/src/core/midi/MidiWinMM.cpp index dc06db8913..7920bc3e32 100644 --- a/src/core/midi/MidiWinMM.cpp +++ b/src/core/midi/MidiWinMM.cpp @@ -57,8 +57,8 @@ MidiWinMM::~MidiWinMM() -void MidiWinMM::processOutEvent( const midiEvent & _me, - const midiTime & _time, +void MidiWinMM::processOutEvent( const MidiEvent & _me, + const MidiTime & _time, const MidiPort * _port ) { const DWORD shortMsg = ( _me.m_type + _me.channel() ) + @@ -137,7 +137,7 @@ void MidiWinMM::removePort( MidiPort * _port ) -QString MidiWinMM::sourcePortName( const midiEvent & _event ) const +QString MidiWinMM::sourcePortName( const MidiEvent & _event ) const { if( _event.sourcePort() ) { @@ -232,22 +232,22 @@ void MidiWinMM::handleInputEvent( HMIDIIN _hm, DWORD _ev ) case MidiNoteOff: case MidiKeyPressure: ( *it )->processInEvent( - midiEvent( cmdtype, chan, par1 - KeysPerOctave, - par2 & 0xff, &_hm ), midiTime() ); + MidiEvent( cmdtype, chan, par1 - KeysPerOctave, + par2 & 0xff, &_hm ), MidiTime() ); break; case MidiControlChange: case MidiProgramChange: case MidiChannelPressure: ( *it )->processInEvent( - midiEvent( cmdtype, chan, par1, par2 & 0xff, &_hm ), - midiTime() ); + MidiEvent( cmdtype, chan, par1, par2 & 0xff, &_hm ), + MidiTime() ); break; case MidiPitchBend: ( *it )->processInEvent( - midiEvent( cmdtype, chan, par1 + par2*128, 0, &_hm ), - midiTime() ); + MidiEvent( cmdtype, chan, par1 + par2*128, 0, &_hm ), + MidiTime() ); break; default: diff --git a/src/core/note.cpp b/src/core/note.cpp index 2d77f02373..ce86cb9c04 100644 --- a/src/core/note.cpp +++ b/src/core/note.cpp @@ -35,7 +35,7 @@ -note::note( const midiTime & _length, const midiTime & _pos, +note::note( const MidiTime & _length, const MidiTime & _pos, int _key, volume_t _volume, panning_t _panning, DetuningHelper * _detuning ) : m_selected( false ), @@ -96,7 +96,7 @@ note::~note() -void note::setLength( const midiTime & _length ) +void note::setLength( const MidiTime & _length ) { // addJournalEntry( journalEntry( ChangeLength, m_length - _length ) ); m_length = _length; @@ -105,7 +105,7 @@ void note::setLength( const midiTime & _length ) -void note::setPos( const midiTime & _pos ) +void note::setPos( const MidiTime & _pos ) { // addJournalEntry( journalEntry( ChangePosition, m_pos - _pos ) ); m_pos = _pos; @@ -144,7 +144,7 @@ void note::setPanning( const panning_t _panning ) -midiTime note::quantized( const midiTime & _m, const int _q_grid ) +MidiTime note::quantized( const MidiTime & _m, const int _q_grid ) { float p = ( (float) _m / _q_grid ); if( p - floorf( p ) < 0.5f ) diff --git a/src/core/note_play_handle.cpp b/src/core/note_play_handle.cpp index 88482599cf..c8845b6f6c 100644 --- a/src/core/note_play_handle.cpp +++ b/src/core/note_play_handle.cpp @@ -29,6 +29,7 @@ #include "DetuningHelper.h" #include "InstrumentSoundShaping.h" #include "InstrumentTrack.h" +#include "MidiEvent.h" #include "MidiPort.h" #include "song.h" @@ -48,7 +49,8 @@ notePlayHandle::notePlayHandle( InstrumentTrack * _it, const f_cnt_t _frames, const note & _n, notePlayHandle *parent, - const bool _part_of_arp ) : + const bool _part_of_arp, + int MidiEventChannel ) : playHandle( NotePlayHandle, _offset ), note( _n.length(), _n.pos(), _n.key(), _n.getVolume(), _n.getPanning(), _n.detuning() ), @@ -73,7 +75,8 @@ notePlayHandle::notePlayHandle( InstrumentTrack * _it, m_frequency( 0 ), m_unpitchedFrequency( 0 ), m_baseDetuning( NULL ), - m_songGlobalParentOffset( 0 ) + m_songGlobalParentOffset( 0 ), + m_midiChannel( MidiEventChannel >= 0 ? MidiEventChannel : instrumentTrack()->midiPort()->realOutputChannel() ) { if( isTopNote() ) { @@ -103,12 +106,10 @@ notePlayHandle::notePlayHandle( InstrumentTrack * _it, if( !isTopNote() || !instrumentTrack()->isArpeggioEnabled() ) { - // send MIDI-note-on-event - m_instrumentTrack->processOutEvent( midiEvent( MidiNoteOn, - m_instrumentTrack->midiPort()->realOutputChannel(), - midiKey(), midiVelocity() ), - midiTime::fromFrames( offset(), - engine::framesPerTick() ) ); + // send MidiNoteOn event + m_instrumentTrack->processOutEvent( + MidiEvent( MidiNoteOn, midiChannel(), midiKey(), midiVelocity() ), + MidiTime::fromFrames( offset(), engine::framesPerTick() ) ); } } @@ -151,10 +152,21 @@ notePlayHandle::~notePlayHandle() void notePlayHandle::setVolume( const volume_t _volume ) { note::setVolume( _volume ); - m_instrumentTrack->processOutEvent( midiEvent( MidiKeyPressure, - m_instrumentTrack->midiPort()->realOutputChannel(), - midiKey(), midiVelocity() ), 0 ); - + + m_instrumentTrack->processOutEvent( MidiEvent( MidiKeyPressure, midiChannel(), midiKey(), midiVelocity() ) ); +} + + + + +void notePlayHandle::setPanning( const panning_t panning ) +{ + note::setPanning( panning ); + + MidiEvent event( MidiMetaEvent, midiChannel(), midiKey(), panningToMidi( panning ) ); + event.setMetaEvent( MidiNotePanning ); + + m_instrumentTrack->processOutEvent( event ); } @@ -341,12 +353,10 @@ void notePlayHandle::noteOff( const f_cnt_t _s ) if( !isTopNote() || !instrumentTrack()->isArpeggioEnabled() ) { - // send MIDI-note-off-event - m_instrumentTrack->processOutEvent( midiEvent( MidiNoteOff, - m_instrumentTrack->midiPort()->realOutputChannel(), - midiKey(), 0 ), - midiTime::fromFrames( m_framesBeforeRelease, - engine::framesPerTick() ) ); + // send MidiNoteOff event + m_instrumentTrack->processOutEvent( + MidiEvent( MidiNoteOff, midiChannel(), midiKey(), 0 ), + MidiTime::fromFrames( m_framesBeforeRelease, engine::framesPerTick() ) ); } m_released = true; @@ -501,7 +511,7 @@ void notePlayHandle::updateFrequency() -void notePlayHandle::processMidiTime( const midiTime& time ) +void notePlayHandle::processMidiTime( const MidiTime& time ) { if( detuning() && time >= songGlobalParentOffset()+pos() ) { diff --git a/src/core/song.cpp b/src/core/song.cpp index f49f1bb314..f01e7f0cdb 100644 --- a/src/core/song.cpp +++ b/src/core/song.cpp @@ -76,7 +76,7 @@ #include #endif -tick_t midiTime::s_ticksPerTact = DefaultTicksPerTact; +tick_t MidiTime::s_ticksPerTact = DefaultTicksPerTact; @@ -256,7 +256,7 @@ void song::setTempo() void song::setTimeSignature() { - midiTime::setTicksPerTact( ticksPerTact() ); + MidiTime::setTicksPerTact( ticksPerTact() ); emit timeSignatureChanged( m_oldTicksPerTact, ticksPerTact() ); emit dataChanged(); m_oldTicksPerTact = ticksPerTact(); @@ -494,7 +494,7 @@ void song::processNextBuffer() #endif // did we play a whole tact? - if( ticks >= midiTime::ticksPerTact() ) + if( ticks >= MidiTime::ticksPerTact() ) { // per default we just continue playing even if // there's no more stuff to play @@ -525,7 +525,7 @@ void song::processNextBuffer() // then start from beginning and keep // offset ticks = ticks % ( max_tact * - midiTime::ticksPerTact() ); + MidiTime::ticksPerTact() ); #ifdef VST_SNC_LATENCY m_SncVSTplug->ppqPos = ( ( ticks + 0 ) / (float)48 ) diff --git a/src/core/timeline.cpp b/src/core/timeline.cpp index 74d754eba0..3c0aa6f11e 100644 --- a/src/core/timeline.cpp +++ b/src/core/timeline.cpp @@ -47,7 +47,7 @@ QPixmap * timeLine::s_loopPointPixmap = NULL; timeLine::timeLine( const int _xoff, const int _yoff, const float _ppt, - song::playPos & _pos, const midiTime & _begin, + song::playPos & _pos, const MidiTime & _begin, QWidget * _parent ) : QWidget( _parent ), m_autoScroll( AutoScrollEnabled ), @@ -175,7 +175,7 @@ void timeLine::loadSettings( const QDomElement & _this ) -void timeLine::updatePosition( const midiTime & ) +void timeLine::updatePosition( const MidiTime & ) { const int new_x = markerX( m_pos ); @@ -238,7 +238,7 @@ void timeLine::paintEvent( QPaintEvent * ) tact_t tact_num = m_begin.getTact(); int x = m_xOffset + s_posMarkerPixmap->width() / 2 - - ( ( static_cast( m_begin * m_ppt ) / midiTime::ticksPerTact() ) % static_cast( m_ppt ) ); + ( ( static_cast( m_begin * m_ppt ) / MidiTime::ticksPerTact() ) % static_cast( m_ppt ) ); p.setPen( QColor( 192, 192, 192 ) ); for( int i = 0; x + i * m_ppt < width(); ++i ) @@ -248,7 +248,7 @@ void timeLine::paintEvent( QPaintEvent * ) ++tact_num; if( ( tact_num - 1 ) % qMax( 1, qRound( 1.0f / 3.0f * - midiTime::ticksPerTact() / m_ppt ) ) == 0 ) + MidiTime::ticksPerTact() / m_ppt ) ) == 0 ) { const QString s = QString::number( tact_num ); p.drawText( cx + qRound( ( m_ppt - p.fontMetrics(). @@ -285,7 +285,7 @@ void timeLine::mousePressEvent( QMouseEvent* event ) } else if( event->button() == Qt::RightButton ) { - const midiTime t = m_begin + static_cast( event->x() * midiTime::ticksPerTact() / m_ppt ); + const MidiTime t = m_begin + static_cast( event->x() * MidiTime::ticksPerTact() / m_ppt ); if( m_loopPos[0] > m_loopPos[1] ) { qSwap( m_loopPos[0], m_loopPos[1] ); @@ -324,7 +324,7 @@ void timeLine::mousePressEvent( QMouseEvent* event ) void timeLine::mouseMoveEvent( QMouseEvent* event ) { - const midiTime t = m_begin + static_cast( qMax( event->x() - m_xOffset - m_moveXOff, 0 ) * midiTime::ticksPerTact() / m_ppt ); + const MidiTime t = m_begin + static_cast( qMax( event->x() - m_xOffset - m_moveXOff, 0 ) * MidiTime::ticksPerTact() / m_ppt ); switch( m_action ) { @@ -356,9 +356,9 @@ void timeLine::mouseMoveEvent( QMouseEvent* event ) // Note, swap 1 and 0 below and the behavior "skips" the other // marking instead of pushing it. if( m_action == MoveLoopBegin ) - m_loopPos[0] -= midiTime::ticksPerTact(); + m_loopPos[0] -= MidiTime::ticksPerTact(); else - m_loopPos[1] += midiTime::ticksPerTact(); + m_loopPos[1] += MidiTime::ticksPerTact(); } update(); break; diff --git a/src/core/track.cpp b/src/core/track.cpp index 10a4ed80fb..f11210e270 100644 --- a/src/core/track.cpp +++ b/src/core/track.cpp @@ -145,7 +145,7 @@ trackContentObject::~trackContentObject() * * \param _pos The new position of the track content object. */ -void trackContentObject::movePosition( const midiTime & _pos ) +void trackContentObject::movePosition( const MidiTime & _pos ) { if( m_startPosition != _pos ) { @@ -166,7 +166,7 @@ void trackContentObject::movePosition( const midiTime & _pos ) * * \param _length The new length of the track content object. */ -void trackContentObject::changeLength( const midiTime & _length ) +void trackContentObject::changeLength( const MidiTime & _length ) { if( m_length != _length ) { @@ -243,7 +243,7 @@ void trackContentObject::paste() { if( Clipboard::getContent( nodeName() ) != NULL ) { - const midiTime pos = startPosition(); + const MidiTime pos = startPosition(); restoreState( *( Clipboard::getContent( nodeName() ) ) ); movePosition( pos ); } @@ -422,7 +422,7 @@ void trackContentObjectView::updateLength() { setFixedWidth( static_cast( m_tco->length() * pixelsPerTact() / - midiTime::ticksPerTact() ) + + MidiTime::ticksPerTact() ) + TCO_BORDER_WIDTH * 2-1 ); } m_trackView->trackContainerView()->update(); @@ -485,7 +485,7 @@ void trackContentObjectView::dropEvent( QDropEvent * _de ) multimediaProject mmp( value.toUtf8() ); // at least save position before getting to moved to somewhere // the user doesn't expect... - midiTime pos = m_tco->startPosition(); + MidiTime pos = m_tco->startPosition(); m_tco->restoreState( mmp.content().firstChild().toElement() ); m_tco->movePosition( pos ); AutomationPattern::resolveAllIDs(); @@ -654,9 +654,9 @@ void trackContentObjectView::mouseMoveEvent( QMouseEvent * _me ) if( m_action == Move ) { const int x = mapToParent( _me->pos() ).x() - m_initialMouseX; - midiTime t = qMax( 0, (int) + MidiTime t = qMax( 0, (int) m_trackView->trackContainerView()->currentPosition()+ - static_cast( x * midiTime::ticksPerTact() / + static_cast( x * MidiTime::ticksPerTact() / ppt ) ); if( ! ( _me->modifiers() & Qt::ControlModifier ) && _me->button() == Qt::NoButton ) @@ -668,7 +668,7 @@ void trackContentObjectView::mouseMoveEvent( QMouseEvent * _me ) s_textFloat->setText( QString( "%1:%2" ). arg( m_tco->startPosition().getTact() + 1 ). arg( m_tco->startPosition().getTicks() % - midiTime::ticksPerTact() ) ); + MidiTime::ticksPerTact() ) ); s_textFloat->moveGlobal( this, QPoint( width() + 2, height() + 2 ) ); } @@ -678,7 +678,7 @@ void trackContentObjectView::mouseMoveEvent( QMouseEvent * _me ) QVector so = m_trackView->trackContainerView()->selectedObjects(); QVector tcos; - midiTime smallest_pos, t; + MidiTime smallest_pos, t; // find out smallest position of all selected objects for not // moving an object before zero for( QVector::iterator it = so.begin(); @@ -695,13 +695,13 @@ void trackContentObjectView::mouseMoveEvent( QMouseEvent * _me ) smallest_pos = qMin( smallest_pos, (int)tco->startPosition() + static_cast( dx * - midiTime::ticksPerTact() / ppt ) ); + MidiTime::ticksPerTact() / ppt ) ); } for( QVector::iterator it = tcos.begin(); it != tcos.end(); ++it ) { t = ( *it )->startPosition() + - static_cast( dx *midiTime::ticksPerTact() / + static_cast( dx *MidiTime::ticksPerTact() / ppt )-smallest_pos; if( ! ( _me->modifiers() & Qt::AltModifier ) && _me->button() == Qt::NoButton ) @@ -713,22 +713,22 @@ void trackContentObjectView::mouseMoveEvent( QMouseEvent * _me ) } else if( m_action == Resize ) { - midiTime t = qMax( midiTime::ticksPerTact() / 16, static_cast( _me->x() * midiTime::ticksPerTact() / ppt ) ); + MidiTime t = qMax( MidiTime::ticksPerTact() / 16, static_cast( _me->x() * MidiTime::ticksPerTact() / ppt ) ); if( ! ( _me->modifiers() & Qt::ControlModifier ) && _me->button() == Qt::NoButton ) { - t = qMax( midiTime::ticksPerTact(), t.toNearestTact() ); + t = qMax( MidiTime::ticksPerTact(), t.toNearestTact() ); } m_tco->changeLength( t ); s_textFloat->setText( tr( "%1:%2 (%3:%4 to %5:%6)" ). arg( m_tco->length().getTact() ). arg( m_tco->length().getTicks() % - midiTime::ticksPerTact() ). + MidiTime::ticksPerTact() ). arg( m_tco->startPosition().getTact() + 1 ). arg( m_tco->startPosition().getTicks() % - midiTime::ticksPerTact() ). + MidiTime::ticksPerTact() ). arg( m_tco->endPosition().getTact() + 1 ). arg( m_tco->endPosition().getTicks() % - midiTime::ticksPerTact() ) ); + MidiTime::ticksPerTact() ) ); s_textFloat->moveGlobal( this, QPoint( width() + 2, height() + 2) ); } @@ -864,8 +864,8 @@ trackContentWidget::trackContentWidget( trackView * _parent ) : setAcceptDrops( true ); connect( _parent->trackContainerView(), - SIGNAL( positionChanged( const midiTime & ) ), - this, SLOT( changePosition( const midiTime & ) ) ); + SIGNAL( positionChanged( const MidiTime & ) ), + this, SLOT( changePosition( const MidiTime & ) ) ); updateBackground(); } @@ -1014,7 +1014,7 @@ void trackContentWidget::update() * * \param _new_pos The MIDI time to move to. */ -void trackContentWidget::changePosition( const midiTime & _new_pos ) +void trackContentWidget::changePosition( const MidiTime & _new_pos ) { if( m_trackView->trackContainerView() == engine::getBBEditor() ) { @@ -1051,7 +1051,7 @@ void trackContentWidget::changePosition( const midiTime & _new_pos ) return; } - midiTime pos = _new_pos; + MidiTime pos = _new_pos; if( pos < 0 ) { pos = m_trackView->trackContainerView()->currentPosition(); @@ -1077,7 +1077,7 @@ void trackContentWidget::changePosition( const midiTime & _new_pos ) ( ts <= begin && te >= end ) ) { tcov->move( static_cast( ( ts - begin ) * ppt / - midiTime::ticksPerTact() ), + MidiTime::ticksPerTact() ), tcov->y() ); if( !tcov->isVisible() ) { @@ -1122,7 +1122,7 @@ void trackContentWidget::dropEvent( QDropEvent * _de ) if( type == ( "tco_" + QString::number( getTrack()->type() ) ) && m_trackView->trackContainerView()->fixedTCOs() == false ) { - const midiTime pos = getPosition( _de->pos().x() + const MidiTime pos = getPosition( _de->pos().x() ).toNearestTact(); trackContentObject * tco = getTrack()->createTCO( pos ); @@ -1162,8 +1162,8 @@ void trackContentWidget::mousePressEvent( QMouseEvent * _me ) else if( _me->button() == Qt::LeftButton && !m_trackView->trackContainerView()->fixedTCOs() ) { - const midiTime pos = getPosition( _me->x() ).getTact() * - midiTime::ticksPerTact(); + const MidiTime pos = getPosition( _me->x() ).getTact() * + MidiTime::ticksPerTact(); trackContentObject * tco = getTrack()->createTCO( pos ); tco->saveJournallingState( false ); @@ -1237,7 +1237,7 @@ void trackContentWidget::undoStep( JournalEntry & _je ) case RemoveTrackContentObject: { - trackContentObject * tco = getTrack()->createTCO( midiTime( 0 ) ); + trackContentObject * tco = getTrack()->createTCO( MidiTime( 0 ) ); multimediaProject mmp( _je.data().toMap()["state"]. toString().toUtf8() ); @@ -1292,11 +1292,11 @@ track * trackContentWidget::getTrack() * * \param _mouse_x the mouse's current X position in pixels. */ -midiTime trackContentWidget::getPosition( int _mouse_x ) +MidiTime trackContentWidget::getPosition( int _mouse_x ) { - return midiTime( m_trackView->trackContainerView()-> + return MidiTime( m_trackView->trackContainerView()-> currentPosition() + _mouse_x * - midiTime::ticksPerTact() / + MidiTime::ticksPerTact() / static_cast( m_trackView-> trackContainerView()->pixelsPerTact() ) ); } @@ -1307,11 +1307,11 @@ midiTime trackContentWidget::getPosition( int _mouse_x ) * * \param _pos_start the starting position of the Widget (from getPosition()) */ -midiTime trackContentWidget::endPosition( const midiTime & _pos_start ) +MidiTime trackContentWidget::endPosition( const MidiTime & _pos_start ) { const float ppt = m_trackView->trackContainerView()->pixelsPerTact(); const int w = width(); - return _pos_start + static_cast( w * midiTime::ticksPerTact() / ppt ); + return _pos_start + static_cast( w * MidiTime::ticksPerTact() / ppt ); } @@ -1762,7 +1762,7 @@ void track::loadSettings( const QDomElement & _this ) !node.toElement().attribute( "metadata" ).toInt() ) { trackContentObject * tco = createTCO( - midiTime( 0 ) ); + MidiTime( 0 ) ); tco->restoreState( node.toElement() ); saveJournallingState( false ); restoreJournallingState(); @@ -1852,7 +1852,7 @@ trackContentObject * track::getTCO( int _tco_num ) } printf( "called track::getTCO( %d ), " "but TCO %d doesn't exist\n", _tco_num, _tco_num ); - return createTCO( _tco_num * midiTime::ticksPerTact() ); + return createTCO( _tco_num * MidiTime::ticksPerTact() ); } @@ -1898,8 +1898,8 @@ int track::getTCONum( trackContentObject * _tco ) * \param _start The MIDI start time of the range. * \param _end The MIDI endi time of the range. */ -void track::getTCOsInRange( tcoVector & _tco_v, const midiTime & _start, - const midiTime & _end ) +void track::getTCOsInRange( tcoVector & _tco_v, const MidiTime & _start, + const MidiTime & _end ) { for( tcoVector::iterator it_o = m_trackContentObjects.begin(); it_o != m_trackContentObjects.end(); ++it_o ) @@ -1948,7 +1948,7 @@ void track::swapPositionOfTCOs( int _tco_num1, int _tco_num2 ) qSwap( m_trackContentObjects[_tco_num1], m_trackContentObjects[_tco_num2] ); - const midiTime pos = m_trackContentObjects[_tco_num1]->startPosition(); + const MidiTime pos = m_trackContentObjects[_tco_num1]->startPosition(); m_trackContentObjects[_tco_num1]->movePosition( m_trackContentObjects[_tco_num2]->startPosition() ); @@ -1965,7 +1965,7 @@ void track::swapPositionOfTCOs( int _tco_num1, int _tco_num2 ) * in ascending order by TCO time, once we hit a TCO that was earlier * than the insert time, we could fall out of the loop early. */ -void track::insertTact( const midiTime & _pos ) +void track::insertTact( const MidiTime & _pos ) { // we'll increase the position of every TCO, positioned behind _pos, by // one tact @@ -1975,7 +1975,7 @@ void track::insertTact( const midiTime & _pos ) if( ( *it )->startPosition() >= _pos ) { ( *it )->movePosition( (*it)->startPosition() + - midiTime::ticksPerTact() ); + MidiTime::ticksPerTact() ); } } } @@ -1987,7 +1987,7 @@ void track::insertTact( const midiTime & _pos ) * * \param _pos The time at which we want to remove the bar. */ -void track::removeTact( const midiTime & _pos ) +void track::removeTact( const MidiTime & _pos ) { // we'll decrease the position of every TCO, positioned behind _pos, by // one tact @@ -1997,7 +1997,7 @@ void track::removeTact( const midiTime & _pos ) if( ( *it )->startPosition() >= _pos ) { ( *it )->movePosition( qMax( ( *it )->startPosition() - - midiTime::ticksPerTact(), 0 ) ); + MidiTime::ticksPerTact(), 0 ) ); } } } @@ -2025,7 +2025,7 @@ tact_t track::length() const } } - return last / midiTime::ticksPerTact(); + return last / MidiTime::ticksPerTact(); } diff --git a/src/gui/AutomationEditor.cpp b/src/gui/AutomationEditor.cpp index ce3847f0e9..0c498ba798 100644 --- a/src/gui/AutomationEditor.cpp +++ b/src/gui/AutomationEditor.cpp @@ -57,7 +57,6 @@ #include "gui_templates.h" #include "timeline.h" #include "tooltip.h" -#include "midi.h" #include "tool_button.h" #include "text_float.h" #include "combobox.h" @@ -131,10 +130,10 @@ AutomationEditor::AutomationEditor() : engine::getSong()->getPlayPos( song::Mode_PlayAutomationPattern ), m_currentPosition, this ); - connect( this, SIGNAL( positionChanged( const midiTime & ) ), - m_timeLine, SLOT( updatePosition( const midiTime & ) ) ); - connect( m_timeLine, SIGNAL( positionChanged( const midiTime & ) ), - this, SLOT( updatePosition( const midiTime & ) ) ); + connect( this, SIGNAL( positionChanged( const MidiTime & ) ), + m_timeLine, SLOT( updatePosition( const MidiTime & ) ) ); + connect( m_timeLine, SIGNAL( positionChanged( const MidiTime & ) ), + this, SLOT( updatePosition( const MidiTime & ) ) ); m_toolBar = new QWidget( this ); @@ -789,8 +788,8 @@ void AutomationEditor::drawLine( int _x0, float _y0, int _x1, float _y1 ) x += xstep; i += 1; - m_pattern->removeValue( midiTime( x ) ); - m_pattern->putValue( midiTime( x ), y ); + m_pattern->removeValue( MidiTime( x ) ); + m_pattern->putValue( MidiTime( x ), y ); } } @@ -843,7 +842,7 @@ void AutomationEditor::mousePressEvent( QMouseEvent * _me ) // loop through whole time-map... while( it != time_map.end() ) { - midiTime len = 4; + MidiTime len = 4; // and check whether the user clicked on an // existing value @@ -878,9 +877,9 @@ void AutomationEditor::mousePressEvent( QMouseEvent * _me ) if( it == time_map.end() ) { // then set new value - midiTime value_pos( pos_ticks ); + MidiTime value_pos( pos_ticks ); - midiTime new_time = + MidiTime new_time = m_pattern->putValue( value_pos, level ); @@ -1020,8 +1019,8 @@ void AutomationEditor::mouseMoveEvent( QMouseEvent * _me ) // moved properly according to new starting- // time in the time map of pattern m_pattern->removeValue( - midiTime( pos_ticks ) ); - m_pattern->putValue( midiTime( pos_ticks ), + MidiTime( pos_ticks ) ); + m_pattern->putValue( MidiTime( pos_ticks ), level ); } @@ -1033,7 +1032,7 @@ void AutomationEditor::mouseMoveEvent( QMouseEvent * _me ) ( _me->buttons() & Qt::LeftButton && m_editMode == ERASE ) ) { - m_pattern->removeValue( midiTime( pos_ticks ) ); + m_pattern->removeValue( MidiTime( pos_ticks ) ); } else if( _me->buttons() & Qt::NoButton && m_editMode == DRAW ) { @@ -1216,7 +1215,7 @@ void AutomationEditor::mouseMoveEvent( QMouseEvent * _me ) for( timeMap::iterator it = m_selValuesForMove.begin(); it != m_selValuesForMove.end(); ++it ) { - midiTime new_value_pos; + MidiTime new_value_pos; if( it.key() ) { int value_tact = @@ -1236,7 +1235,7 @@ void AutomationEditor::mouseMoveEvent( QMouseEvent * _me ) DefaultTicksPerTact; } m_pattern->removeValue( it.key() ); - new_value_pos = midiTime( value_tact, + new_value_pos = MidiTime( value_tact, value_ticks ); } new_selValuesForMove[ @@ -2242,7 +2241,7 @@ void AutomationEditor::deleteSelectedValues() -void AutomationEditor::updatePosition( const midiTime & _t ) +void AutomationEditor::updatePosition( const MidiTime & _t ) { if( ( engine::getSong()->isPlaying() && engine::getSong()->playMode() == @@ -2257,7 +2256,7 @@ void AutomationEditor::updatePosition( const midiTime & _t ) } else if( _t < m_currentPosition ) { - midiTime t = qMax( _t - w * DefaultTicksPerTact * + MidiTime t = qMax( _t - w * DefaultTicksPerTact * DefaultTicksPerTact / m_ppt, 0 ); m_leftRightScroll->setValue( t.getTact() * DefaultTicksPerTact ); diff --git a/src/gui/AutomationPatternView.cpp b/src/gui/AutomationPatternView.cpp index cd0127b367..e66c728b48 100644 --- a/src/gui/AutomationPatternView.cpp +++ b/src/gui/AutomationPatternView.cpp @@ -250,7 +250,7 @@ void AutomationPatternView::paintEvent( QPaintEvent * ) if( it+1 == m_pat->getTimeMap().end() ) { const float x1 = x_base + it.key() * ppt / - midiTime::ticksPerTact(); + MidiTime::ticksPerTact(); const float x2 = (float)( width() - TCO_BORDER_WIDTH ); p.fillRect( QRectF( x1, 0.0f, x2-x1, it.value() ), lin2grad ); @@ -262,9 +262,9 @@ void AutomationPatternView::paintEvent( QPaintEvent * ) { float value = values[i - it.key()]; const float x1 = x_base + i * ppt / - midiTime::ticksPerTact(); + MidiTime::ticksPerTact(); const float x2 = x_base + (i+1) * ppt / - midiTime::ticksPerTact(); + MidiTime::ticksPerTact(); p.fillRect( QRectF( x1, 0.0f, x2-x1, value ), lin2grad ); diff --git a/src/gui/ControllerConnectionDialog.cpp b/src/gui/ControllerConnectionDialog.cpp index 5e2903f683..66fed87d3f 100644 --- a/src/gui/ControllerConnectionDialog.cpp +++ b/src/gui/ControllerConnectionDialog.cpp @@ -63,13 +63,13 @@ public: } - virtual void processInEvent( const midiEvent& event, const midiTime& time ) + virtual void processInEvent( const MidiEvent& event, const MidiTime& time ) { - if( event.m_type == MidiControlChange && - ( m_midiPort.inputChannel() == event.m_channel + 1 || m_midiPort.inputChannel() == 0 ) ) + if( event.type() == MidiControlChange && + ( m_midiPort.inputChannel() == 0 || m_midiPort.inputChannel() == event.channel() + 1 ) ) { - m_detectedMidiChannel = event.m_channel + 1; - m_detectedMidiController = ( event.m_data.m_bytes[0] & 0x7F ) + 1; + m_detectedMidiChannel = event.channel() + 1; + m_detectedMidiController = event.controllerNumber() + 1; m_detectedMidiPort = engine::mixer()->midiClient()->sourcePortName( event ); emit valueChanged(); diff --git a/src/gui/PianoView.cpp b/src/gui/PianoView.cpp index 18a916a1e4..771793247d 100644 --- a/src/gui/PianoView.cpp +++ b/src/gui/PianoView.cpp @@ -53,7 +53,7 @@ #include "knob.h" #include "string_pair_drag.h" #include "MainWindow.h" -#include "midi.h" +#include "MidiEvent.h" #include "templates.h" #include "update_event.h" @@ -465,7 +465,7 @@ void PianoView::mousePressEvent( QMouseEvent * _me ) velocity = MidiMaxVelocity; } // set note on - m_piano->midiEventProcessor()->processInEvent( midiEvent( MidiNoteOn, 0, key_num, velocity ), midiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOn, 0, key_num, velocity ), MidiTime() ); m_piano->setKeyState( key_num, true ); m_lastKey = key_num; @@ -510,7 +510,7 @@ void PianoView::mouseReleaseEvent( QMouseEvent * ) { if( m_piano != NULL ) { - m_piano->midiEventProcessor()->processInEvent( midiEvent( MidiNoteOff, 0, m_lastKey, 0 ), midiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOff, 0, m_lastKey, 0 ), MidiTime() ); m_piano->setKeyState( m_lastKey, false ); } @@ -571,7 +571,7 @@ void PianoView::mouseMoveEvent( QMouseEvent * _me ) { if( m_lastKey != -1 ) { - m_piano->midiEventProcessor()->processInEvent( midiEvent( MidiNoteOff, 0, m_lastKey, 0 ), midiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOff, 0, m_lastKey, 0 ), MidiTime() ); m_piano->setKeyState( m_lastKey, false ); m_lastKey = -1; } @@ -579,7 +579,7 @@ void PianoView::mouseMoveEvent( QMouseEvent * _me ) { if( _me->pos().y() > PIANO_BASE ) { - m_piano->midiEventProcessor()->processInEvent( midiEvent( MidiNoteOn, 0, key_num, velocity ), midiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOn, 0, key_num, velocity ), MidiTime() ); m_piano->setKeyState( key_num, true ); m_lastKey = key_num; } @@ -593,7 +593,7 @@ void PianoView::mouseMoveEvent( QMouseEvent * _me ) } else if( m_piano->isKeyPressed( key_num ) ) { - m_piano->midiEventProcessor()->processInEvent( midiEvent( MidiKeyPressure, 0, key_num, velocity ), midiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiKeyPressure, 0, key_num, velocity ), MidiTime() ); } } @@ -690,7 +690,7 @@ void PianoView::focusOutEvent( QFocusEvent * ) // hang otherwise for( int i = 0; i < NumKeys; ++i ) { - m_piano->midiEventProcessor()->processInEvent( midiEvent( MidiNoteOff, 0, i, 0 ), midiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOff, 0, i, 0 ), MidiTime() ); m_piano->setKeyState( i, false ); } update(); diff --git a/src/gui/TrackContainerView.cpp b/src/gui/TrackContainerView.cpp index 214d802a1e..11a91727dc 100644 --- a/src/gui/TrackContainerView.cpp +++ b/src/gui/TrackContainerView.cpp @@ -127,9 +127,9 @@ trackView * TrackContainerView::addTrackView( trackView * _tv ) m_trackViews.push_back( _tv ); m_scrollLayout->addWidget( _tv ); - connect( this, SIGNAL( positionChanged( const midiTime & ) ), + connect( this, SIGNAL( positionChanged( const MidiTime & ) ), _tv->getTrackContentWidget(), - SLOT( changePosition( const midiTime & ) ) ); + SLOT( changePosition( const MidiTime & ) ) ); realignTracks(); return( _tv ); } diff --git a/src/gui/piano_roll.cpp b/src/gui/piano_roll.cpp index 0c854808d1..bf27071fcd 100644 --- a/src/gui/piano_roll.cpp +++ b/src/gui/piano_roll.cpp @@ -56,7 +56,7 @@ #include "gui_templates.h" #include "InstrumentTrack.h" #include "MainWindow.h" -#include "midi.h" +#include "MidiEvent.h" #include "mmp.h" #include "pattern.h" #include "Piano.h" @@ -162,7 +162,7 @@ pianoRoll::pianoRoll() : m_oldNotesEditHeight( 100 ), m_notesEditHeight( 100 ), m_ppt( DEFAULT_PR_PPT ), - m_lenOfNewNotes( midiTime( 0, DefaultTicksPerTact/4 ) ), + m_lenOfNewNotes( MidiTime( 0, DefaultTicksPerTact/4 ) ), m_lastNoteVolume( DefaultVolume ), m_lastNotePanning( DefaultPanning ), m_startKey( INITIAL_START_KEY ), @@ -283,21 +283,21 @@ pianoRoll::pianoRoll() : engine::getSong()->getPlayPos( song::Mode_PlayPattern ), m_currentPosition, this ); - connect( this, SIGNAL( positionChanged( const midiTime & ) ), - m_timeLine, SLOT( updatePosition( const midiTime & ) ) ); - connect( m_timeLine, SIGNAL( positionChanged( const midiTime & ) ), - this, SLOT( updatePosition( const midiTime & ) ) ); + connect( this, SIGNAL( positionChanged( const MidiTime & ) ), + m_timeLine, SLOT( updatePosition( const MidiTime & ) ) ); + connect( m_timeLine, SIGNAL( positionChanged( const MidiTime & ) ), + this, SLOT( updatePosition( const MidiTime & ) ) ); // update timeline when in record-accompany mode connect( engine::getSong()->getPlayPos( song::Mode_PlaySong ).m_timeLine, - SIGNAL( positionChanged( const midiTime & ) ), + SIGNAL( positionChanged( const MidiTime & ) ), this, - SLOT( updatePositionAccompany( const midiTime & ) ) ); + SLOT( updatePositionAccompany( const MidiTime & ) ) ); // TODO /* connect( engine::getSong()->getPlayPos( song::Mode_PlayBB ).m_timeLine, - SIGNAL( positionChanged( const midiTime & ) ), + SIGNAL( positionChanged( const MidiTime & ) ), this, - SLOT( updatePositionAccompany( const midiTime & ) ) );*/ + SLOT( updatePositionAccompany( const MidiTime & ) ) );*/ m_toolBar = new QWidget( this ); @@ -927,7 +927,7 @@ inline void pianoRoll::drawDetuningInfo( QPainter & _p, note * _n, int _x, { break; } - int pos_x = _x + pos_ticks * m_ppt / midiTime::ticksPerTact(); + int pos_x = _x + pos_ticks * m_ppt / MidiTime::ticksPerTact(); const float level = it.value(); @@ -1522,7 +1522,7 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me ) x -= WHITE_KEY_WIDTH; // get tick in which the user clicked - int pos_ticks = x * midiTime::ticksPerTact() / m_ppt + + int pos_ticks = x * MidiTime::ticksPerTact() / m_ppt + m_currentPosition; @@ -1535,7 +1535,7 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me ) // loop through whole note-vector... for( int i = 0; i < notes.size(); ++i ) { - midiTime len = ( *it )->length(); + MidiTime len = ( *it )->length(); if( len < 0 ) { len = 4; @@ -1552,7 +1552,7 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me ) ( edit_note == true && pos_ticks <= ( *it )->pos() + NE_LINE_WIDTH * - midiTime::ticksPerTact() / + MidiTime::ticksPerTact() / m_ppt ) ) ) @@ -1593,8 +1593,8 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me ) // +32 to quanitize the note correctly when placing notes with // the mouse. We do this here instead of in note.quantized // because live notes should still be quantized at the half. - midiTime note_pos( pos_ticks - ( quantization() / 2 ) ); - midiTime note_len( newNoteLen() ); + MidiTime note_pos( pos_ticks - ( quantization() / 2 ) ); + MidiTime note_len( newNoteLen() ); note new_note( note_len, note_pos, key_num ); new_note.setSelected( true ); @@ -1701,8 +1701,8 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me ) // clicked at the "tail" of the note? - if( pos_ticks*m_ppt/midiTime::ticksPerTact() > - ( m_currentNote->pos() + m_currentNote->length() )*m_ppt/ midiTime::ticksPerTact() - RESIZE_AREA_WIDTH && + if( pos_ticks*m_ppt/MidiTime::ticksPerTact() > + ( m_currentNote->pos() + m_currentNote->length() )*m_ppt/ MidiTime::ticksPerTact() - RESIZE_AREA_WIDTH && m_currentNote->length() > 0 ) { // then resize the note @@ -1865,16 +1865,16 @@ void pianoRoll::testPlayNote( note * n ) { m_lastKey = n->key(); - if( ! n->isPlaying() && ! m_recording && - ! engine::getSong()->isPlaying() ) + if( ! n->isPlaying() && ! m_recording && ! engine::getSong()->isPlaying() ) { n->setIsPlaying( true ); m_pattern->instrumentTrack()->pianoModel()->handleKeyPress( n->key(), volumeToMidi( n->getVolume() ) ); - midiEvent evt( MidiMetaEvent, 0, n->key(), panningToMidi( n->getPanning() ) ); - - evt.m_metaEvent = MidiNotePanning; - m_pattern->instrumentTrack()->processInEvent( evt, midiTime() ); + MidiEvent event( MidiMetaEvent, 0, n->key(), panningToMidi( n->getPanning() ) ); + + event.setMetaEvent( MidiNotePanning ); + + m_pattern->instrumentTrack()->processInEvent( event, 0 ); } } @@ -1919,10 +1919,6 @@ void pianoRoll::testPlayKey( int key, int velocity, int pan ) // play new key m_pattern->instrumentTrack()->pianoModel()->handleKeyPress( key, velocity ); - - // set panning of newly played key - midiEvent evt( MidiMetaEvent, 0, key, pan ); - evt.m_metaEvent = MidiNotePanning; } @@ -2183,9 +2179,9 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) // convert to ticks so that we can check which notes // are in the range int ticks_start = (x-pixel_range/2) * - midiTime::ticksPerTact() / m_ppt + m_currentPosition; + MidiTime::ticksPerTact() / m_ppt + m_currentPosition; int ticks_end = (x+pixel_range/2) * - midiTime::ticksPerTact() / m_ppt + m_currentPosition; + MidiTime::ticksPerTact() / m_ppt + m_currentPosition; // get note-vector of current pattern const NoteVector & notes = m_pattern->notes(); @@ -2234,14 +2230,14 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) { n->setVolume( vol ); m_pattern->instrumentTrack()->processInEvent( - midiEvent( MidiKeyPressure, 0, n->key(), volumeToMidi( vol ) ), midiTime() ); + MidiEvent( MidiKeyPressure, 0, n->key(), volumeToMidi( vol ) ), MidiTime() ); } else if( m_noteEditMode == NoteEditPanning ) { n->setPanning( pan ); - midiEvent evt( MidiMetaEvent, 0, n->key(), panningToMidi( pan ) ); - evt.m_metaEvent = MidiNotePanning; - m_pattern->instrumentTrack()->processInEvent( evt, midiTime() ); + MidiEvent evt( MidiMetaEvent, 0, n->key(), panningToMidi( pan ) ); + evt.setMetaEvent( MidiNotePanning ); + m_pattern->instrumentTrack()->processInEvent( evt, MidiTime() ); } } else @@ -2264,7 +2260,7 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) // set move- or resize-cursor // get tick in which the cursor is posated - int pos_ticks = ( x * midiTime::ticksPerTact() ) / + int pos_ticks = ( x * MidiTime::ticksPerTact() ) / m_ppt + m_currentPosition; // get note-vector of current pattern @@ -2296,10 +2292,10 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) // cursor at the "tail" of the note? if( ( *it )->length() > 0 && pos_ticks*m_ppt / - midiTime::ticksPerTact() > + MidiTime::ticksPerTact() > ( ( *it )->pos() + ( *it )->length() )*m_ppt/ - midiTime::ticksPerTact()- + MidiTime::ticksPerTact()- RESIZE_AREA_WIDTH ) { if( QApplication::overrideCursor() ) @@ -2363,7 +2359,7 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) // change size of selection // get tick in which the cursor is posated - int pos_ticks = x * midiTime::ticksPerTact() / m_ppt + + int pos_ticks = x * MidiTime::ticksPerTact() / m_ppt + m_currentPosition; m_selectedTick = pos_ticks - m_selectStartTick; @@ -2383,7 +2379,7 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) // holding down right-click to delete notes // get tick in which the user clicked - int pos_ticks = x * midiTime::ticksPerTact() / m_ppt + + int pos_ticks = x * MidiTime::ticksPerTact() / m_ppt + m_currentPosition; @@ -2396,7 +2392,7 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) // loop through whole note-vector... while( it != notes.end() ) { - midiTime len = ( *it )->length(); + MidiTime len = ( *it )->length(); if( len < 0 ) { len = 4; @@ -2413,7 +2409,7 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) ( edit_note == true && pos_ticks <= ( *it )->pos() + NE_LINE_WIDTH * - midiTime::ticksPerTact() / + MidiTime::ticksPerTact() / m_ppt ) ) ) @@ -2474,7 +2470,7 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) } // get tick in which the cursor is posated - int pos_ticks = x * midiTime::ticksPerTact()/ m_ppt + + int pos_ticks = x * MidiTime::ticksPerTact()/ m_ppt + m_currentPosition; m_selectedTick = pos_ticks - @@ -2535,7 +2531,7 @@ void pianoRoll::dragNotes( int x, int y, bool alt, bool shift ) // convert pixels to ticks and keys int off_x = x - m_moveStartX; - int off_ticks = off_x * midiTime::ticksPerTact() / m_ppt; + int off_ticks = off_x * MidiTime::ticksPerTact() / m_ppt; int off_key = getKey( y ) - getKey( m_moveStartY ); // handle scroll changes while dragging @@ -2587,7 +2583,7 @@ void pianoRoll::dragNotes( int x, int y, bool alt, bool shift ) { shifted_pos -= off_ticks; } - ( *it )->setPos( midiTime( shifted_pos ) ); + ( *it )->setPos( MidiTime( shifted_pos ) ); } if( ( *it )->selected() ) @@ -2614,7 +2610,7 @@ void pianoRoll::dragNotes( int x, int y, bool alt, bool shift ) key_num = NumKeys; } - ( *it )->setPos( midiTime( pos_ticks ) ); + ( *it )->setPos( MidiTime( pos_ticks ) ); ( *it )->setKey( key_num ); } else if( m_action == ActionResizeNote ) @@ -2636,7 +2632,7 @@ void pianoRoll::dragNotes( int x, int y, bool alt, bool shift ) shift_ref_pos = pos; } } - ( *it )->setLength( midiTime( ticks_new ) ); + ( *it )->setLength( MidiTime( ticks_new ) ); m_lenOfNewNotes = ( *it )->length(); } @@ -2941,7 +2937,7 @@ void pianoRoll::paintEvent( QPaintEvent * _pe ) // triplet mode occurs if the note duration isn't a multiple of 3 bool triplets = ( quantization() % 3 != 0 ); - int spt = midiTime::stepsPerTact(); + int spt = MidiTime::stepsPerTact(); float pp16th = (float)m_ppt / spt; int bpt = DefaultBeatsPerTact; if ( triplets ) { @@ -2953,7 +2949,7 @@ void pianoRoll::paintEvent( QPaintEvent * _pe ) int tact_16th = m_currentPosition / bpt; const int offset = ( m_currentPosition % bpt ) * - m_ppt / midiTime::ticksPerTact(); + m_ppt / MidiTime::ticksPerTact(); bool show32nds = ( m_zoomingModel.value() > 3 ); @@ -3047,9 +3043,9 @@ void pianoRoll::paintEvent( QPaintEvent * _pe ) int pos_ticks = ( *it )->pos(); int note_width = len_ticks * m_ppt / - midiTime::ticksPerTact(); + MidiTime::ticksPerTact(); const int x = ( pos_ticks - m_currentPosition ) * - m_ppt / midiTime::ticksPerTact(); + m_ppt / MidiTime::ticksPerTact(); // skip this note if not in visible area at all if( !( x + note_width >= 0 && x <= width() - WHITE_KEY_WIDTH ) ) @@ -3141,9 +3137,9 @@ void pianoRoll::paintEvent( QPaintEvent * _pe ) // now draw selection-frame int x = ( ( sel_pos_start - m_currentPosition ) * m_ppt ) / - midiTime::ticksPerTact(); + MidiTime::ticksPerTact(); int w = ( ( ( sel_pos_end - m_currentPosition ) * m_ppt ) / - midiTime::ticksPerTact() ) - x; + MidiTime::ticksPerTact() ) - x; int y = (int) y_base - sel_key_start * KEY_LINE_HEIGHT; int h = (int) y_base - sel_key_end * KEY_LINE_HEIGHT - y; p.setPen( QColor( 0, 64, 192 ) ); @@ -3407,7 +3403,7 @@ void pianoRoll::startRecordNote( const note & _n ) engine::getSong()->playMode() == song::Mode_PlayPattern ) ) { - midiTime sub; + MidiTime sub; if( engine::getSong()->playMode() == song::Mode_PlaySong ) { sub = m_pattern->startPosition(); @@ -3596,7 +3592,7 @@ void pianoRoll::copy_to_clipboard( const NoteVector & _notes ) const QDomElement note_list = mmp.createElement( "note-list" ); mmp.content().appendChild( note_list ); - midiTime start_pos( _notes.front()->pos().getTact(), 0 ); + MidiTime start_pos( _notes.front()->pos().getTact(), 0 ); for( NoteVector::ConstIterator it = _notes.begin(); it != _notes.end(); ++it ) { @@ -3752,20 +3748,20 @@ void pianoRoll::deleteSelectedNotes() -void pianoRoll::autoScroll( const midiTime & _t ) +void pianoRoll::autoScroll( const MidiTime & _t ) { const int w = width() - WHITE_KEY_WIDTH; - if( _t > m_currentPosition + w * midiTime::ticksPerTact() / m_ppt ) + if( _t > m_currentPosition + w * MidiTime::ticksPerTact() / m_ppt ) { m_leftRightScroll->setValue( _t.getTact() * - midiTime::ticksPerTact() ); + MidiTime::ticksPerTact() ); } else if( _t < m_currentPosition ) { - midiTime t = qMax( _t - w * midiTime::ticksPerTact() * - midiTime::ticksPerTact() / m_ppt, 0 ); + MidiTime t = qMax( _t - w * MidiTime::ticksPerTact() * + MidiTime::ticksPerTact() / m_ppt, 0 ); m_leftRightScroll->setValue( t.getTact() * - midiTime::ticksPerTact() ); + MidiTime::ticksPerTact() ); } m_scrollBack = false; } @@ -3773,7 +3769,7 @@ void pianoRoll::autoScroll( const midiTime & _t ) -void pianoRoll::updatePosition( const midiTime & _t ) +void pianoRoll::updatePosition( const MidiTime & _t ) { if( ( engine::getSong()->isPlaying() && engine::getSong()->playMode() == @@ -3788,14 +3784,14 @@ void pianoRoll::updatePosition( const midiTime & _t ) -void pianoRoll::updatePositionAccompany( const midiTime & _t ) +void pianoRoll::updatePositionAccompany( const MidiTime & _t ) { song * s = engine::getSong(); if( m_recording && validPattern() && s->playMode() != song::Mode_PlayPattern ) { - midiTime pos = _t; + MidiTime pos = _t; if( s->playMode() != song::Mode_PlayBB ) { pos -= m_pattern->startPosition(); @@ -3868,7 +3864,7 @@ void pianoRoll::updateSemiToneMarkerMenu() -midiTime pianoRoll::newNoteLen() const +MidiTime pianoRoll::newNoteLen() const { if( m_noteLenModel.value() == 0 ) { @@ -3906,7 +3902,7 @@ note * pianoRoll::noteUnderMouse() int key_num = getKey( pos.y() ); int pos_ticks = ( pos.x() - WHITE_KEY_WIDTH ) * - midiTime::ticksPerTact() / m_ppt + m_currentPosition; + MidiTime::ticksPerTact() / m_ppt + m_currentPosition; // will be our iterator in the following loop NoteVector::ConstIterator it = notes.begin()+notes.size()-1; diff --git a/src/gui/song_editor.cpp b/src/gui/song_editor.cpp index 60d7ed256b..4a2205fbd6 100644 --- a/src/gui/song_editor.cpp +++ b/src/gui/song_editor.cpp @@ -99,11 +99,11 @@ songEditor::songEditor( song * _song, songEditor * & _engine_ptr ) : pixelsPerTact(), m_s->m_playPos[song::Mode_PlaySong], m_currentPosition, this ); - connect( this, SIGNAL( positionChanged( const midiTime & ) ), + connect( this, SIGNAL( positionChanged( const MidiTime & ) ), m_s->m_playPos[song::Mode_PlaySong].m_timeLine, - SLOT( updatePosition( const midiTime & ) ) ); - connect( m_timeLine, SIGNAL( positionChanged( const midiTime & ) ), - this, SLOT( updatePosition( const midiTime & ) ) ); + SLOT( updatePosition( const MidiTime & ) ) ); + connect( m_timeLine, SIGNAL( positionChanged( const MidiTime & ) ), + this, SLOT( updatePosition( const MidiTime & ) ) ); m_positionLine = new positionLine( this ); @@ -419,7 +419,7 @@ void songEditor::setHighQuality( bool _hq ) void songEditor::scrolled( int _new_pos ) { update(); - emit positionChanged( m_currentPosition = midiTime( _new_pos, 0 ) ); + emit positionChanged( m_currentPosition = MidiTime( _new_pos, 0 ) ); } @@ -503,7 +503,7 @@ void songEditor::keyPressEvent( QKeyEvent * _ke ) } else if( _ke->key() == Qt::Key_Left ) { - tick_t t = m_s->currentTick() - midiTime::ticksPerTact(); + tick_t t = m_s->currentTick() - MidiTime::ticksPerTact(); if( t >= 0 ) { m_s->setPlayPos( t, song::Mode_PlaySong ); @@ -511,7 +511,7 @@ void songEditor::keyPressEvent( QKeyEvent * _ke ) } else if( _ke->key() == Qt::Key_Right ) { - tick_t t = m_s->currentTick() + midiTime::ticksPerTact(); + tick_t t = m_s->currentTick() + MidiTime::ticksPerTact(); if( t < MaxSongLength ) { m_s->setPlayPos( t, song::Mode_PlaySong ); @@ -706,7 +706,7 @@ static inline void animateScroll( QScrollBar *scrollBar, int newVal, bool smooth } -void songEditor::updatePosition( const midiTime & _t ) +void songEditor::updatePosition( const MidiTime & _t ) { int widgetWidth, trackOpWidth; if( configManager::inst()->value( "ui", "compacttrackbuttons" ).toInt() ) @@ -727,15 +727,15 @@ void songEditor::updatePosition( const midiTime & _t ) const int w = width() - widgetWidth - trackOpWidth - 32; // rough estimation for width of right scrollbar - if( _t > m_currentPosition + w * midiTime::ticksPerTact() / + if( _t > m_currentPosition + w * MidiTime::ticksPerTact() / pixelsPerTact() ) { animateScroll( m_leftRightScroll, _t.getTact(), m_smoothScroll ); } else if( _t < m_currentPosition ) { - midiTime t = qMax( - (int)( _t - w * midiTime::ticksPerTact() / + MidiTime t = qMax( + (int)( _t - w * MidiTime::ticksPerTact() / pixelsPerTact() ), 0 ); animateScroll( m_leftRightScroll, t.getTact(), m_smoothScroll ); diff --git a/src/tracks/AutomationTrack.cpp b/src/tracks/AutomationTrack.cpp index 5988ba3c5d..3353ae3eb2 100644 --- a/src/tracks/AutomationTrack.cpp +++ b/src/tracks/AutomationTrack.cpp @@ -50,7 +50,7 @@ AutomationTrack::~AutomationTrack() -bool AutomationTrack::play( const midiTime & _start, const fpp_t _frames, +bool AutomationTrack::play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _frame_base, int _tco_num ) { if( isMuted() ) @@ -77,7 +77,7 @@ bool AutomationTrack::play( const midiTime & _start, const fpp_t _frames, { continue; } - midiTime cur_start = _start; + MidiTime cur_start = _start; if( _tco_num < 0 ) { cur_start -= p->startPosition(); @@ -98,7 +98,7 @@ trackView * AutomationTrack::createView( TrackContainerView* tcv ) -trackContentObject * AutomationTrack::createTCO( const midiTime & ) +trackContentObject * AutomationTrack::createTCO( const MidiTime & ) { return new AutomationPattern( this ); } @@ -168,11 +168,11 @@ void AutomationTrackView::dropEvent( QDropEvent * _de ) journallingObject( val.toInt() ) ); if( mod != NULL ) { - midiTime pos = midiTime( trackContainerView()-> + MidiTime pos = MidiTime( trackContainerView()-> currentPosition() + ( _de->pos().x() - getTrackContentWidget()->x() ) * - midiTime::ticksPerTact() / + MidiTime::ticksPerTact() / static_cast( trackContainerView()->pixelsPerTact() ) ) .toNearestTact(); diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index a88f07fcbc..8aaab7b9b3 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -202,15 +202,15 @@ void InstrumentTrack::processAudioBuffer( sampleFrame * _buf, -midiEvent InstrumentTrack::applyMasterKey( const midiEvent & _me ) +MidiEvent InstrumentTrack::applyMasterKey( const MidiEvent& event ) { - midiEvent copy( _me ); - switch( _me.m_type ) + MidiEvent copy( event ); + switch( event.type() ) { case MidiNoteOn: case MidiNoteOff: case MidiKeyPressure: - copy.key() = masterKey( _me.key() ); + copy.setKey( masterKey( event.key() ) ); break; default: break; @@ -221,109 +221,92 @@ midiEvent InstrumentTrack::applyMasterKey( const midiEvent & _me ) -void InstrumentTrack::processInEvent( const midiEvent & _me, - const midiTime & _time ) +void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& time ) { engine::mixer()->lock(); - // in the special case this event comes from a MIDI port, the instrument - // is MIDI based (VST plugin, Sf2Player etc.) and the user did not set - // a dedicated MIDI output channel, directly pass the MIDI event to the - // instrument plugin - if( _me.isFromMidiPort() && m_instrument->isMidiBased()/* && - midiPort()->realOutputChannel() < 0 */ ) - { - m_instrument->handleMidiEvent( _me, _time ); - engine::mixer()->unlock(); - return; - } + bool eventHandled = false; - switch( _me.m_type ) + switch( event.type() ) { // we don't send MidiNoteOn, MidiNoteOff and MidiKeyPressure // events to instrument as notePlayHandle will send them on its // own - case MidiNoteOn: - if( _me.velocity() > 0 ) + case MidiNoteOn: + if( event.velocity() > 0 ) { - if( m_notes[_me.key()] == NULL ) + if( m_notes[event.key()] == NULL ) { - if( !configManager::inst()->value( "ui", - "manualchannelpiano" ).toInt() ) + if( !configManager::inst()->value( "ui", "manualchannelpiano" ).toInt() ) { - m_piano.setKeyState( - _me.key(), true ); + m_piano.setKeyState( event.key(), true ); } // create temporary note note n; - n.setKey( _me.key() ); - n.setVolume( _me.getVolume() ); + n.setKey( event.key() ); + n.setVolume( event.volume() ); // create (timed) note-play-handle - notePlayHandle * nph = new - notePlayHandle( this, - _time.frames( - engine::framesPerTick() ), - typeInfo::max() / 2, - n ); - if( engine::mixer()->addPlayHandle( - nph ) ) + notePlayHandle* nph = new notePlayHandle( this, time.frames( engine::framesPerTick() ), typeInfo::max() / 2, + n, NULL, false, event.channel() ); + if( engine::mixer()->addPlayHandle( nph ) ) { - m_notes[_me.key()] = nph; + m_notes[event.key()] = nph; } emit noteOn( n ); + + eventHandled = true; + } break; } case MidiNoteOff: { - notePlayHandle * n = m_notes[_me.key()]; - if( n != NULL ) + notePlayHandle* nph = m_notes[event.key()]; + if( nph != NULL ) { // create dummy-note which has the same length // as the played note for sending it later // to all slots connected to signal noteOff() // this is for example needed by piano-roll for // recording notes into a pattern - note done_note( - midiTime( static_cast( - n->totalFramesPlayed() / - engine::framesPerTick() ) ), - 0, - n->key(), - n->getVolume(), - n->getPanning() ); + note n( MidiTime( static_cast( nph->totalFramesPlayed() / engine::framesPerTick() ) ), + 0, nph->key(), nph->getVolume(), nph->getPanning() ); - n->noteOff(); - m_notes[_me.key()] = NULL; + emit noteOff( n ); - emit noteOff( done_note ); + // now do actual note off and remove internal reference to NotePlayHandle (which itself will + // be deleted later automatically) + nph->noteOff(); + m_notes[event.key()] = NULL; + + eventHandled = true; } break; } case MidiKeyPressure: - if( m_notes[_me.key()] != NULL ) + if( m_notes[event.key()] != NULL ) { - m_notes[_me.key()]->setVolume( _me.getVolume() ); + eventHandled = true; + // setVolume() calls processOutEvent() with MidiKeyPressure so the + // attached instrument will receive the event as well + m_notes[event.key()]->setVolume( event.volume() ); } break; case MidiPitchBend: - // updatePitch() is connected to - // m_pitchModel::dataChanged() which will send out + // updatePitch() is connected to m_pitchModel::dataChanged() which will send out // MidiPitchBend events - m_pitchModel.setValue( m_pitchModel.minValue() + - _me.m_data.m_param[0] * - m_pitchModel.range() / 16384 ); + m_pitchModel.setValue( m_pitchModel.minValue() + event.pitchBend() * m_pitchModel.range() / 16384 ); break; case MidiControlChange: - if( _me.controllerNumber() == MidiControllerSustain ) + if( event.controllerNumber() == MidiControllerSustain ) { - if( _me.controllerValue() > MidiMaxControllerValue/2 ) + if( event.controllerValue() > MidiMaxControllerValue/2 ) { m_sustainPedalPressed = true; } @@ -332,120 +315,99 @@ void InstrumentTrack::processInEvent( const midiEvent & _me, m_sustainPedalPressed = false; } } - if( _me.controllerNumber() == MidiControllerAllSoundOff || - _me.controllerNumber() == MidiControllerAllNotesOff || - _me.controllerNumber() == MidiControllerOmniOn || - _me.controllerNumber() == MidiControllerOmniOff || - _me.controllerNumber() == MidiControllerMonoOn || - _me.controllerNumber() == MidiControllerPolyOn ) + if( event.controllerNumber() == MidiControllerAllSoundOff || + event.controllerNumber() == MidiControllerAllNotesOff || + event.controllerNumber() == MidiControllerOmniOn || + event.controllerNumber() == MidiControllerOmniOff || + event.controllerNumber() == MidiControllerMonoOn || + event.controllerNumber() == MidiControllerPolyOn ) { silenceAllNotes(); } - m_instrument->handleMidiEvent( _me, _time ); break; - case MidiProgramChange: - m_instrument->handleMidiEvent( _me, _time ); - break; - case MidiMetaEvent: // handle special cases such as note panning - switch( _me.m_metaEvent ) + switch( event.metaEvent() ) { case MidiNotePanning: - if( m_notes[_me.key()] != NULL ) + if( m_notes[event.key()] != NULL ) { - m_notes[_me.key()]->setPanning( _me.getPanning() ); + eventHandled = true; + m_notes[event.key()]->setPanning( event.panning() ); } break; default: - printf( "instrument-track: unhandled " - "MIDI meta event: %i\n", - _me.m_metaEvent ); + qWarning( "InstrumentTrack: unhandled MIDI meta event: %i", event.metaEvent() ); break; } break; default: - if( !m_instrument->handleMidiEvent( _me, _time ) ) - { - printf( "instrument-track: unhandled " - "MIDI event %d\n", _me.m_type ); - } break; } + + if( eventHandled == false && instrument()->handleMidiEvent( event, time ) == false ) + { + qWarning( "InstrumentTrack: unhandled MIDI event %d", event.type() ); + } + engine::mixer()->unlock(); } -void InstrumentTrack::processOutEvent( const midiEvent & _me, - const midiTime & _time ) +void InstrumentTrack::processOutEvent( const MidiEvent& event, const MidiTime& time ) { int k; - switch( _me.m_type ) + switch( event.type() ) { case MidiNoteOn: - if( !configManager::inst()->value( "ui", - "manualchannelpiano" ).toInt() ) + if( !configManager::inst()->value( "ui", "manualchannelpiano" ).toInt() ) { - m_piano.setKeyState( _me.key(), true ); + m_piano.setKeyState( event.key(), true ); } - if( !configManager::inst()->value( "ui", - "disablechannelactivityindicators" ).toInt() ) + if( !configManager::inst()->value( "ui", "disablechannelactivityindicators" ).toInt() ) { - if( m_notes[_me.key()] == NULL ) + if( m_notes[event.key()] == NULL ) { emit newNote(); } } - k = masterKey( _me.key() ); + k = masterKey( event.key() ); if( k >= 0 && k < NumKeys ) { if( m_runningMidiNotes[k] > 0 ) { - m_instrument->handleMidiEvent( - midiEvent( MidiNoteOff, midiPort()->realOutputChannel(), k, 0 ), - _time ); + m_instrument->handleMidiEvent( MidiEvent( MidiNoteOff, midiPort()->realOutputChannel(), k, 0 ), time ); } ++m_runningMidiNotes[k]; - m_instrument->handleMidiEvent( - midiEvent( MidiNoteOn, midiPort()->realOutputChannel(), k, - _me.velocity() ), _time ); + m_instrument->handleMidiEvent( MidiEvent( MidiNoteOn, midiPort()->realOutputChannel(), k, event.velocity() ), time ); } break; case MidiNoteOff: - if( !configManager::inst()->value( "ui", - "manualchannelpiano" ).toInt() ) + if( !configManager::inst()->value( "ui", "manualchannelpiano" ).toInt() ) { - m_piano.setKeyState( _me.key(), false ); + m_piano.setKeyState( event.key(), false ); } - k = masterKey( _me.key() ); - if( k >= 0 && k < NumKeys && - --m_runningMidiNotes[k] <= 0 ) + k = masterKey( event.key() ); + if( k >= 0 && k < NumKeys && --m_runningMidiNotes[k] <= 0 ) { m_runningMidiNotes[k] = qMax( 0, m_runningMidiNotes[k] ); - m_instrument->handleMidiEvent( - midiEvent( MidiNoteOff, midiPort()->realOutputChannel(), k, 0 ), - _time ); + m_instrument->handleMidiEvent( MidiEvent( MidiNoteOff, midiPort()->realOutputChannel(), k, 0 ), time ); } break; default: - if( m_instrument != NULL ) - { - m_instrument->handleMidiEvent( - applyMasterKey( _me ), - _time ); - } + m_instrument->handleMidiEvent( applyMasterKey( event ), time ); break; } // if appropriate, midi-port does futher routing - m_midiPort.processOutEvent( _me, _time ); + m_midiPort.processOutEvent( event, time ); } @@ -525,7 +487,7 @@ void InstrumentTrack::deleteNotePluginData( notePlayHandle * _n ) // Notes deleted when keys still pressed if( m_notes[_n->key()] == _n ) { - note done_note( midiTime( static_cast( + note done_note( MidiTime( static_cast( _n->totalFramesPlayed() / engine::framesPerTick() ) ), 0, _n->key(), @@ -581,9 +543,7 @@ void InstrumentTrack::updateBaseNote() void InstrumentTrack::updatePitch() { updateBaseNote(); - processOutEvent( midiEvent( MidiPitchBend, - midiPort()->realOutputChannel(), - midiPitch() ), 0 ); + processOutEvent( MidiEvent( MidiPitchBend, midiPort()->realOutputChannel(), midiPitch() ), 0 ); } @@ -616,7 +576,7 @@ void InstrumentTrack::removeMidiPortNode( multimediaProject & _mmp ) -bool InstrumentTrack::play( const midiTime & _start, const fpp_t _frames, +bool InstrumentTrack::play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _offset, int _tco_num ) { const float frames_per_tick = engine::framesPerTick(); @@ -657,7 +617,7 @@ bool InstrumentTrack::play( const midiTime & _start, const fpp_t _frames, { continue; } - midiTime cur_start = _start; + MidiTime cur_start = _start; if( _tco_num < 0 ) { cur_start -= p->startPosition(); @@ -747,7 +707,7 @@ bool InstrumentTrack::play( const midiTime & _start, const fpp_t _frames, -trackContentObject * InstrumentTrack::createTCO( const midiTime & ) +trackContentObject * InstrumentTrack::createTCO( const MidiTime & ) { return new pattern( this ); } @@ -1182,8 +1142,8 @@ void InstrumentTrackView::toggleInstrumentWindow( bool _on ) void InstrumentTrackView::activityIndicatorPressed() { model()->processInEvent( - midiEvent( MidiNoteOn, 0, DefaultKey, MidiMaxVelocity ), - midiTime() ); + MidiEvent( MidiNoteOn, 0, DefaultKey, MidiMaxVelocity ), + MidiTime() ); } @@ -1191,8 +1151,8 @@ void InstrumentTrackView::activityIndicatorPressed() void InstrumentTrackView::activityIndicatorReleased() { - model()->processInEvent( midiEvent( MidiNoteOff, 0, DefaultKey, 0 ), - midiTime() ); + model()->processInEvent( MidiEvent( MidiNoteOff, 0, DefaultKey, 0 ), + MidiTime() ); } diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index 9b7e55eedd..25f6eee3b8 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -74,7 +74,7 @@ SampleTCO::~SampleTCO() -void SampleTCO::changeLength( const midiTime & _length ) +void SampleTCO::changeLength( const MidiTime & _length ) { trackContentObject::changeLength( qMax( static_cast( _length ), DefaultTicksPerTact ) ); } @@ -128,7 +128,7 @@ void SampleTCO::updateLength( bpm_t ) -midiTime SampleTCO::sampleLength() const +MidiTime SampleTCO::sampleLength() const { return (int)( m_sampleBuffer->frames() / engine::framesPerTick() ); } @@ -406,7 +406,7 @@ SampleTrack::~SampleTrack() -bool SampleTrack::play( const midiTime & _start, const fpp_t _frames, +bool SampleTrack::play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _offset, int /*_tco_num*/ ) { m_audioPort.effects()->startRunning(); @@ -461,7 +461,7 @@ trackView * SampleTrack::createView( TrackContainerView* tcv ) -trackContentObject * SampleTrack::createTCO( const midiTime & ) +trackContentObject * SampleTrack::createTCO( const MidiTime & ) { return new SampleTCO( this ); } diff --git a/src/tracks/bb_track.cpp b/src/tracks/bb_track.cpp index 67b2c2b59a..a2c041e576 100644 --- a/src/tracks/bb_track.cpp +++ b/src/tracks/bb_track.cpp @@ -55,7 +55,7 @@ bbTCO::bbTCO( track * _track, unsigned int _color ) : if( t > 0 ) { saveJournallingState( false ); - changeLength( midiTime( t, 0 ) ); + changeLength( MidiTime( t, 0 ) ); restoreJournallingState(); } } @@ -192,7 +192,7 @@ void bbTCOView::paintEvent( QPaintEvent * ) tact_t t = engine::getBBTrackContainer()->lengthOfBB( bbTrack::numOfBBTrack( m_bbTCO->getTrack() ) ); - if( m_bbTCO->length() > midiTime::ticksPerTact() && t > 0 ) + if( m_bbTCO->length() > MidiTime::ticksPerTact() && t > 0 ) { for( int x = static_cast( t * pixelsPerTact() ); x < width()-2; @@ -341,7 +341,7 @@ bbTrack::~bbTrack() // play _frames frames of given TCO within starting with _start -bool bbTrack::play( const midiTime & _start, const fpp_t _frames, +bool bbTrack::play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _offset, int _tco_num ) { if( isMuted() ) @@ -362,8 +362,8 @@ bool bbTrack::play( const midiTime & _start, const fpp_t _frames, return false; } - midiTime lastPosition; - midiTime lastLen; + MidiTime lastPosition; + MidiTime lastLen; for( tcoVector::iterator it = tcos.begin(); it != tcos.end(); ++it ) { if( !( *it )->isMuted() && @@ -392,7 +392,7 @@ trackView * bbTrack::createView( TrackContainerView* tcv ) -trackContentObject * bbTrack::createTCO( const midiTime & _pos ) +trackContentObject * bbTrack::createTCO( const MidiTime & _pos ) { // if we're creating a new bbTCO, we colorize it according to the // previous bbTCO, so we have to get all TCOs from 0 to _pos and diff --git a/src/tracks/pattern.cpp b/src/tracks/pattern.cpp index 611f18adca..95ab237aa4 100644 --- a/src/tracks/pattern.cpp +++ b/src/tracks/pattern.cpp @@ -63,7 +63,7 @@ pattern::pattern( InstrumentTrack * _instrument_track ) : trackContentObject( _instrument_track ), m_instrumentTrack( _instrument_track ), m_patternType( BeatPattern ), - m_steps( midiTime::stepsPerTact() ), + m_steps( MidiTime::stepsPerTact() ), m_frozenPattern( NULL ), m_freezing( false ), m_freezeAborted( false ) @@ -127,14 +127,14 @@ void pattern::init() -midiTime pattern::length() const +MidiTime pattern::length() const { if( m_patternType == BeatPattern ) { return beatPatternLength(); } - tick_t max_length = midiTime::ticksPerTact(); + tick_t max_length = MidiTime::ticksPerTact(); for( NoteVector::ConstIterator it = m_notes.begin(); it != m_notes.end(); ++it ) @@ -145,16 +145,16 @@ midiTime pattern::length() const ( *it )->endPos() ); } } - return midiTime( max_length ).nextFullTact() * - midiTime::ticksPerTact(); + return MidiTime( max_length ).nextFullTact() * + MidiTime::ticksPerTact(); } -midiTime pattern::beatPatternLength() const +MidiTime pattern::beatPatternLength() const { - tick_t max_length = midiTime::ticksPerTact(); + tick_t max_length = MidiTime::ticksPerTact(); for( NoteVector::ConstIterator it = m_notes.begin(); it != m_notes.end(); ++it ) @@ -163,18 +163,18 @@ midiTime pattern::beatPatternLength() const { max_length = qMax( max_length, ( *it )->pos() + - midiTime::ticksPerTact() / - midiTime::stepsPerTact() ); + MidiTime::ticksPerTact() / + MidiTime::stepsPerTact() ); } } - if( m_steps != midiTime::stepsPerTact() ) + if( m_steps != MidiTime::stepsPerTact() ) { - max_length = m_steps * midiTime::ticksPerTact() / - midiTime::stepsPerTact() ; + max_length = m_steps * MidiTime::ticksPerTact() / + MidiTime::stepsPerTact() ; } - return midiTime( max_length ).nextFullTact() * midiTime::ticksPerTact(); + return MidiTime( max_length ).nextFullTact() * MidiTime::ticksPerTact(); } @@ -385,7 +385,7 @@ void pattern::loadSettings( const QDomElement & _this ) { movePosition( _this.attribute( "pos" ).toInt() ); } - changeLength( midiTime( _this.attribute( "len" ).toInt() ) ); + changeLength( MidiTime( _this.attribute( "len" ).toInt() ) ); if( _this.attribute( "muted" ).toInt() != isMuted() ) { toggleMute(); @@ -409,7 +409,7 @@ void pattern::loadSettings( const QDomElement & _this ) m_steps = _this.attribute( "steps" ).toInt(); if( m_steps == 0 ) { - m_steps = midiTime::stepsPerTact(); + m_steps = MidiTime::stepsPerTact(); } ensureBeatNotes(); @@ -487,7 +487,7 @@ void pattern::abortFreeze() void pattern::addSteps() { - m_steps += midiTime::stepsPerTact(); + m_steps += MidiTime::stepsPerTact(); ensureBeatNotes(); emit dataChanged(); } @@ -497,7 +497,7 @@ void pattern::addSteps() void pattern::removeSteps() { - int _n = midiTime::stepsPerTact(); + int _n = MidiTime::stepsPerTact(); if( _n < m_steps ) { for( int i = m_steps - _n; i < m_steps; ++i ) @@ -506,8 +506,8 @@ void pattern::removeSteps() it != m_notes.end(); ++it ) { if( ( *it )->pos() == - i * midiTime::ticksPerTact() / - midiTime::stepsPerTact() && + i * MidiTime::ticksPerTact() / + MidiTime::stepsPerTact() && ( *it )->length() <= 0 ) { removeNote( *it ); @@ -542,8 +542,8 @@ void pattern::ensureBeatNotes() it != m_notes.end(); ++it ) { if( ( *it )->pos() == - i * midiTime::ticksPerTact() / - midiTime::stepsPerTact() && + i * MidiTime::ticksPerTact() / + MidiTime::stepsPerTact() && ( *it )->length() <= 0 ) { found = true; @@ -552,9 +552,9 @@ void pattern::ensureBeatNotes() } if( found == false ) { - addNote( note( midiTime( 0 ), midiTime( i * - midiTime::ticksPerTact() / - midiTime::stepsPerTact() ) ), false ); + addNote( note( MidiTime( 0 ), MidiTime( i * + MidiTime::ticksPerTact() / + MidiTime::stepsPerTact() ) ), false ); } } } @@ -591,17 +591,17 @@ bool pattern::empty() void pattern::changeTimeSignature() { - midiTime last_pos = midiTime::ticksPerTact(); + MidiTime last_pos = MidiTime::ticksPerTact(); for( NoteVector::ConstIterator cit = m_notes.begin(); cit != m_notes.end(); ++cit ) { if( ( *cit )->length() < 0 && ( *cit )->pos() > last_pos ) { - last_pos = ( *cit )->pos()+midiTime::ticksPerTact() / - midiTime::stepsPerTact(); + last_pos = ( *cit )->pos()+MidiTime::ticksPerTact() / + MidiTime::stepsPerTact(); } } - last_pos = last_pos.nextFullTact() * midiTime::ticksPerTact(); + last_pos = last_pos.nextFullTact() * MidiTime::ticksPerTact(); for( NoteVector::Iterator it = m_notes.begin(); it != m_notes.end(); ) { if( ( *it )->length() == 0 && ( *it )->pos() >= last_pos ) @@ -616,8 +616,8 @@ void pattern::changeTimeSignature() } } m_steps = qMax( - qMax( m_steps, midiTime::stepsPerTact() ), - last_pos.getTact() * midiTime::stepsPerTact() ); + qMax( m_steps, MidiTime::stepsPerTact() ), + last_pos.getTact() * MidiTime::stepsPerTact() ); ensureBeatNotes(); } @@ -970,7 +970,7 @@ void patternView::mouseDoubleClickEvent( QMouseEvent * _me ) if( m_pat->type() == pattern::MelodyPattern || !( m_pat->type() == pattern::BeatPattern && ( pixelsPerTact() >= 192 || - m_pat->m_steps != midiTime::stepsPerTact() ) && + m_pat->m_steps != MidiTime::stepsPerTact() ) && _me->y() > height() - s_stepBtnOff->height() ) ) { openInPianoRoll(); @@ -985,7 +985,7 @@ void patternView::mousePressEvent( QMouseEvent * _me ) if( _me->button() == Qt::LeftButton && m_pat->m_patternType == pattern::BeatPattern && ( fixedTCOs() || pixelsPerTact() >= 96 || - m_pat->m_steps != midiTime::stepsPerTact() ) && + m_pat->m_steps != MidiTime::stepsPerTact() ) && _me->y() > height() - s_stepBtnOff->height() ) { int step = ( _me->x() - TCO_BORDER_WIDTH ) * @@ -1033,7 +1033,7 @@ void patternView::wheelEvent( QWheelEvent * _we ) { if( m_pat->m_patternType == pattern::BeatPattern && ( fixedTCOs() || pixelsPerTact() >= 96 || - m_pat->m_steps != midiTime::stepsPerTact() ) && + m_pat->m_steps != MidiTime::stepsPerTact() ) && _we->y() > height() - s_stepBtnOff->height() ) { int step = ( _we->x() - TCO_BORDER_WIDTH ) * @@ -1192,9 +1192,9 @@ void patternView::paintEvent( QPaintEvent * ) { const int x1 = 2 * x_base + static_cast( ( *it )->pos() * ppt / - midiTime::ticksPerTact() ); + MidiTime::ticksPerTact() ); const int x2 = - static_cast( ( ( *it )->pos() + ( *it )->length() ) * ppt / midiTime::ticksPerTact() ); + static_cast( ( ( *it )->pos() + ( *it )->length() ) * ppt / MidiTime::ticksPerTact() ); p.drawLine( x1, y_base + y_pos, x2, y_base + y_pos ); @@ -1205,7 +1205,7 @@ void patternView::paintEvent( QPaintEvent * ) } else if( m_pat->m_patternType == pattern::BeatPattern && ( fixedTCOs() || ppt >= 96 - || m_pat->m_steps != midiTime::stepsPerTact() ) ) + || m_pat->m_steps != MidiTime::stepsPerTact() ) ) { QPixmap stepon; QPixmap stepoverlay; From 7d395c00fa2727c62d4a1d176d0fa94f1e354906 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 00:14:16 +0100 Subject: [PATCH 18/80] InstrumentTrack: removed option for disabling PianoView visual feedback Probably never used by anyone and just makes code unneccessarily complex. --- include/setup_dialog.h | 4 +--- src/gui/setup_dialog.cpp | 29 ++++------------------------- src/tracks/InstrumentTrack.cpp | 16 ++++------------ 3 files changed, 9 insertions(+), 40 deletions(-) diff --git a/include/setup_dialog.h b/include/setup_dialog.h index f5bd006762..866cea7d95 100644 --- a/include/setup_dialog.h +++ b/include/setup_dialog.h @@ -1,7 +1,7 @@ /* * setup_dialog.h - dialog for setting up LMMS * - * Copyright (c) 2005-2011 Tobias Doerffel + * Copyright (c) 2005-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -103,7 +103,6 @@ private slots: void openBackgroundArtwork(); void toggleDisableChActInd( bool _disabled ); - void toggleManualChPiano( bool _enabled ); void toggleSmoothScroll( bool _enabled ); void toggleAutoSave( bool _enabled ); void toggleOneInstrumentTrackWindow( bool _enabled ); @@ -155,7 +154,6 @@ private: QString m_backgroundArtwork; bool m_disableChActInd; - bool m_manualChPiano; bool m_smoothScroll; bool m_enableAutoSave; bool m_oneInstrumentTrackWindow; diff --git a/src/gui/setup_dialog.cpp b/src/gui/setup_dialog.cpp index 0b0526aee5..5703d739c1 100644 --- a/src/gui/setup_dialog.cpp +++ b/src/gui/setup_dialog.cpp @@ -1,7 +1,7 @@ /* * setup_dialog.cpp - dialog for setting up LMMS * - * Copyright (c) 2005-2013 Tobias Doerffel + * Copyright (c) 2005-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -110,8 +110,6 @@ setupDialog::setupDialog( ConfigTabs _tab_to_open ) : m_backgroundArtwork( configManager::inst()->backgroundArtwork() ), m_disableChActInd( configManager::inst()->value( "ui", "disablechannelactivityindicators" ).toInt() ), - m_manualChPiano( configManager::inst()->value( "ui", - "manualchannelpiano" ).toInt() ), m_smoothScroll( configManager::inst()->value( "ui", "smoothscroll" ).toInt() ), m_enableAutoSave( configManager::inst()->value( "ui", "enableautosave" ).toInt() ), m_oneInstrumentTrackWindow( configManager::inst()->value( "ui", @@ -524,17 +522,9 @@ setupDialog::setupDialog( ConfigTabs _tab_to_open ) : this, SLOT( toggleDisableChActInd( bool ) ) ); - ledCheckBox * manual_ch_piano = new ledCheckBox( - tr( "Only press keys on channel-piano manually" ), - ui_fx_tw ); - manual_ch_piano->move( 10, 40 ); - manual_ch_piano->setChecked( m_manualChPiano ); - connect( manual_ch_piano, SIGNAL( toggled( bool ) ), - this, SLOT( toggleManualChPiano( bool ) ) ); - ledCheckBox * smoothScroll = new ledCheckBox( tr( "Smooth scroll in Song Editor" ), ui_fx_tw ); - smoothScroll->move( 10, 60 ); + smoothScroll->move( 10, 40 ); smoothScroll->setChecked( m_smoothScroll ); connect( smoothScroll, SIGNAL( toggled( bool ) ), this, SLOT( toggleSmoothScroll( bool ) ) ); @@ -542,7 +532,7 @@ setupDialog::setupDialog( ConfigTabs _tab_to_open ) : ledCheckBox * autoSave = new ledCheckBox( tr( "Enable auto save feature" ), ui_fx_tw ); - autoSave->move( 10, 80 ); + autoSave->move( 10, 60 ); autoSave->setChecked( m_enableAutoSave ); connect( autoSave, SIGNAL( toggled( bool ) ), this, SLOT( toggleAutoSave( bool ) ) ); @@ -551,7 +541,7 @@ setupDialog::setupDialog( ConfigTabs _tab_to_open ) : ledCheckBox * animAFP = new ledCheckBox( tr( "Show playback cursor in AudioFileProcessor" ), ui_fx_tw ); - animAFP->move( 10, 100 ); + animAFP->move( 10, 80 ); animAFP->setChecked( m_animateAFP ); connect( animAFP, SIGNAL( toggled( bool ) ), this, SLOT( toggleAnimateAFP( bool ) ) ); @@ -821,8 +811,6 @@ void setupDialog::accept() configManager::inst()->setValue( "ui", "disablechannelactivityindicators", QString::number( m_disableChActInd ) ); - configManager::inst()->setValue( "ui", "manualchannelpiano", - QString::number( m_manualChPiano ) ); configManager::inst()->setValue( "ui", "smoothscroll", QString::number( m_smoothScroll ) ); configManager::inst()->setValue( "ui", "enableautosave", @@ -987,15 +975,6 @@ void setupDialog::toggleDisableChActInd( bool _disabled ) -void setupDialog::toggleManualChPiano( bool _enabled ) -{ - m_manualChPiano = _enabled; -} - - - - - void setupDialog::toggleSmoothScroll( bool _enabled ) { m_smoothScroll = _enabled; diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index 8aaab7b9b3..fd16fc90d0 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -237,10 +237,8 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti { if( m_notes[event.key()] == NULL ) { - if( !configManager::inst()->value( "ui", "manualchannelpiano" ).toInt() ) - { - m_piano.setKeyState( event.key(), true ); - } + m_piano.setKeyState( event.key(), true ); + // create temporary note note n; n.setKey( event.key() ); @@ -365,10 +363,7 @@ void InstrumentTrack::processOutEvent( const MidiEvent& event, const MidiTime& t switch( event.type() ) { case MidiNoteOn: - if( !configManager::inst()->value( "ui", "manualchannelpiano" ).toInt() ) - { - m_piano.setKeyState( event.key(), true ); - } + m_piano.setKeyState( event.key(), true ); if( !configManager::inst()->value( "ui", "disablechannelactivityindicators" ).toInt() ) { if( m_notes[event.key()] == NULL ) @@ -389,10 +384,7 @@ void InstrumentTrack::processOutEvent( const MidiEvent& event, const MidiTime& t break; case MidiNoteOff: - if( !configManager::inst()->value( "ui", "manualchannelpiano" ).toInt() ) - { - m_piano.setKeyState( event.key(), false ); - } + m_piano.setKeyState( event.key(), false ); k = masterKey( event.key() ); if( k >= 0 && k < NumKeys && --m_runningMidiNotes[k] <= 0 ) { From 1fddc81c0426011c4797648d91a8b5dfbbe9eb9e Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 00:25:32 +0100 Subject: [PATCH 19/80] InstrumentTrack: removed option for disabling activity indicators Probably never used by anyone and just makes code unneccessarily complex. --- include/setup_dialog.h | 2 -- src/gui/setup_dialog.cpp | 30 ++++-------------------------- src/tracks/InstrumentTrack.cpp | 9 ++------- 3 files changed, 6 insertions(+), 35 deletions(-) diff --git a/include/setup_dialog.h b/include/setup_dialog.h index 866cea7d95..53c2be08f0 100644 --- a/include/setup_dialog.h +++ b/include/setup_dialog.h @@ -102,7 +102,6 @@ private slots: void openDefaultSoundfont(); void openBackgroundArtwork(); - void toggleDisableChActInd( bool _disabled ); void toggleSmoothScroll( bool _enabled ); void toggleAutoSave( bool _enabled ); void toggleOneInstrumentTrackWindow( bool _enabled ); @@ -153,7 +152,6 @@ private: #endif QString m_backgroundArtwork; - bool m_disableChActInd; bool m_smoothScroll; bool m_enableAutoSave; bool m_oneInstrumentTrackWindow; diff --git a/src/gui/setup_dialog.cpp b/src/gui/setup_dialog.cpp index 5703d739c1..d863833b67 100644 --- a/src/gui/setup_dialog.cpp +++ b/src/gui/setup_dialog.cpp @@ -108,8 +108,6 @@ setupDialog::setupDialog( ConfigTabs _tab_to_open ) : m_stkDir( configManager::inst()->stkDir() ), #endif m_backgroundArtwork( configManager::inst()->backgroundArtwork() ), - m_disableChActInd( configManager::inst()->value( "ui", - "disablechannelactivityindicators" ).toInt() ), m_smoothScroll( configManager::inst()->value( "ui", "smoothscroll" ).toInt() ), m_enableAutoSave( configManager::inst()->value( "ui", "enableautosave" ).toInt() ), m_oneInstrumentTrackWindow( configManager::inst()->value( "ui", @@ -511,20 +509,11 @@ setupDialog::setupDialog( ConfigTabs _tab_to_open ) : tabWidget * ui_fx_tw = new tabWidget( tr( "UI effects vs. " "performance" ).toUpper(), performance ); - ui_fx_tw->setFixedHeight( 120 ); - - ledCheckBox * disable_ch_act_ind = new ledCheckBox( - tr( "Disable channel activity indicators" ), - ui_fx_tw ); - disable_ch_act_ind->move( 10, 20 ); - disable_ch_act_ind->setChecked( m_disableChActInd ); - connect( disable_ch_act_ind, SIGNAL( toggled( bool ) ), - this, SLOT( toggleDisableChActInd( bool ) ) ); - + ui_fx_tw->setFixedHeight( 80 ); ledCheckBox * smoothScroll = new ledCheckBox( tr( "Smooth scroll in Song Editor" ), ui_fx_tw ); - smoothScroll->move( 10, 40 ); + smoothScroll->move( 10, 20 ); smoothScroll->setChecked( m_smoothScroll ); connect( smoothScroll, SIGNAL( toggled( bool ) ), this, SLOT( toggleSmoothScroll( bool ) ) ); @@ -532,7 +521,7 @@ setupDialog::setupDialog( ConfigTabs _tab_to_open ) : ledCheckBox * autoSave = new ledCheckBox( tr( "Enable auto save feature" ), ui_fx_tw ); - autoSave->move( 10, 60 ); + autoSave->move( 10, 40 ); autoSave->setChecked( m_enableAutoSave ); connect( autoSave, SIGNAL( toggled( bool ) ), this, SLOT( toggleAutoSave( bool ) ) ); @@ -541,7 +530,7 @@ setupDialog::setupDialog( ConfigTabs _tab_to_open ) : ledCheckBox * animAFP = new ledCheckBox( tr( "Show playback cursor in AudioFileProcessor" ), ui_fx_tw ); - animAFP->move( 10, 80 ); + animAFP->move( 10, 60 ); animAFP->setChecked( m_animateAFP ); connect( animAFP, SIGNAL( toggled( bool ) ), this, SLOT( toggleAnimateAFP( bool ) ) ); @@ -808,9 +797,6 @@ void setupDialog::accept() QString::number( !m_MMPZ ) ); configManager::inst()->setValue( "mixer", "hqaudio", QString::number( m_hqAudioDev ) ); - configManager::inst()->setValue( "ui", - "disablechannelactivityindicators", - QString::number( m_disableChActInd ) ); configManager::inst()->setValue( "ui", "smoothscroll", QString::number( m_smoothScroll ) ); configManager::inst()->setValue( "ui", "enableautosave", @@ -967,14 +953,6 @@ void setupDialog::toggleHQAudioDev( bool _enabled ) -void setupDialog::toggleDisableChActInd( bool _disabled ) -{ - m_disableChActInd = _disabled; -} - - - - void setupDialog::toggleSmoothScroll( bool _enabled ) { m_smoothScroll = _enabled; diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index fd16fc90d0..0b55bf53f5 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -364,13 +364,6 @@ void InstrumentTrack::processOutEvent( const MidiEvent& event, const MidiTime& t { case MidiNoteOn: m_piano.setKeyState( event.key(), true ); - if( !configManager::inst()->value( "ui", "disablechannelactivityindicators" ).toInt() ) - { - if( m_notes[event.key()] == NULL ) - { - emit newNote(); - } - } k = masterKey( event.key() ); if( k >= 0 && k < NumKeys ) { @@ -380,6 +373,8 @@ void InstrumentTrack::processOutEvent( const MidiEvent& event, const MidiTime& t } ++m_runningMidiNotes[k]; m_instrument->handleMidiEvent( MidiEvent( MidiNoteOn, midiPort()->realOutputChannel(), k, event.velocity() ), time ); + + emit newNote(); } break; From b6e4860fdba3a2085d6ece54ca02abe6e6a2b2d2 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 00:33:51 +0100 Subject: [PATCH 20/80] InstrumentTrack: do not set state of piano in processInEvent() As processInEvent() is responsible for starting/stopping notes, we do not have to set the state of the piano. This is done in processOutEvents() already. --- src/tracks/InstrumentTrack.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index 0b55bf53f5..75aff57799 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -237,8 +237,6 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti { if( m_notes[event.key()] == NULL ) { - m_piano.setKeyState( event.key(), true ); - // create temporary note note n; n.setKey( event.key() ); From d2aab11130c6a4c088f670b301f9a51effbc78d0 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 00:35:36 +0100 Subject: [PATCH 21/80] InstrumentTrack: work with transposed MIDI event and key in processOutEvent() In processOutEvent() initialize and use a MidiEvent object with transposed key as well as the key variable. --- src/tracks/InstrumentTrack.cpp | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index 75aff57799..eef1367c20 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -356,38 +356,39 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti void InstrumentTrack::processOutEvent( const MidiEvent& event, const MidiTime& time ) { - int k; + const MidiEvent transposedEvent = applyMasterKey( event ); + const int key = transposedEvent.key(); switch( event.type() ) { case MidiNoteOn: - m_piano.setKeyState( event.key(), true ); - k = masterKey( event.key() ); - if( k >= 0 && k < NumKeys ) + m_piano.setKeyState( event.key(), true ); // event.key() = original key + + if( key >= 0 && key < NumKeys ) { - if( m_runningMidiNotes[k] > 0 ) + if( m_runningMidiNotes[key] > 0 ) { - m_instrument->handleMidiEvent( MidiEvent( MidiNoteOff, midiPort()->realOutputChannel(), k, 0 ), time ); + m_instrument->handleMidiEvent( MidiEvent( MidiNoteOff, midiPort()->realOutputChannel(), key, 0 ), time ); } - ++m_runningMidiNotes[k]; - m_instrument->handleMidiEvent( MidiEvent( MidiNoteOn, midiPort()->realOutputChannel(), k, event.velocity() ), time ); + ++m_runningMidiNotes[key]; + m_instrument->handleMidiEvent( MidiEvent( MidiNoteOn, midiPort()->realOutputChannel(), key, event.velocity() ), time ); emit newNote(); } break; case MidiNoteOff: - m_piano.setKeyState( event.key(), false ); - k = masterKey( event.key() ); - if( k >= 0 && k < NumKeys && --m_runningMidiNotes[k] <= 0 ) + m_piano.setKeyState( event.key(), false ); // event.key() = original key + + if( key >= 0 && key < NumKeys && --m_runningMidiNotes[key] <= 0 ) { - m_runningMidiNotes[k] = qMax( 0, m_runningMidiNotes[k] ); - m_instrument->handleMidiEvent( MidiEvent( MidiNoteOff, midiPort()->realOutputChannel(), k, 0 ), time ); + m_runningMidiNotes[key] = qMax( 0, m_runningMidiNotes[key] ); + m_instrument->handleMidiEvent( MidiEvent( MidiNoteOff, midiPort()->realOutputChannel(), key, 0 ), time ); } break; default: - m_instrument->handleMidiEvent( applyMasterKey( event ), time ); + m_instrument->handleMidiEvent( transposedEvent, time ); break; } From 5808c8b7865cbead5a26a3ff61421a39759396a3 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 00:58:37 +0100 Subject: [PATCH 22/80] NotePlayHandle: fixed minor auto replace typo --- include/note_play_handle.h | 2 +- src/core/note_play_handle.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/note_play_handle.h b/include/note_play_handle.h index e1374276a2..859498b698 100644 --- a/include/note_play_handle.h +++ b/include/note_play_handle.h @@ -53,7 +53,7 @@ public: const f_cnt_t _frames, const note & _n, notePlayHandle * _parent = NULL, const bool _part_of_arp = false, - int midiChannel = -1 ); + int midiEventChannel = -1 ); virtual ~notePlayHandle(); virtual void setVolume( const volume_t volume = DefaultVolume ); diff --git a/src/core/note_play_handle.cpp b/src/core/note_play_handle.cpp index c8845b6f6c..c22d2c645c 100644 --- a/src/core/note_play_handle.cpp +++ b/src/core/note_play_handle.cpp @@ -50,7 +50,7 @@ notePlayHandle::notePlayHandle( InstrumentTrack * _it, const note & _n, notePlayHandle *parent, const bool _part_of_arp, - int MidiEventChannel ) : + int midiEventChannel ) : playHandle( NotePlayHandle, _offset ), note( _n.length(), _n.pos(), _n.key(), _n.getVolume(), _n.getPanning(), _n.detuning() ), @@ -76,7 +76,7 @@ notePlayHandle::notePlayHandle( InstrumentTrack * _it, m_unpitchedFrequency( 0 ), m_baseDetuning( NULL ), m_songGlobalParentOffset( 0 ), - m_midiChannel( MidiEventChannel >= 0 ? MidiEventChannel : instrumentTrack()->midiPort()->realOutputChannel() ) + m_midiChannel( midiEventChannel >= 0 ? midiEventChannel : instrumentTrack()->midiPort()->realOutputChannel() ) { if( isTopNote() ) { From c144a2baa2851d92922a74092489cc47d4aecfb8 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 01:10:18 +0100 Subject: [PATCH 23/80] Instrument: return true in default implementation of handleMidiEvent() Supress warnings about unhandled MIDI events e.g. on PianoView focus out by returning true in Instrument::handleMidiEvent(). --- include/Instrument.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/Instrument.h b/include/Instrument.h index f0ff145c22..0a840daa3a 100644 --- a/include/Instrument.h +++ b/include/Instrument.h @@ -101,7 +101,7 @@ public: // MIDI-events inline virtual bool handleMidiEvent( const MidiEvent&, const MidiTime& = MidiTime() ) { - return false; + return true; } virtual QString fullDisplayName() const; From 049951438a6104400f5328ebd3f64b9f3e8e322b Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 01:15:43 +0100 Subject: [PATCH 24/80] Do not pass default time to processInEvent() We introduced default parameters for MidiTime parameters so there's no need to construct them manually. --- src/core/midi/MidiWinMM.cpp | 17 +++++------------ src/gui/PianoView.cpp | 12 ++++++------ src/gui/piano_roll.cpp | 5 ++--- src/tracks/InstrumentTrack.cpp | 13 ++++--------- 4 files changed, 17 insertions(+), 30 deletions(-) diff --git a/src/core/midi/MidiWinMM.cpp b/src/core/midi/MidiWinMM.cpp index 7920bc3e32..3c0eba0c46 100644 --- a/src/core/midi/MidiWinMM.cpp +++ b/src/core/midi/MidiWinMM.cpp @@ -1,7 +1,7 @@ /* * MidiWinMM.cpp - WinMM MIDI client * - * Copyright (c) 2008-2009 Tobias Doerffel + * Copyright (c) 2008-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -231,28 +231,21 @@ void MidiWinMM::handleInputEvent( HMIDIIN _hm, DWORD _ev ) case MidiNoteOn: case MidiNoteOff: case MidiKeyPressure: - ( *it )->processInEvent( - MidiEvent( cmdtype, chan, par1 - KeysPerOctave, - par2 & 0xff, &_hm ), MidiTime() ); + ( *it )->processInEvent( MidiEvent( cmdtype, chan, par1 - KeysPerOctave, par2 & 0xff, &_hm ) ); break; case MidiControlChange: case MidiProgramChange: case MidiChannelPressure: - ( *it )->processInEvent( - MidiEvent( cmdtype, chan, par1, par2 & 0xff, &_hm ), - MidiTime() ); + ( *it )->processInEvent( MidiEvent( cmdtype, chan, par1, par2 & 0xff, &_hm ) ); break; case MidiPitchBend: - ( *it )->processInEvent( - MidiEvent( cmdtype, chan, par1 + par2*128, 0, &_hm ), - MidiTime() ); + ( *it )->processInEvent( MidiEvent( cmdtype, chan, par1 + par2*128, 0, &_hm ) ); break; default: - qWarning( "WinMM-MIDI: unhandled input " - "event %d\n", cmdtype ); + qWarning( "WinMM-MIDI: unhandled input event %d\n", cmdtype ); break; } } diff --git a/src/gui/PianoView.cpp b/src/gui/PianoView.cpp index 771793247d..021964b501 100644 --- a/src/gui/PianoView.cpp +++ b/src/gui/PianoView.cpp @@ -465,7 +465,7 @@ void PianoView::mousePressEvent( QMouseEvent * _me ) velocity = MidiMaxVelocity; } // set note on - m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOn, 0, key_num, velocity ), MidiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOn, 0, key_num, velocity ) ); m_piano->setKeyState( key_num, true ); m_lastKey = key_num; @@ -510,7 +510,7 @@ void PianoView::mouseReleaseEvent( QMouseEvent * ) { if( m_piano != NULL ) { - m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOff, 0, m_lastKey, 0 ), MidiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOff, 0, m_lastKey, 0 ) ); m_piano->setKeyState( m_lastKey, false ); } @@ -571,7 +571,7 @@ void PianoView::mouseMoveEvent( QMouseEvent * _me ) { if( m_lastKey != -1 ) { - m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOff, 0, m_lastKey, 0 ), MidiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOff, 0, m_lastKey, 0 ) ); m_piano->setKeyState( m_lastKey, false ); m_lastKey = -1; } @@ -579,7 +579,7 @@ void PianoView::mouseMoveEvent( QMouseEvent * _me ) { if( _me->pos().y() > PIANO_BASE ) { - m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOn, 0, key_num, velocity ), MidiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOn, 0, key_num, velocity ) ); m_piano->setKeyState( key_num, true ); m_lastKey = key_num; } @@ -593,7 +593,7 @@ void PianoView::mouseMoveEvent( QMouseEvent * _me ) } else if( m_piano->isKeyPressed( key_num ) ) { - m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiKeyPressure, 0, key_num, velocity ), MidiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiKeyPressure, 0, key_num, velocity ) ); } } @@ -690,7 +690,7 @@ void PianoView::focusOutEvent( QFocusEvent * ) // hang otherwise for( int i = 0; i < NumKeys; ++i ) { - m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOff, 0, i, 0 ), MidiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOff, 0, i, 0 ) ); m_piano->setKeyState( i, false ); } update(); diff --git a/src/gui/piano_roll.cpp b/src/gui/piano_roll.cpp index bf27071fcd..6eace8b463 100644 --- a/src/gui/piano_roll.cpp +++ b/src/gui/piano_roll.cpp @@ -2229,15 +2229,14 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) if( m_noteEditMode == NoteEditVolume ) { n->setVolume( vol ); - m_pattern->instrumentTrack()->processInEvent( - MidiEvent( MidiKeyPressure, 0, n->key(), volumeToMidi( vol ) ), MidiTime() ); + m_pattern->instrumentTrack()->processInEvent( MidiEvent( MidiKeyPressure, 0, n->key(), volumeToMidi( vol ) ) ); } else if( m_noteEditMode == NoteEditPanning ) { n->setPanning( pan ); MidiEvent evt( MidiMetaEvent, 0, n->key(), panningToMidi( pan ) ); evt.setMetaEvent( MidiNotePanning ); - m_pattern->instrumentTrack()->processInEvent( evt, MidiTime() ); + m_pattern->instrumentTrack()->processInEvent( evt ); } } else diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index eef1367c20..aee0c87107 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -1127,9 +1127,7 @@ void InstrumentTrackView::toggleInstrumentWindow( bool _on ) void InstrumentTrackView::activityIndicatorPressed() { - model()->processInEvent( - MidiEvent( MidiNoteOn, 0, DefaultKey, MidiMaxVelocity ), - MidiTime() ); + model()->processInEvent( MidiEvent( MidiNoteOn, 0, DefaultKey, MidiMaxVelocity ) ); } @@ -1137,8 +1135,7 @@ void InstrumentTrackView::activityIndicatorPressed() void InstrumentTrackView::activityIndicatorReleased() { - model()->processInEvent( MidiEvent( MidiNoteOff, 0, DefaultKey, 0 ), - MidiTime() ); + model()->processInEvent( MidiEvent( MidiNoteOff, 0, DefaultKey, 0 ) ); } @@ -1149,8 +1146,7 @@ void InstrumentTrackView::midiInSelected() { if( model() ) { - model()->m_midiPort.setReadable( - m_midiInputAction->isChecked() ); + model()->m_midiPort.setReadable( m_midiInputAction->isChecked() ); } } @@ -1161,8 +1157,7 @@ void InstrumentTrackView::midiOutSelected() { if( model() ) { - model()->m_midiPort.setWritable( - m_midiOutputAction->isChecked() ); + model()->m_midiPort.setWritable( m_midiOutputAction->isChecked() ); } } From 519a29e608da683b0fc77d1317a4fb2f561a47f7 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 01:18:19 +0100 Subject: [PATCH 25/80] SampleBuffer: define OV_EXCLUDE_STATIC_CALLBACKS Define OV_EXCLUDE_STATIC_CALLBACKS in order to suppress compiler warnings about unused static instances when building Win32 version. --- src/core/SampleBuffer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/SampleBuffer.cpp b/src/core/SampleBuffer.cpp index 5b21b220c1..674a0a1012 100644 --- a/src/core/SampleBuffer.cpp +++ b/src/core/SampleBuffer.cpp @@ -38,6 +38,7 @@ #include +#define OV_EXCLUDE_STATIC_CALLBACKS #ifdef LMMS_HAVE_OGGVORBIS #include #endif From 94f991848e6a3788679018fef64c1f9589a62bd8 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 01:47:29 +0100 Subject: [PATCH 26/80] RemoteVstPlugin: adapted MIDI changes Fixes build failure after recent API changes. Closes #157. --- plugins/vst_base/RemoteVstPlugin.cpp | 48 ++++++++++++++-------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/plugins/vst_base/RemoteVstPlugin.cpp b/plugins/vst_base/RemoteVstPlugin.cpp index 9100de316a..cead22b70f 100644 --- a/plugins/vst_base/RemoteVstPlugin.cpp +++ b/plugins/vst_base/RemoteVstPlugin.cpp @@ -89,7 +89,7 @@ struct ERect #include "lmms_basics.h" -#include "midi.h" +#include "Midi.h" #include "communication.h" #include "VST_sync_shm.h" @@ -132,8 +132,7 @@ public: virtual void process( const sampleFrame * _in, sampleFrame * _out ); - virtual void processMidiEvent( const midiEvent & _event, - const f_cnt_t _offset ); + virtual void processMidiEvent( const MidiEvent& event, const f_cnt_t offset ); // set given sample-rate for plugin virtual void updateSampleRate() @@ -831,36 +830,37 @@ void RemoteVstPlugin::process( const sampleFrame * _in, sampleFrame * _out ) -void RemoteVstPlugin::processMidiEvent( const midiEvent & _event, - const f_cnt_t _offset ) +void RemoteVstPlugin::processMidiEvent( const MidiEvent& event, const f_cnt_t offset ) { - VstMidiEvent event; + VstMidiEvent vme; - event.type = kVstMidiType; - event.byteSize = 24; - event.deltaFrames = _offset; - event.flags = 0; - event.detune = 0; - event.noteLength = 0; - event.noteOffset = 0; - event.noteOffVelocity = 0; - event.reserved1 = 0; - event.reserved2 = 0; - event.midiData[0] = _event.m_type + _event.m_channel; - switch( _event.m_type ) + vme.type = kVstMidiType; + vme.byteSize = 24; + vme.deltaFrames = offset; + vme.flags = 0; + vme.detune = 0; + vme.noteLength = 0; + vme.noteOffset = 0; + vme.noteOffVelocity = 0; + vme.reserved1 = 0; + vme.reserved2 = 0; + vme.midiData[0] = event.type() + event.channel(); + + switch( event.type() ) { case MidiPitchBend: - event.midiData[1] = _event.m_data.m_param[0] & 0x7f; - event.midiData[2] = _event.m_data.m_param[0] >> 7; + vme.midiData[1] = event.param( 0 ) & 0x7f; + vme.midiData[2] = event.param( 1 ) >> 7; break; // TODO: handle more special cases default: - event.midiData[1] = _event.key(); - event.midiData[2] = _event.velocity(); + vme.midiData[1] = event.key(); + vme.midiData[2] = event.velocity(); break; } - event.midiData[3] = 0; - m_midiEvents.push_back( event ); + vme.midiData[3] = 0; + + m_midiEvents.push_back( vme ); } From 0063b891a88be55ff050497b8149522de52ff3db Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 01:48:15 +0100 Subject: [PATCH 27/80] FileDialog: add EXPORT macro The FileDialog class is used by plugins and therefore needs to be exported for platforms like Win32. --- include/FileDialog.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/include/FileDialog.h b/include/FileDialog.h index ddc2315464..f4d81ea3de 100644 --- a/include/FileDialog.h +++ b/include/FileDialog.h @@ -28,7 +28,9 @@ #include -class FileDialog : public QFileDialog +#include "export.h" + +class EXPORT FileDialog : public QFileDialog { Q_OBJECT public: From 417a1566a070e32bab97654f43498c92ad24f472 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 01:48:53 +0100 Subject: [PATCH 28/80] LADSPA/SWH: fixed compiler warnings resulting in Win32 build failure --- plugins/ladspa_effect/swh/CMakeLists.txt | 20 +++++++++++++------- plugins/ladspa_effect/swh/util/blo.c | 2 ++ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/plugins/ladspa_effect/swh/CMakeLists.txt b/plugins/ladspa_effect/swh/CMakeLists.txt index 85621c5dc3..5a3e3d0e4b 100644 --- a/plugins/ladspa_effect/swh/CMakeLists.txt +++ b/plugins/ladspa_effect/swh/CMakeLists.txt @@ -29,8 +29,14 @@ FOREACH(_item ${PLUGIN_SOURCES}) ENDFOREACH(_item ${PLUGIN_SOURCES}) +IF(LMMS_BUILD_WIN32) + SET(PIC_FLAGS "") +ELSE(LMMS_BUILD_WIN32) + SET(PIC_FLAGS "-fPIC") +ENDIF(LMMS_BUILD_WIN32) + ADD_LIBRARY(iir STATIC util/iir.c) -SET_TARGET_PROPERTIES(iir PROPERTIES COMPILE_FLAGS "-fPIC") +SET_TARGET_PROPERTIES(iir PROPERTIES COMPILE_FLAGS "${PIC_FLAGS}") TARGET_LINK_LIBRARIES(bandpass_a_iir_1893 iir) TARGET_LINK_LIBRARIES(bandpass_iir_1892 iir) TARGET_LINK_LIBRARIES(butterworth_1902 iir) @@ -40,21 +46,21 @@ TARGET_LINK_LIBRARIES(notch_iir_1894 iir) FILE(GLOB GSM_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/gsm/*.c) ADD_LIBRARY(gsm STATIC ${GSM_SOURCES}) -SET_TARGET_PROPERTIES(gsm PROPERTIES COMPILE_FLAGS "-fPIC") +SET_TARGET_PROPERTIES(gsm PROPERTIES COMPILE_FLAGS "${PIC_FLAGS}") TARGET_LINK_LIBRARIES(gsm_1215 gsm) ADD_LIBRARY(gverb STATIC gverb/gverb.c gverb/gverbdsp.c) -SET_TARGET_PROPERTIES(gverb PROPERTIES COMPILE_FLAGS "-fPIC") +SET_TARGET_PROPERTIES(gverb PROPERTIES COMPILE_FLAGS "${PIC_FLAGS}") TARGET_LINK_LIBRARIES(gverb_1216 gverb) ADD_LIBRARY(blo STATIC util/blo.c) -SET_TARGET_PROPERTIES(blo PROPERTIES COMPILE_FLAGS "-fPIC") +SET_TARGET_PROPERTIES(blo PROPERTIES COMPILE_FLAGS "${PIC_FLAGS}") TARGET_LINK_LIBRARIES(hermes_filter_1200 blo) ADD_LIBRARY(rms STATIC util/rms.c) ADD_LIBRARY(db STATIC util/db.c) -SET_TARGET_PROPERTIES(rms PROPERTIES COMPILE_FLAGS "-fPIC") -SET_TARGET_PROPERTIES(db PROPERTIES COMPILE_FLAGS "-fPIC") +SET_TARGET_PROPERTIES(rms PROPERTIES COMPILE_FLAGS "${PIC_FLAGS}") +SET_TARGET_PROPERTIES(db PROPERTIES COMPILE_FLAGS "${PIC_FLAGS}") TARGET_LINK_LIBRARIES(sc1_1425 rms db) TARGET_LINK_LIBRARIES(sc2_1426 rms db) TARGET_LINK_LIBRARIES(sc3_1427 rms db) @@ -63,6 +69,6 @@ TARGET_LINK_LIBRARIES(sc4m_1916 rms db) TARGET_LINK_LIBRARIES(se4_1883 rms db) ADD_LIBRARY(pitchscale STATIC util/pitchscale.c) -SET_TARGET_PROPERTIES(pitchscale PROPERTIES COMPILE_FLAGS "-fPIC") +SET_TARGET_PROPERTIES(pitchscale PROPERTIES COMPILE_FLAGS "${PIC_FLAGS}") TARGET_LINK_LIBRARIES(pitch_scale_1193 pitchscale) TARGET_LINK_LIBRARIES(pitch_scale_1194 pitchscale) diff --git a/plugins/ladspa_effect/swh/util/blo.c b/plugins/ladspa_effect/swh/util/blo.c index b2d05218d3..9524d0e87a 100644 --- a/plugins/ladspa_effect/swh/util/blo.c +++ b/plugins/ladspa_effect/swh/util/blo.c @@ -48,7 +48,9 @@ blo_h_tables *blo_h_tables_new(int table_size) unsigned int h; size_t all_tables_size = sizeof(float) * (table_size + BLO_TABLE_WR) * (BLO_N_HARMONICS - 1) * 2; +#ifndef WIN32 int shm_fd; +#endif char shm_path[128]; this = malloc(sizeof(blo_h_tables)); From 52270aebc1df6b50f4903a2085403da7b1ab1ca5 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 01:49:33 +0100 Subject: [PATCH 29/80] MidiWinMM: adapted MIDI changes Fixes build failure after recent API changes. --- src/core/midi/MidiWinMM.cpp | 143 +++++++++++++++--------------------- 1 file changed, 60 insertions(+), 83 deletions(-) diff --git a/src/core/midi/MidiWinMM.cpp b/src/core/midi/MidiWinMM.cpp index 3c0eba0c46..a4f52b9144 100644 --- a/src/core/midi/MidiWinMM.cpp +++ b/src/core/midi/MidiWinMM.cpp @@ -57,33 +57,28 @@ MidiWinMM::~MidiWinMM() -void MidiWinMM::processOutEvent( const MidiEvent & _me, - const MidiTime & _time, - const MidiPort * _port ) +void MidiWinMM::processOutEvent( const MidiEvent& event, const MidiTime& time, const MidiPort* port ) { - const DWORD shortMsg = ( _me.m_type + _me.channel() ) + - ( ( _me.m_data.m_param[0] & 0xff ) << 8 ) + - ( ( _me.m_data.m_param[1] & 0xff ) << 16 ); + const DWORD shortMsg = ( event.type() + event.channel() ) + + ( ( event.param( 0 ) & 0xff ) << 8 ) + + ( ( event.param( 1 ) & 0xff ) << 16 ); - QStringList out_devs; - for( SubMap::ConstIterator it = m_outputSubs.begin(); - it != m_outputSubs.end(); ++it ) + QStringList outDevs; + for( SubMap::ConstIterator it = m_outputSubs.begin(); it != m_outputSubs.end(); ++it ) { - for( MidiPortList::ConstIterator jt = it.value().begin(); - jt != it.value().end(); ++jt ) + for( MidiPortList::ConstIterator jt = it.value().begin(); jt != it.value().end(); ++jt ) { - if( *jt == _port ) + if( *jt == port ) { - out_devs += it.key(); + outDevs += it.key(); break; } } } - for( QMap::Iterator it = m_outputDevices.begin(); - it != m_outputDevices.end(); ++it ) + for( QMap::Iterator it = m_outputDevices.begin(); it != m_outputDevices.end(); ++it ) { - if( out_devs.contains( *it ) ) + if( outDevs.contains( *it ) ) { midiOutShortMsg( it.key(), shortMsg ); } @@ -93,25 +88,23 @@ void MidiWinMM::processOutEvent( const MidiEvent & _me, -void MidiWinMM::applyPortMode( MidiPort * _port ) +void MidiWinMM::applyPortMode( MidiPort* port ) { // make sure no subscriptions exist which are not possible with // current port-mode - if( !_port->inputEnabled() ) + if( !port->inputEnabled() ) { - for( SubMap::Iterator it = m_inputSubs.begin(); - it != m_inputSubs.end(); ++it ) + for( SubMap::Iterator it = m_inputSubs.begin(); it != m_inputSubs.end(); ++it ) { - it.value().removeAll( _port ); + it.value().removeAll( port ); } } - if( !_port->outputEnabled() ) + if( !port->outputEnabled() ) { - for( SubMap::Iterator it = m_outputSubs.begin(); - it != m_outputSubs.end(); ++it ) + for( SubMap::Iterator it = m_outputSubs.begin(); it != m_outputSubs.end(); ++it ) { - it.value().removeAll( _port ); + it.value().removeAll( port ); } } } @@ -119,105 +112,97 @@ void MidiWinMM::applyPortMode( MidiPort * _port ) -void MidiWinMM::removePort( MidiPort * _port ) +void MidiWinMM::removePort( MidiPort* port ) { - for( SubMap::Iterator it = m_inputSubs.begin(); - it != m_inputSubs.end(); ++it ) + for( SubMap::Iterator it = m_inputSubs.begin(); it != m_inputSubs.end(); ++it ) { - it.value().removeAll( _port ); + it.value().removeAll( port ); } - for( SubMap::Iterator it = m_outputSubs.begin(); - it != m_outputSubs.end(); ++it ) + + for( SubMap::Iterator it = m_outputSubs.begin(); it != m_outputSubs.end(); ++it ) { - it.value().removeAll( _port ); + it.value().removeAll( port ); } - MidiClient::removePort( _port ); + + MidiClient::removePort( port ); } -QString MidiWinMM::sourcePortName( const MidiEvent & _event ) const +QString MidiWinMM::sourcePortName( const MidiEvent& event ) const { - if( _event.sourcePort() ) + if( event.sourcePort() ) { - return m_inputDevices.value( *static_cast( - _event.sourcePort() ) ); + return m_inputDevices.value( *static_cast( event.sourcePort() ) ); } - return MidiClient::sourcePortName( _event ); + + return MidiClient::sourcePortName( event ); } -void MidiWinMM::subscribeReadablePort( MidiPort * _port, - const QString & _dest, - bool _subscribe ) +void MidiWinMM::subscribeReadablePort( MidiPort* port, const QString& dest, bool subscribe ) { - if( _subscribe && _port->inputEnabled() == false ) + if( subscribe && port->inputEnabled() == false ) { - qWarning( "port %s can't be (un)subscribed!\n", - _port->displayName().toAscii().constData() ); + qWarning( "port %s can't be (un)subscribed!\n", port->displayName().toAscii().constData() ); return; } - m_inputSubs[_dest].removeAll( _port ); - if( _subscribe ) + m_inputSubs[dest].removeAll( port ); + if( subscribe ) { - m_inputSubs[_dest].push_back( _port ); + m_inputSubs[dest].push_back( port ); } } -void MidiWinMM::subscribeWritablePort( MidiPort * _port, - const QString & _dest, - bool _subscribe ) +void MidiWinMM::subscribeWritablePort( MidiPort* port, const QString& dest, bool subscribe ) { - if( _subscribe && _port->outputEnabled() == false ) + if( subscribe && port->outputEnabled() == false ) { - qWarning( "port %s can't be (un)subscribed!\n", - _port->displayName().toAscii().constData() ); + qWarning( "port %s can't be (un)subscribed!\n", port->displayName().toAscii().constData() ); return; } - m_outputSubs[_dest].removeAll( _port ); - if( _subscribe ) + m_outputSubs[dest].removeAll( port ); + if( subscribe ) { - m_outputSubs[_dest].push_back( _port ); + m_outputSubs[dest].push_back( port ); } } -void WINAPI CALLBACK MidiWinMM::inputCallback( HMIDIIN _hm, UINT _msg, DWORD_PTR _inst, - DWORD_PTR _param1, DWORD_PTR _param2 ) +void WINAPI CALLBACK MidiWinMM::inputCallback( HMIDIIN hm, UINT msg, DWORD_PTR inst, DWORD_PTR param1, DWORD_PTR param2 ) { - if( _msg == MIM_DATA ) + if( msg == MIM_DATA ) { - ( (MidiWinMM *) _inst )->handleInputEvent( _hm, _param1 ); + ( (MidiWinMM *) inst )->handleInputEvent( hm, param1 ); } } -void MidiWinMM::handleInputEvent( HMIDIIN _hm, DWORD _ev ) +void MidiWinMM::handleInputEvent( HMIDIIN hm, DWORD ev ) { - const int cmd = _ev & 0xff; + const int cmd = ev & 0xff; if( cmd == MidiActiveSensing ) { return; } - const int par1 = ( _ev >> 8 ) & 0xff; - const int par2 = _ev >> 16; - const MidiEventTypes cmdtype = - static_cast( cmd & 0xf0 ); + const int par1 = ( ev >> 8 ) & 0xff; + const int par2 = ev >> 16; + const MidiEventTypes cmdtype = static_cast( cmd & 0xf0 ); const int chan = cmd & 0x0f; - const QString d = m_inputDevices.value( _hm ); + const QString d = m_inputDevices.value( hm ); if( d.isEmpty() || !m_inputSubs.contains( d ) ) { return; @@ -231,21 +216,21 @@ void MidiWinMM::handleInputEvent( HMIDIIN _hm, DWORD _ev ) case MidiNoteOn: case MidiNoteOff: case MidiKeyPressure: - ( *it )->processInEvent( MidiEvent( cmdtype, chan, par1 - KeysPerOctave, par2 & 0xff, &_hm ) ); + ( *it )->processInEvent( MidiEvent( cmdtype, chan, par1 - KeysPerOctave, par2 & 0xff, &hm ) ); break; case MidiControlChange: case MidiProgramChange: case MidiChannelPressure: - ( *it )->processInEvent( MidiEvent( cmdtype, chan, par1, par2 & 0xff, &_hm ) ); + ( *it )->processInEvent( MidiEvent( cmdtype, chan, par1, par2 & 0xff, &hm ) ); break; case MidiPitchBend: - ( *it )->processInEvent( MidiEvent( cmdtype, chan, par1 + par2*128, 0, &_hm ) ); + ( *it )->processInEvent( MidiEvent( cmdtype, chan, par1 + par2*128, 0, &hm ) ); break; default: - qWarning( "WinMM-MIDI: unhandled input event %d\n", cmdtype ); + qWarning( "MidiWinMM: unhandled input event %d\n", cmdtype ); break; } } @@ -258,17 +243,9 @@ void MidiWinMM::updateDeviceList() { closeDevices(); openDevices(); -// if( m_readablePorts != readable_ports ) - { -// m_readablePorts = readable_ports; - emit readablePortsChanged(); - } -// if( m_writablePorts != writable_ports ) - { -// m_writablePorts = writable_ports; - emit writablePortsChanged(); - } + emit readablePortsChanged(); + emit writablePortsChanged(); } @@ -332,8 +309,8 @@ void MidiWinMM::openDevices() -MidiWinMM::setupWidget::setupWidget( QWidget * _parent ) : - MidiClient::setupWidget( MidiWinMM::name(), _parent ) +MidiWinMM::setupWidget::setupWidget( QWidget* parent ) : + MidiClient::setupWidget( MidiWinMM::name(), parent ) { } From ad554ff1e82e5a44da7a9d478314c41c7232b06a Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 02:03:29 +0100 Subject: [PATCH 30/80] sfxr: fixed Win32 build Need time.h for the time() function. --- plugins/sfxr/sfxr.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/sfxr/sfxr.cpp b/plugins/sfxr/sfxr.cpp index 01beac5255..c52755c812 100644 --- a/plugins/sfxr/sfxr.cpp +++ b/plugins/sfxr/sfxr.cpp @@ -23,7 +23,8 @@ * Boston, MA 02110-1301 USA. */ -#include +#include +#include #define rnd(n) (rand()%(n+1)) From ba826e4aca4db78c86aa6f2478f985b0ffb17691 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 25 Jan 2014 20:37:23 -0500 Subject: [PATCH 31/80] clearer configure output for libsamplerate --- CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 397eecdeb4..15f6cec0e8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -303,9 +303,11 @@ IF(WANT_SYSTEM_SR) PKG_CHECK_MODULES(SAMPLERATE samplerate>=0.1.8) IF(SAMPLERATE_FOUND) SET(LMMS_HAVE_SAMPLERATE TRUE) + SET(STATUS_SAMPLERATE "OK") ENDIF(SAMPLERATE_FOUND) ENDIF(WANT_SYSTEM_SR) IF(NOT LMMS_HAVE_SAMPLERATE) + SET(STATUS_SAMPLERATE "bundled") INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src/3rdparty/samplerate) SET(CMAKE_CROSSCOMPILING_ORIG "${CMAKE_CROSSCOMPILING}") SET(CMAKE_CROSSCOMPILING "") @@ -569,8 +571,7 @@ MESSAGE("\n" "Installation Summary\n" "--------------------\n" "* Install Directory : ${CMAKE_INSTALL_PREFIX}\n" -#"* Build type : ${CMAKE_BUILD_TYPE}\n" -"* Use system's libsamplerate : ${LMMS_HAVE_SAMPLERATE}\n" +"* libsamplerate : ${STATUS_SAMPLERATE}\n" ) MESSAGE( From 143c801c717a54a8e5411c9e905fb2ff8797f62a Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 25 Jan 2014 21:33:33 -0500 Subject: [PATCH 32/80] add .mailmap to make git shortlog more accurate --- .mailmap | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .mailmap diff --git a/.mailmap b/.mailmap new file mode 100644 index 0000000000..6b65791861 --- /dev/null +++ b/.mailmap @@ -0,0 +1,10 @@ +Tobias Doerffel +Paul Giblock +Paul Giblock +Andrew Kelley +Andrew Kelley +Janne Sinisalo +Raine M. Ekman +Raine M. Ekman +Lukas W +Vesa From 186aedda9310e56b867e4c8e51aeac793d5bfd2e Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 25 Jan 2014 21:54:00 -0500 Subject: [PATCH 33/80] add another mailmap entry --- .mailmap | 1 + 1 file changed, 1 insertion(+) diff --git a/.mailmap b/.mailmap index 6b65791861..067e8929ce 100644 --- a/.mailmap +++ b/.mailmap @@ -8,3 +8,4 @@ Raine M. Ekman Raine M. Ekman Lukas W Vesa +Jonathan Aquilina From 15aaf6f4ca9753a4b4c05ccea6e9de4693bd7454 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 25 Jan 2014 22:20:34 -0500 Subject: [PATCH 34/80] add TIMEOUT 1 to git shortlog in configure script For some reason executing git shortlog in Qt Creator cmake project import hangs. This is a workaround so that it is still possible to use Qt Creator without changing the normal build, in which git shortlog will certainly complete in 1 second. --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 15f6cec0e8..196cfee9d8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -357,7 +357,8 @@ IF(GIT_FOUND) COMMAND ${GIT_EXECUTABLE} shortlog -sne COMMAND cut -c8- OUTPUT_FILE ${CONTRIBUTORS} - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + TIMEOUT 1) ENDIF(GIT_FOUND) SET(lmms_EMBEDDED_RESOURCES ${CMAKE_SOURCE_DIR}/AUTHORS ${CMAKE_SOURCE_DIR}/COPYING ${CONTRIBUTORS}) From 31c0f772484398544d2d2908a370c6580563614a Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 25 Jan 2014 23:03:48 -0500 Subject: [PATCH 35/80] fix incorrect type; makes smooth knobs actually smooth --- src/gui/widgets/knob.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/widgets/knob.cpp b/src/gui/widgets/knob.cpp index 1c8dc9eaf0..44b4449b5a 100644 --- a/src/gui/widgets/knob.cpp +++ b/src/gui/widgets/knob.cpp @@ -379,7 +379,7 @@ void knob::drawKnob( QPainter * _p ) float knob::getValue( const QPoint & _p ) { const float SMOOTH_FACTOR = 0.125f; - int yDist = (_p.y() - m_origMousePos.y()) * SMOOTH_FACTOR; + float yDist = (_p.y() - m_origMousePos.y()) * SMOOTH_FACTOR; if( engine::mainWindow()->isShiftPressed() ) { return m_origValue - (yDist * model()->step()); From 5816a2ae5d10c962a006029398999e96e6bb15ee Mon Sep 17 00:00:00 2001 From: Wong Cho Ching Date: Sun, 26 Jan 2014 13:29:52 +0800 Subject: [PATCH 36/80] Fixed OpulenZ segfault bug when it is dropped on another instrument. --- plugins/opl2/opl2instrument.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/plugins/opl2/opl2instrument.cpp b/plugins/opl2/opl2instrument.cpp index 2288e0d328..9b7f188a53 100644 --- a/plugins/opl2/opl2instrument.cpp +++ b/plugins/opl2/opl2instrument.cpp @@ -148,6 +148,13 @@ opl2instrument::opl2instrument( InstrumentTrack * _instrument_track ) : emulatorMutex.lock(); theEmulator = new CTemuopl(engine::mixer()->processingSampleRate(), true, false); theEmulator->init(); + + //Initialize voice values + for(int i=0; i<9; ++i) { + voiceNote[i] = OPL2_VOICE_FREE; + voiceLRU[i] = i; + } + // Enable waveform selection theEmulator->write(0x01,0x20); emulatorMutex.unlock(); @@ -162,11 +169,6 @@ opl2instrument::opl2instrument( InstrumentTrack * _instrument_track ) : pitchbend = 0; tuneEqual(69, 440); - for(int i=1; i<9; ++i) { - voiceNote[i] = OPL2_VOICE_FREE; - voiceLRU[i] = i; - } - connect( engine::mixer(), SIGNAL( sampleRateChanged() ), this, SLOT( reloadEmulator() ) ); // Connect knobs From b15942d12021a01d7b549a736ae00a660e5a097b Mon Sep 17 00:00:00 2001 From: Wong Cho Ching Date: Sun, 26 Jan 2014 14:19:33 +0800 Subject: [PATCH 37/80] Amended initialize code --- plugins/opl2/opl2instrument.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/opl2/opl2instrument.cpp b/plugins/opl2/opl2instrument.cpp index 9b7f188a53..50ea98b0a9 100644 --- a/plugins/opl2/opl2instrument.cpp +++ b/plugins/opl2/opl2instrument.cpp @@ -150,7 +150,9 @@ opl2instrument::opl2instrument( InstrumentTrack * _instrument_track ) : theEmulator->init(); //Initialize voice values - for(int i=0; i<9; ++i) { + voiceNote[0] = 0; + voiceLRU[0] = 0; + for(int i=1; i<9; ++i) { voiceNote[i] = OPL2_VOICE_FREE; voiceLRU[i] = i; } From b502ae9da484ffa2f685f45f08c87400bf25c9d6 Mon Sep 17 00:00:00 2001 From: Wong Cho Ching Date: Sun, 26 Jan 2014 14:23:32 +0800 Subject: [PATCH 38/80] Changed the placement of code --- plugins/opl2/opl2instrument.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/plugins/opl2/opl2instrument.cpp b/plugins/opl2/opl2instrument.cpp index 50ea98b0a9..3c8b425b09 100644 --- a/plugins/opl2/opl2instrument.cpp +++ b/plugins/opl2/opl2instrument.cpp @@ -148,6 +148,9 @@ opl2instrument::opl2instrument( InstrumentTrack * _instrument_track ) : emulatorMutex.lock(); theEmulator = new CTemuopl(engine::mixer()->processingSampleRate(), true, false); theEmulator->init(); + // Enable waveform selection + theEmulator->write(0x01,0x20); + emulatorMutex.unlock(); //Initialize voice values voiceNote[0] = 0; @@ -157,10 +160,6 @@ opl2instrument::opl2instrument( InstrumentTrack * _instrument_track ) : voiceLRU[i] = i; } - // Enable waveform selection - theEmulator->write(0x01,0x20); - emulatorMutex.unlock(); - updatePatch(); // Can the buffer size change suddenly? I bet that would break lots of stuff From 20333ad4ca0ba4a38251b4799ee665a638aebce8 Mon Sep 17 00:00:00 2001 From: Jonathan Aquilina Date: Sun, 26 Jan 2014 09:46:06 +0100 Subject: [PATCH 39/80] added another author to the file --- AUTHORS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/AUTHORS b/AUTHORS index 086d6c3a29..8794e0a0be 100644 --- a/AUTHORS +++ b/AUTHORS @@ -65,3 +65,7 @@ Johannes Lorenz Rubén Ibarra Pastor Developer + +LocoMatt + + 3osc skin developer From c5ab13e5c54bfbfb54d799a1b7e9f8bdacb0515d Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 09:46:20 +0100 Subject: [PATCH 40/80] InstrumentTrack: check for instrument instance in processOutEvent() There are situations where processOutEvent() is being called while loading instrument track settings e.g. when loading the pitch model whose dataChanged() signal is connected to InstrumentTrack::updatePitch() which in turn calls processOutEvent(). At this time we do not have an instrument instance and therefore have to skip processing. Closes #164. --- src/tracks/InstrumentTrack.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index aee0c87107..8cd840ceda 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -356,6 +356,12 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti void InstrumentTrack::processOutEvent( const MidiEvent& event, const MidiTime& time ) { + // do nothing if we do not have an instrument instance (e.g. when loading settings) + if( m_instrument == NULL ) + { + return; + } + const MidiEvent transposedEvent = applyMasterKey( event ); const int key = transposedEvent.key(); From 80a58df12435ad97493497c69f3d62816df4e865 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 09:59:25 +0100 Subject: [PATCH 41/80] MidiPort: coding style improvements --- include/MidiPort.h | 47 +++++---- src/core/midi/MidiPort.cpp | 207 +++++++++++++++++-------------------- 2 files changed, 117 insertions(+), 137 deletions(-) diff --git a/include/MidiPort.h b/include/MidiPort.h index c407f1f8fc..767dc932e9 100644 --- a/include/MidiPort.h +++ b/include/MidiPort.h @@ -73,34 +73,35 @@ public: Output, // from MIDI-event-processor to MIDI-client Duplex // both directions } ; + typedef Modes Mode; - MidiPort( const QString & _name, - MidiClient * _mc, - MidiEventProcessor * _mep, - Model * _parent = NULL, - Modes _mode = Disabled ); + MidiPort( const QString& name, + MidiClient* client, + MidiEventProcessor* eventProcessor, + Model* parent = NULL, + Mode mode = Disabled ); virtual ~MidiPort(); - void setName( const QString & _name ); + void setName( const QString& name ); - inline Modes mode() const + Mode mode() const { return m_mode; } - void setMode( Modes _mode ); + void setMode( Mode mode ); - inline bool inputEnabled() const + bool isInputEnabled() const { return mode() == Input || mode() == Duplex; } - inline bool outputEnabled() const + bool isOutputEnabled() const { return mode() == Output || mode() == Duplex; } - inline int realOutputChannel() const + int realOutputChannel() const { return outputChannel() - 1; } @@ -109,31 +110,29 @@ public: void processOutEvent( const MidiEvent& event, const MidiTime& time = MidiTime() ); - virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); - virtual void loadSettings( const QDomElement & _this ); + virtual void saveSettings( QDomDocument& doc, QDomElement& thisElement ); + virtual void loadSettings( const QDomElement& thisElement ); virtual QString nodeName() const { return "midiport"; } - void subscribeReadablePort( const QString & _port, - bool _subscribe = true ); - void subscribeWritablePort( const QString & _port, - bool _subscribe = true ); + void subscribeReadablePort( const QString& port, bool subscribe = true ); + void subscribeWritablePort( const QString& port, bool subscribe = true ); - const Map & readablePorts() const + const Map& readablePorts() const { return m_readablePorts; } - const Map & writablePorts() const + const Map& writablePorts() const { return m_writablePorts; } - MidiPortMenu * m_readablePortsMenu; - MidiPortMenu * m_writablePortsMenu; + MidiPortMenu* m_readablePortsMenu; + MidiPortMenu* m_writablePortsMenu; public slots: @@ -147,10 +146,10 @@ private slots: private: - MidiClient * m_midiClient; - MidiEventProcessor * m_midiEventProcessor; + MidiClient* m_midiClient; + MidiEventProcessor* m_midiEventProcessor; - Modes m_mode; + Mode m_mode; IntModel m_inputChannelModel; IntModel m_outputChannelModel; diff --git a/src/core/midi/MidiPort.cpp b/src/core/midi/MidiPort.cpp index c798fd265d..ffa2c97dd7 100644 --- a/src/core/midi/MidiPort.cpp +++ b/src/core/midi/MidiPort.cpp @@ -31,31 +31,25 @@ -MidiPort::MidiPort( const QString & _name, MidiClient * _mc, - MidiEventProcessor * _mep, Model * _parent, - Modes _mode ) : - Model( _parent ), +MidiPort::MidiPort( const QString& name, + MidiClient* client, + MidiEventProcessor* eventProcessor, + Model* parent, + Mode mode ) : + Model( parent ), m_readablePortsMenu( NULL ), m_writablePortsMenu( NULL ), - m_midiClient( _mc ), - m_midiEventProcessor( _mep ), - m_mode( _mode ), - m_inputChannelModel( 0, 0, MidiChannelCount, this, - tr( "Input channel" ) ), - m_outputChannelModel( 1, 1, MidiChannelCount, this, - tr( "Output channel" ) ), - m_inputControllerModel( 0, 0, MidiControllerCount, this, - tr( "Input controller" ) ), - m_outputControllerModel( 0, 0, MidiControllerCount, this, - tr( "Output controller" ) ), - m_fixedInputVelocityModel( -1, -1, MidiMaxVelocity, this, - tr( "Fixed input velocity" ) ), - m_fixedOutputVelocityModel( -1, -1, MidiMaxVelocity, this, - tr( "Fixed output velocity" ) ), - m_fixedOutputNoteModel( -1, -1, MidiMaxNote, this, - tr( "Fixed output note" ) ), - m_outputProgramModel( 1, 1, MidiProgramCount, this, - tr( "Output MIDI program" ) ), + m_midiClient( client ), + m_midiEventProcessor( eventProcessor ), + m_mode( mode ), + m_inputChannelModel( 0, 0, MidiChannelCount, this, tr( "Input channel" ) ), + m_outputChannelModel( 1, 1, MidiChannelCount, this, tr( "Output channel" ) ), + m_inputControllerModel( 0, 0, MidiControllerCount, this, tr( "Input controller" ) ), + m_outputControllerModel( 0, 0, MidiControllerCount, this, tr( "Output controller" ) ), + m_fixedInputVelocityModel( -1, -1, MidiMaxVelocity, this, tr( "Fixed input velocity" ) ), + m_fixedOutputVelocityModel( -1, -1, MidiMaxVelocity, this, tr( "Fixed output velocity" ) ), + m_fixedOutputNoteModel( -1, -1, MidiMaxNote, this, tr( "Fixed output note" ) ), + m_outputProgramModel( 1, 1, MidiProgramCount, this, tr( "Output MIDI program" ) ), m_readableModel( false, this, tr( "Receive MIDI-events" ) ), m_writableModel( false, this, tr( "Send MIDI-events" ) ) { @@ -64,12 +58,9 @@ MidiPort::MidiPort( const QString & _name, MidiClient * _mc, m_readableModel.setValue( m_mode == Input || m_mode == Duplex ); m_writableModel.setValue( m_mode == Output || m_mode == Duplex ); - connect( &m_readableModel, SIGNAL( dataChanged() ), - this, SLOT( updateMidiPortMode() ) ); - connect( &m_writableModel, SIGNAL( dataChanged() ), - this, SLOT( updateMidiPortMode() ) ); - connect( &m_outputProgramModel, SIGNAL( dataChanged() ), - this, SLOT( updateOutputProgram() ) ); + connect( &m_readableModel, SIGNAL( dataChanged() ), this, SLOT( updateMidiPortMode() ) ); + connect( &m_writableModel, SIGNAL( dataChanged() ), this, SLOT( updateMidiPortMode() ) ); + connect( &m_outputProgramModel, SIGNAL( dataChanged() ), this, SLOT( updateOutputProgram() ) ); // when using with non-raw-clients we can provide buttons showing @@ -80,10 +71,8 @@ MidiPort::MidiPort( const QString & _name, MidiClient * _mc, updateWritablePorts(); // we want to get informed about port-changes! - m_midiClient->connectRPChanged( this, - SLOT( updateReadablePorts() ) ); - m_midiClient->connectWPChanged( this, - SLOT( updateWritablePorts() ) ); + m_midiClient->connectRPChanged( this, SLOT( updateReadablePorts() ) ); + m_midiClient->connectWPChanged( this, SLOT( updateWritablePorts() ) ); } updateMidiPortMode(); @@ -105,18 +94,18 @@ MidiPort::~MidiPort() -void MidiPort::setName( const QString & _name ) +void MidiPort::setName( const QString& name ) { - setDisplayName( _name ); + setDisplayName( name ); m_midiClient->applyPortName( this ); } -void MidiPort::setMode( Modes _mode ) +void MidiPort::setMode( Mode mode ) { - m_mode = _mode; + m_mode = mode; m_midiClient->applyPortMode( this ); } @@ -126,7 +115,7 @@ void MidiPort::setMode( Modes _mode ) void MidiPort::processInEvent( const MidiEvent& event, const MidiTime& time ) { // mask event - if( inputEnabled() && + if( isInputEnabled() && ( inputChannel() == 0 || inputChannel()-1 == event.channel() ) ) { MidiEvent inEvent = event; @@ -156,7 +145,7 @@ void MidiPort::processInEvent( const MidiEvent& event, const MidiTime& time ) void MidiPort::processOutEvent( const MidiEvent& event, const MidiTime& time ) { // mask event - if( outputEnabled() && realOutputChannel() == event.channel() ) + if( isOutputEnabled() && realOutputChannel() == event.channel() ) { MidiEvent outEvent = event; @@ -181,27 +170,23 @@ void MidiPort::processOutEvent( const MidiEvent& event, const MidiTime& time ) -void MidiPort::saveSettings( QDomDocument & _doc, QDomElement & _this ) +void MidiPort::saveSettings( QDomDocument& doc, QDomElement& thisElement ) { - m_inputChannelModel.saveSettings( _doc, _this, "inputchannel" ); - m_outputChannelModel.saveSettings( _doc, _this, "outputchannel" ); - m_inputControllerModel.saveSettings( _doc, _this, "inputcontroller" ); - m_outputControllerModel.saveSettings( _doc, _this, "outputcontroller" ); - m_fixedInputVelocityModel.saveSettings( _doc, _this, - "fixedinputvelocity" ); - m_fixedOutputVelocityModel.saveSettings( _doc, _this, - "fixedoutputvelocity" ); - m_fixedOutputNoteModel.saveSettings( _doc, _this, - "fixedoutputnote" ); - m_outputProgramModel.saveSettings( _doc, _this, "outputprogram" ); - m_readableModel.saveSettings( _doc, _this, "readable" ); - m_writableModel.saveSettings( _doc, _this, "writable" ); + m_inputChannelModel.saveSettings( doc, thisElement, "inputchannel" ); + m_outputChannelModel.saveSettings( doc, thisElement, "outputchannel" ); + m_inputControllerModel.saveSettings( doc, thisElement, "inputcontroller" ); + m_outputControllerModel.saveSettings( doc, thisElement, "outputcontroller" ); + m_fixedInputVelocityModel.saveSettings( doc, thisElement, "fixedinputvelocity" ); + m_fixedOutputVelocityModel.saveSettings( doc, thisElement, "fixedoutputvelocity" ); + m_fixedOutputNoteModel.saveSettings( doc, thisElement, "fixedoutputnote" ); + m_outputProgramModel.saveSettings( doc, thisElement, "outputprogram" ); + m_readableModel.saveSettings( doc, thisElement, "readable" ); + m_writableModel.saveSettings( doc, thisElement, "writable" ); - if( inputEnabled() ) + if( isInputEnabled() ) { QString rp; - for( Map::ConstIterator it = m_readablePorts.begin(); - it != m_readablePorts.end(); ++it ) + for( Map::ConstIterator it = m_readablePorts.begin(); it != m_readablePorts.end(); ++it ) { if( it.value() ) { @@ -213,14 +198,13 @@ void MidiPort::saveSettings( QDomDocument & _doc, QDomElement & _this ) { rp.truncate( rp.length() - 1 ); } - _this.setAttribute( "inports", rp ); + thisElement.setAttribute( "inports", rp ); } - if( outputEnabled() ) + if( isOutputEnabled() ) { QString wp; - for( Map::ConstIterator it = m_writablePorts.begin(); - it != m_writablePorts.end(); ++it ) + for( Map::ConstIterator it = m_writablePorts.begin(); it != m_writablePorts.end(); ++it ) { if( it.value() ) { @@ -232,32 +216,31 @@ void MidiPort::saveSettings( QDomDocument & _doc, QDomElement & _this ) { wp.truncate( wp.length() - 1 ); } - _this.setAttribute( "outports", wp ); + thisElement.setAttribute( "outports", wp ); } } -void MidiPort::loadSettings( const QDomElement & _this ) +void MidiPort::loadSettings( const QDomElement& thisElement ) { - m_inputChannelModel.loadSettings( _this, "inputchannel" ); - m_outputChannelModel.loadSettings( _this, "outputchannel" ); - m_inputControllerModel.loadSettings( _this, "inputcontroller" ); - m_outputControllerModel.loadSettings( _this, "outputcontroller" ); - m_fixedInputVelocityModel.loadSettings( _this, "fixedinputvelocity" ); - m_fixedOutputVelocityModel.loadSettings( _this, "fixedoutputvelocity" ); - m_outputProgramModel.loadSettings( _this, "outputprogram" ); - m_readableModel.loadSettings( _this, "readable" ); - m_writableModel.loadSettings( _this, "writable" ); + m_inputChannelModel.loadSettings( thisElement, "inputchannel" ); + m_outputChannelModel.loadSettings( thisElement, "outputchannel" ); + m_inputControllerModel.loadSettings( thisElement, "inputcontroller" ); + m_outputControllerModel.loadSettings( thisElement, "outputcontroller" ); + m_fixedInputVelocityModel.loadSettings( thisElement, "fixedinputvelocity" ); + m_fixedOutputVelocityModel.loadSettings( thisElement, "fixedoutputvelocity" ); + m_outputProgramModel.loadSettings( thisElement, "outputprogram" ); + m_readableModel.loadSettings( thisElement, "readable" ); + m_writableModel.loadSettings( thisElement, "writable" ); // restore connections - if( inputEnabled() ) + if( isInputEnabled() ) { - QStringList rp = _this.attribute( "inports" ).split( ',' ); - for( Map::ConstIterator it = m_readablePorts.begin(); - it != m_readablePorts.end(); ++it ) + QStringList rp = thisElement.attribute( "inports" ).split( ',' ); + for( Map::ConstIterator it = m_readablePorts.begin(); it != m_readablePorts.end(); ++it ) { if( it.value() != ( rp.indexOf( it.key() ) != -1 ) ) { @@ -267,11 +250,10 @@ void MidiPort::loadSettings( const QDomElement & _this ) emit readablePortsChanged(); } - if( outputEnabled() ) + if( isOutputEnabled() ) { - QStringList wp = _this.attribute( "outports" ).split( ',' ); - for( Map::ConstIterator it = m_writablePorts.begin(); - it != m_writablePorts.end(); ++it ) + QStringList wp = thisElement.attribute( "outports" ).split( ',' ); + for( Map::ConstIterator it = m_writablePorts.begin(); it != m_writablePorts.end(); ++it ) { if( it.value() != ( wp.indexOf( it.key() ) != -1 ) ) { @@ -285,35 +267,38 @@ void MidiPort::loadSettings( const QDomElement & _this ) -void MidiPort::subscribeReadablePort( const QString & _port, bool _subscribe ) +void MidiPort::subscribeReadablePort( const QString& port, bool subscribe ) { - m_readablePorts[_port] = _subscribe; + m_readablePorts[port] = subscribe; + // make sure, MIDI-port is configured for input - if( _subscribe == true && !inputEnabled() ) + if( subscribe == true && !isInputEnabled() ) { m_readableModel.setValue( true ); } - m_midiClient->subscribeReadablePort( this, _port, _subscribe ); + + m_midiClient->subscribeReadablePort( this, port, subscribe ); } -void MidiPort::subscribeWritablePort( const QString & _port, bool _subscribe ) +void MidiPort::subscribeWritablePort( const QString& port, bool subscribe ) { - m_writablePorts[_port] = _subscribe; + m_writablePorts[port] = subscribe; + // make sure, MIDI-port is configured for output - if( _subscribe == true && !outputEnabled() ) + if( subscribe == true && !isOutputEnabled() ) { m_writableModel.setValue( true ); } - m_midiClient->subscribeWritablePort( this, _port, _subscribe ); + m_midiClient->subscribeWritablePort( this, port, subscribe ); } -void MidiPort::updateMidiPortMode( void ) +void MidiPort::updateMidiPortMode() { // this small lookup-table makes everything easier static const Modes modeTable[2][2] = @@ -324,10 +309,9 @@ void MidiPort::updateMidiPortMode( void ) setMode( modeTable[m_readableModel.value()][m_writableModel.value()] ); // check whether we have to dis-check items in connection-menu - if( !inputEnabled() ) + if( !isInputEnabled() ) { - for( Map::ConstIterator it = m_readablePorts.begin(); - it != m_readablePorts.end(); ++it ) + for( Map::ConstIterator it = m_readablePorts.begin(); it != m_readablePorts.end(); ++it ) { // subscribed? if( it.value() ) @@ -337,10 +321,9 @@ void MidiPort::updateMidiPortMode( void ) } } - if( !outputEnabled() ) + if( !isOutputEnabled() ) { - for( Map::ConstIterator it = m_writablePorts.begin(); - it != m_writablePorts.end(); ++it ) + for( Map::ConstIterator it = m_writablePorts.begin(); it != m_writablePorts.end(); ++it ) { // subscribed? if( it.value() ) @@ -360,42 +343,41 @@ void MidiPort::updateMidiPortMode( void ) -void MidiPort::updateReadablePorts( void ) +void MidiPort::updateReadablePorts() { // first save all selected ports - QStringList selected_ports; - for( Map::ConstIterator it = m_readablePorts.begin(); - it != m_readablePorts.end(); ++it ) + QStringList selectedPorts; + for( Map::ConstIterator it = m_readablePorts.begin(); it != m_readablePorts.end(); ++it ) { - if( it.value() == true ) + if( it.value() ) { - selected_ports.push_back( it.key() ); + selectedPorts.push_back( it.key() ); } } m_readablePorts.clear(); - const QStringList & wp = m_midiClient->readablePorts(); + const QStringList& wp = m_midiClient->readablePorts(); // now insert new ports and restore selections for( QStringList::ConstIterator it = wp.begin(); it != wp.end(); ++it ) { - m_readablePorts[*it] = ( selected_ports.indexOf( *it ) != -1 ); + m_readablePorts[*it] = ( selectedPorts.indexOf( *it ) != -1 ); } + emit readablePortsChanged(); } -void MidiPort::updateWritablePorts( void ) +void MidiPort::updateWritablePorts() { // first save all selected ports - QStringList selected_ports; - for( Map::ConstIterator it = m_writablePorts.begin(); - it != m_writablePorts.end(); ++it ) + QStringList selectedPorts; + for( Map::ConstIterator it = m_writablePorts.begin(); it != m_writablePorts.end(); ++it ) { - if( it.value() == true ) + if( it.value() ) { - selected_ports.push_back( it.key() ); + selectedPorts.push_back( it.key() ); } } @@ -404,19 +386,18 @@ void MidiPort::updateWritablePorts( void ) // now insert new ports and restore selections for( QStringList::ConstIterator it = wp.begin(); it != wp.end(); ++it ) { - m_writablePorts[*it] = ( selected_ports.indexOf( *it ) != -1 ); + m_writablePorts[*it] = ( selectedPorts.indexOf( *it ) != -1 ); } + emit writablePortsChanged(); } -void MidiPort::updateOutputProgram( void ) +void MidiPort::updateOutputProgram() { - processOutEvent( MidiEvent( MidiProgramChange, - realOutputChannel(), - outputProgram()-1 ), MidiTime( 0 ) ); + processOutEvent( MidiEvent( MidiProgramChange, realOutputChannel(), outputProgram()-1 ) ); } From 5d1335f3900f873596fbe025695eef8c13b8352d Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 10:04:03 +0100 Subject: [PATCH 42/80] RemoteVstPlugin: fix build failure due to out-of-bounds-array-access-warning Newer versions of GCC seem to assume an array size of 0 for arrays whose size is not specified explicitely. This causes a warning about an out-of-bounds array access. --- include/aeffectx.h | 2 +- plugins/vst_base/RemoteVstPlugin.cpp | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/include/aeffectx.h b/include/aeffectx.h index 393249b033..4188bf41a8 100644 --- a/include/aeffectx.h +++ b/include/aeffectx.h @@ -175,7 +175,7 @@ public: // 04 void *reserved; // 08 - VstEvent * events[]; + VstEvent* events[1]; } ; diff --git a/plugins/vst_base/RemoteVstPlugin.cpp b/plugins/vst_base/RemoteVstPlugin.cpp index cead22b70f..9d1b278c35 100644 --- a/plugins/vst_base/RemoteVstPlugin.cpp +++ b/plugins/vst_base/RemoteVstPlugin.cpp @@ -773,16 +773,15 @@ void RemoteVstPlugin::process( const sampleFrame * _in, sampleFrame * _out ) // dispatcher-call, so we create static copies of the // data and post them #define MIDI_EVENT_BUFFER_COUNT 1024 - static char event_buf[sizeof( VstMidiEvent * ) * - MIDI_EVENT_BUFFER_COUNT + - sizeof( VstEvents )]; + static char eventsBuffer[sizeof( VstEvents ) + sizeof( VstMidiEvent * ) * MIDI_EVENT_BUFFER_COUNT]; static VstMidiEvent vme[MIDI_EVENT_BUFFER_COUNT]; - VstEvents * events = (VstEvents *) event_buf; + + VstEvents* events = (VstEvents *) eventsBuffer; events->reserved = 0; events->numEvents = m_midiEvents.size(); + int idx = 0; - for( VstMidiEventList::iterator it = m_midiEvents.begin(); - it != m_midiEvents.end(); ++it, ++idx ) + for( VstMidiEventList::iterator it = m_midiEvents.begin(); it != m_midiEvents.end(); ++it, ++idx ) { memcpy( &vme[idx], &*it, sizeof( VstMidiEvent ) ); events->events[idx] = (VstEvent *) &vme[idx]; From 4ba5edc32c35b07f6a2e3d9f876b2ee4fff3da7a Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 10:17:10 +0100 Subject: [PATCH 43/80] InstrumentTrack: generally do not forward NoteOn/NoteOff/KeyPressure events If we receive MidiNoteOn, MidiNoteOff or MidiKeyPressure events we always kind of handle them in processInEvent() so do not forward them to the instrument. This fixes a freeze when loading VST plugins as PianoView::focusOutEvent() tried to send MIDI events to the not yet completely loaded and thus locked VST plugin. Closes #160. --- src/tracks/InstrumentTrack.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index 8cd840ceda..a326716fcc 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -251,10 +251,9 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti } emit noteOn( n ); - - eventHandled = true; - } + + eventHandled = true; break; } @@ -277,20 +276,19 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti // be deleted later automatically) nph->noteOff(); m_notes[event.key()] = NULL; - - eventHandled = true; } + eventHandled = true; break; } case MidiKeyPressure: if( m_notes[event.key()] != NULL ) { - eventHandled = true; // setVolume() calls processOutEvent() with MidiKeyPressure so the // attached instrument will receive the event as well m_notes[event.key()]->setVolume( event.volume() ); } + eventHandled = true; break; case MidiPitchBend: From f519bec995c58295870bb0863879466fb2855066 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 12:34:12 +0100 Subject: [PATCH 44/80] MainWindow: remove undo/redo actions from edit menu for the time being As undo/redo are not working properly at the moment, do not expose according menu items to the user. This will be fixed in upcoming releases. Closes #152. --- src/gui/MainWindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 682be6868d..8a92a5c763 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -275,7 +275,7 @@ void MainWindow::finalize( void ) QMenu * edit_menu = new QMenu( this ); menuBar()->addMenu( edit_menu )->setText( tr( "&Edit" ) ); - edit_menu->addAction( embed::getIconPixmap( "edit_undo" ), +/* edit_menu->addAction( embed::getIconPixmap( "edit_undo" ), tr( "Undo" ), this, SLOT( undo() ), Qt::CTRL + Qt::Key_Z ); @@ -283,7 +283,7 @@ void MainWindow::finalize( void ) tr( "Redo" ), this, SLOT( redo() ), Qt::CTRL + Qt::Key_R ); - edit_menu->addSeparator(); + edit_menu->addSeparator();*/ edit_menu->addAction( embed::getIconPixmap( "setup_general" ), tr( "Settings" ), this, SLOT( showSettingsDialog() ) ); From 91d73bba2b4bebb5f90c2c0926da7044efe55c78 Mon Sep 17 00:00:00 2001 From: Wong Cho Ching Date: Sun, 26 Jan 2014 19:40:52 +0800 Subject: [PATCH 45/80] Fixes segfault when clearSelection() is called with a new instance of FileDialog --- src/gui/dialogs/FileDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/dialogs/FileDialog.cpp b/src/gui/dialogs/FileDialog.cpp index ba25bf80e9..2cd28a5230 100644 --- a/src/gui/dialogs/FileDialog.cpp +++ b/src/gui/dialogs/FileDialog.cpp @@ -59,7 +59,7 @@ FileDialog::FileDialog( QWidget *parent, const QString &caption, void FileDialog::clearSelection() { - static QListView *view = findChild(); + QListView *view = findChild() Q_ASSERT( view ); view->clearSelection(); } From e4cca6a0b34e70f1c8f5ebda32e0808cb81c6aaa Mon Sep 17 00:00:00 2001 From: Wong Cho Ching Date: Sun, 26 Jan 2014 20:45:34 +0800 Subject: [PATCH 46/80] Added semi-colon to make it build --- src/gui/dialogs/FileDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/dialogs/FileDialog.cpp b/src/gui/dialogs/FileDialog.cpp index 2cd28a5230..ad77018cc9 100644 --- a/src/gui/dialogs/FileDialog.cpp +++ b/src/gui/dialogs/FileDialog.cpp @@ -59,7 +59,7 @@ FileDialog::FileDialog( QWidget *parent, const QString &caption, void FileDialog::clearSelection() { - QListView *view = findChild() + QListView *view = findChild(); Q_ASSERT( view ); view->clearSelection(); } From bd6fb03d44e2d546c6661c8d9fd6e5d76d48c703 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 14:02:05 +0100 Subject: [PATCH 47/80] Midi: added constants for pitch bend --- include/Midi.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/Midi.h b/include/Midi.h index 25a9fecc8b..c2459223b8 100644 --- a/include/Midi.h +++ b/include/Midi.h @@ -119,4 +119,7 @@ const int MidiMaxNote = 127; const int MidiMaxPanning = 127; const int MidiMinPanning = -128; +const int MidiMinPitchBend = 0; +const int MidiMaxPitchBend = 16383; + #endif From a3c7f983a34f946e968c5592704a600a09f31947 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 14:02:51 +0100 Subject: [PATCH 48/80] New header file Pitch.h for pitch-related data types and helpers --- include/Pitch.h | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 include/Pitch.h diff --git a/include/Pitch.h b/include/Pitch.h new file mode 100644 index 0000000000..dc479857ec --- /dev/null +++ b/include/Pitch.h @@ -0,0 +1,38 @@ +/* + * Pitch.h - declaration of some constants and types concerning instrument pitch + * + * Copyright (c) 2014 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + +#ifndef _PITCH_H +#define _PITCH_H + +#include "lmms_basics.h" +#include "Midi.h" + +typedef int16_t pitch_t; + +const pitch_t CentsPerSemitone = 100; +const pitch_t MinPitchDefault = -CentsPerSemitone; +const pitch_t MaxPitchDefault = CentsPerSemitone; +const pitch_t DefaultPitch = 0; + +#endif From 99ea20463e7534ae3673111ac3230c5d0e94fecd Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 14:03:25 +0100 Subject: [PATCH 49/80] InstrumentTrack: fixed midiPitch() and added midiPitchRange() --- include/InstrumentTrack.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/include/InstrumentTrack.h b/include/InstrumentTrack.h index 0217cb19a1..4057d7990e 100644 --- a/include/InstrumentTrack.h +++ b/include/InstrumentTrack.h @@ -34,6 +34,7 @@ #include "note_play_handle.h" #include "Piano.h" #include "PianoView.h" +#include "Pitch.h" #include "track.h" @@ -111,7 +112,13 @@ public: // translate pitch to midi-pitch [0,16383] int midiPitch() const { - return (int)( ( m_pitchModel.value()+100 ) * 16383 ) / 200; + return static_cast( ( ( m_pitchModel.value() + m_pitchModel.range()/2 ) * MidiMaxPitchBend ) / m_pitchModel.range() ); + } + + /*! \brief Returns current range for pitch bend in semitones */ + int midiPitchRange() const + { + return m_pitchRangeModel.value(); } // play everything in given frame-range - creates note-play-handles From c77531fef23df80636434287cdc45ffd1588128a Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 14:03:43 +0100 Subject: [PATCH 50/80] Midi: added constants for Register Parameter Numbers (RPN) support --- include/Midi.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/include/Midi.h b/include/Midi.h index c2459223b8..1b6b69383c 100644 --- a/include/Midi.h +++ b/include/Midi.h @@ -87,6 +87,7 @@ enum MidiStandardControllers MidiControllerBreathController = 2, MidiControllerFootController = 4, MidiControllerPortamentoTime = 5, + MidiControllerDataEntry = 6, MidiControllerMainVolume = 7, MidiControllerBalance = 8, MidiControllerPan = 10, @@ -97,6 +98,8 @@ enum MidiStandardControllers MidiControllerSostenuto = 66, MidiControllerSoftPedal = 67, MidiControllerLegatoFootswitch = 68, + MidiControllerRegisteredParameterNumberLSB = 100, + MidiControllerRegisteredParameterNumberMSB = 101, // Channel Mode Messages are controllers too... MidiControllerAllSoundOff = 120, MidiControllerResetAllControllers = 121, @@ -109,6 +112,17 @@ enum MidiStandardControllers }; +enum MidiControllerRegisteredParameterNumbers +{ + MidiPitchBendSensitivityRPN = 0x0000, + MidiChannelFineTuningRPN = 0x0001, + MidiChannelCoarseTuningRPN = 0x0002, + MidiTuningProgramChangeRPN = 0x0003, + MidiTuningBankSelectRPN = 0x0004, + MidiModulationDepthRangeRPN = 0x0005, + MidiNullFunctionNumberRPN = 0x7F7F +}; + const int MidiChannelCount = 16; const int MidiControllerCount = 128; const int MidiProgramCount = 128; From 8c9778c945aad25936594fd08680f50923610d93 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 14:05:22 +0100 Subject: [PATCH 51/80] AutomatableModel: do not change init value when adjusting range This causes e.g. the default value of the pitch model to be changed when changing the pitch range. --- src/core/AutomatableModel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/AutomatableModel.cpp b/src/core/AutomatableModel.cpp index a9a3b5147b..56791ade4f 100644 --- a/src/core/AutomatableModel.cpp +++ b/src/core/AutomatableModel.cpp @@ -253,7 +253,7 @@ void AutomatableModel::setRange( const float min, const float max, setStep( step ); // re-adjust value - setInitValue( value() ); + setValue( value() ); emit propertiesChanged(); } From 0e00fc6aa129a67d508ed38594a93292987c47b0 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 14:06:46 +0100 Subject: [PATCH 52/80] InstrumentTrack: replaced numbers by newly introduced constants --- src/tracks/InstrumentTrack.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index a326716fcc..8edb4ac62e 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -103,7 +103,7 @@ InstrumentTrack::InstrumentTrack( TrackContainer* tc ) : tr( "Base note" ) ), m_volumeModel( DefaultVolume, MinVolume, MaxVolume, 0.1f, this, tr( "Volume" ) ), m_panningModel( DefaultPanning, PanningLeft, PanningRight, 0.1f, this, tr( "Panning" ) ), - m_pitchModel( 0, -100, 100, 1, this, tr( "Pitch" ) ), + m_pitchModel( 0, MinPitchDefault, MaxPitchDefault, 1, this, tr( "Pitch" ) ), m_pitchRangeModel( 1, 1, 24, this, tr( "Pitch range" ) ), m_effectChannelModel( 0, 0, NumFxChannels, this, tr( "FX channel" ) ), m_instrument( NULL ), @@ -294,7 +294,7 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti case MidiPitchBend: // updatePitch() is connected to m_pitchModel::dataChanged() which will send out // MidiPitchBend events - m_pitchModel.setValue( m_pitchModel.minValue() + event.pitchBend() * m_pitchModel.range() / 16384 ); + m_pitchModel.setValue( m_pitchModel.minValue() + event.pitchBend() * m_pitchModel.range() / MidiMaxPitchBend ); break; case MidiControlChange: From 52d2274e193ef809e57aebbfb300ec9d537c6653 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 14:07:06 +0100 Subject: [PATCH 53/80] InstrumentTrack: coding style fixes --- src/tracks/InstrumentTrack.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index 8edb4ac62e..6072c42d53 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -533,7 +533,8 @@ void InstrumentTrack::updateBaseNote() void InstrumentTrack::updatePitch() { updateBaseNote(); - processOutEvent( MidiEvent( MidiPitchBend, midiPort()->realOutputChannel(), midiPitch() ), 0 ); + + processOutEvent( MidiEvent( MidiPitchBend, midiPort()->realOutputChannel(), midiPitch() ) ); } From 0a5665ae160db6c861a2788ceac467fa4b356099 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 14:07:15 +0100 Subject: [PATCH 54/80] InstrumentTrack: send RPN update in updatePitchRange() When changing the pitch range all we can do for MIDI is to update the MIDI pitch bend sensitivity RPN even though this is only supported by some MIDI instruments. Closes #129. --- src/tracks/InstrumentTrack.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index 6072c42d53..7a309c93b8 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -543,7 +543,13 @@ void InstrumentTrack::updatePitch() void InstrumentTrack::updatePitchRange() { const int r = m_pitchRangeModel.value(); - m_pitchModel.setRange( -100 * r, 100 * r ); + m_pitchModel.setRange( -MinPitchDefault * r, MaxPitchDefault * r ); + + processOutEvent( MidiEvent( MidiControlChange, midiPort()->realOutputChannel(), + MidiControllerRegisteredParameterNumberLSB, MidiPitchBendSensitivityRPN & 0x7F ) ); + processOutEvent( MidiEvent( MidiControlChange, midiPort()->realOutputChannel(), + MidiControllerRegisteredParameterNumberMSB, ( MidiPitchBendSensitivityRPN >> 8 ) & 0x7F ) ); + processOutEvent( MidiEvent( MidiControlChange, midiPort()->realOutputChannel(), MidiControllerDataEntry, midiPitchRange() ) ); } From 43f76f535780b6de6bc2b1df8fcea32fae12ed99 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 14:09:05 +0100 Subject: [PATCH 55/80] Sf2Player: update pitch wheel sensitivity based on pitch range Fluidsynth supports setting the pitch wheel sensitivity, therefore make use of it and set values from the recently introduced pitch range model. --- plugins/sf2_player/sf2_player.cpp | 16 +++++++++++++--- plugins/sf2_player/sf2_player.h | 1 + 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/plugins/sf2_player/sf2_player.cpp b/plugins/sf2_player/sf2_player.cpp index 9091cafef9..368a9779b6 100644 --- a/plugins/sf2_player/sf2_player.cpp +++ b/plugins/sf2_player/sf2_player.cpp @@ -87,7 +87,8 @@ sf2Instrument::sf2Instrument( InstrumentTrack * _instrument_track ) : m_font( NULL ), m_fontId( 0 ), m_filename( "" ), - m_lastMidiPitch( 8192 ), + m_lastMidiPitch( -1 ), + m_lastMidiPitchRange( -1 ), m_channel( 1 ), m_bankNum( 0, 0, 999, this, tr("Bank") ), m_patchNum( 0, 0, 127, this, tr("Patch") ), @@ -679,12 +680,21 @@ void sf2Instrument::play( sampleFrame * _working_buffer ) const fpp_t frames = engine::mixer()->framesPerPeriod(); m_synthMutex.lock(); - if( m_lastMidiPitch != instrumentTrack()->midiPitch() ) + + const int currentMidiPitch = instrumentTrack()->midiPitch(); + if( m_lastMidiPitch != currentMidiPitch ) { - m_lastMidiPitch = instrumentTrack()->midiPitch(); + m_lastMidiPitch = currentMidiPitch; fluid_synth_pitch_bend( m_synth, m_channel, m_lastMidiPitch ); } + const int currentMidiPitchRange = instrumentTrack()->midiPitchRange(); + if( m_lastMidiPitchRange != currentMidiPitchRange ) + { + m_lastMidiPitchRange = currentMidiPitchRange; + fluid_synth_pitch_wheel_sens( m_synth, m_channel, m_lastMidiPitchRange ); + } + if( m_internalSampleRate < engine::mixer()->processingSampleRate() && m_srcState != NULL ) { diff --git a/plugins/sf2_player/sf2_player.h b/plugins/sf2_player/sf2_player.h index 9034806054..691a2be833 100644 --- a/plugins/sf2_player/sf2_player.h +++ b/plugins/sf2_player/sf2_player.h @@ -129,6 +129,7 @@ private: int m_notesRunning[128]; sample_rate_t m_internalSampleRate; int m_lastMidiPitch; + int m_lastMidiPitchRange; int m_channel; lcdSpinBoxModel m_bankNum; From a5588d2f754b280e23a0ddf514d1f76b3300858e Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 14:11:42 +0100 Subject: [PATCH 56/80] ZynAddSubFX: default pitch wheel bend range to 100 Even though ZynAddSubFX does not support pitch wheel sensitivity RPN events and thus we can't update the pitch range from LMMS automatically, at least default to 100 semitones pitch wheel bend range so behaviour is consistent with default pitch range in LMMS. --- plugins/zynaddsubfx/src/Params/Controller.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/zynaddsubfx/src/Params/Controller.cpp b/plugins/zynaddsubfx/src/Params/Controller.cpp index 9bfa6b47d9..e3fb70d8cf 100644 --- a/plugins/zynaddsubfx/src/Params/Controller.cpp +++ b/plugins/zynaddsubfx/src/Params/Controller.cpp @@ -35,7 +35,7 @@ Controller::~Controller() void Controller::defaults() { - setpitchwheelbendrange(200); //2 halftones + setpitchwheelbendrange(100); //2 halftones expression.receive = 1; panning.depth = 64; filtercutoff.depth = 64; From 20700b1c715f9af5d46eedad4e9c0ee9ce76c2cd Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 14:22:41 +0100 Subject: [PATCH 57/80] InstrumentTrack: fixed range for pitch model --- src/tracks/InstrumentTrack.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index 7a309c93b8..88185a8830 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -543,7 +543,7 @@ void InstrumentTrack::updatePitch() void InstrumentTrack::updatePitchRange() { const int r = m_pitchRangeModel.value(); - m_pitchModel.setRange( -MinPitchDefault * r, MaxPitchDefault * r ); + m_pitchModel.setRange( MinPitchDefault * r, MaxPitchDefault * r ); processOutEvent( MidiEvent( MidiControlChange, midiPort()->realOutputChannel(), MidiControllerRegisteredParameterNumberLSB, MidiPitchBendSensitivityRPN & 0x7F ) ); From 29f04d8056c95e0868fe39ba5233f336ff3ae854 Mon Sep 17 00:00:00 2001 From: "Raine M. Ekman" Date: Sun, 26 Jan 2014 16:33:43 +0200 Subject: [PATCH 58/80] OpulenZ: added pitch bend range MIDI message handling --- plugins/opl2/opl2instrument.cpp | 34 +++++++++++++++++++++------------ plugins/opl2/opl2instrument.h | 8 +++++--- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/plugins/opl2/opl2instrument.cpp b/plugins/opl2/opl2instrument.cpp index 3c8b425b09..5f41b6454f 100644 --- a/plugins/opl2/opl2instrument.cpp +++ b/plugins/opl2/opl2instrument.cpp @@ -168,6 +168,9 @@ opl2instrument::opl2instrument( InstrumentTrack * _instrument_track ) : // Some kind of sane defaults pitchbend = 0; + pitchBendRange = 100; + RPNcoarse = RPNfine = 255; + tuneEqual(69, 440); connect( engine::mixer(), SIGNAL( sampleRateChanged() ), @@ -257,7 +260,6 @@ void opl2instrument::setVoiceVelocity(int voice, int vel) { theEmulator->write(0x43+adlib_opadd[voice], ( (int)op2_scale_mdl.value() & 0x03 << 6) + ( vel_adjusted & 0x3f ) ); - // printf("vel %d for voice %d (%f)\n",vel_adjusted,voice,op2_lvl_mdl.value() ); } // Pop least recently used voice - why does it sometimes lose a voice (mostly 0)? @@ -267,10 +269,6 @@ int opl2instrument::popVoice() { voiceLRU[i] = voiceLRU[i+1]; } voiceLRU[8] = OPL2_NO_VOICE; - /* printf("pop: %d %d %d %d %d %d %d %d %d \n", - voiceLRU[0],voiceLRU[1],voiceLRU[2], - voiceLRU[3],voiceLRU[4],voiceLRU[5], - voiceLRU[6],voiceLRU[7],voiceLRU[8]); */ return tmp; } @@ -282,10 +280,6 @@ int opl2instrument::pushVoice(int v) { } } voiceLRU[i] = v; - /*printf("%d %d %d %d %d %d %d %d %d \n", - voiceLRU[0],voiceLRU[1],voiceLRU[2], - voiceLRU[3],voiceLRU[4],voiceLRU[5], - voiceLRU[6],voiceLRU[7],voiceLRU[8]); */ return i; } @@ -309,7 +303,6 @@ bool opl2instrument::handleMidiEvent( const MidiEvent& event, const MidiTime& ti setVoiceVelocity(voice, vel); voiceNote[voice] = key; velocities[key] = vel; - // printf("%d %d\n",voice,vel); } break; case MidiNoteOff: @@ -342,9 +335,8 @@ bool opl2instrument::handleMidiEvent( const MidiEvent& event, const MidiTime& ti // tmp_pb = (2*BEND_CENTS)*((float)event.m_data.m_param[0]/16383)-BEND_CENTS; // Something like 100 cents = 8192, but offset by 8192 so the +/-100 cents range goes from 0...16383? - tmp_pb = ( event.pitchBend()-8192 ) * BEND_CENTS / 8192; + tmp_pb = ( event.pitchBend()-8192 ) * pitchBendRange / 8192; - printf("Pitch bend: %d -> %d cents\n",event.pitchBend(),tmp_pb); if( tmp_pb != pitchbend ) { pitchbend = tmp_pb; tuneEqual(69, 440.0); @@ -357,6 +349,24 @@ bool opl2instrument::handleMidiEvent( const MidiEvent& event, const MidiTime& ti } } break; + case MidiControlChange: + switch (event.controllerNumber()) { + case MidiControllerRegisteredParameterNumberLSB: + RPNfine = event.controllerValue(); + break; + case MidiControllerRegisteredParameterNumberMSB: + RPNcoarse = event.controllerValue(); + break; + case MidiControllerDataEntry: + if( (RPNcoarse << 8) + RPNfine == MidiPitchBendSensitivityRPN) { + pitchBendRange = event.controllerValue() * 100; + } + break; + default: + printf("Midi CC %02x %02x\n", event.controllerNumber(), event.controllerValue() ); + break; + } + break; default: printf("Midi event type %d\n",event.type()); } diff --git a/plugins/opl2/opl2instrument.h b/plugins/opl2/opl2instrument.h index 39c9d13c2e..9f47a0cfea 100644 --- a/plugins/opl2/opl2instrument.h +++ b/plugins/opl2/opl2instrument.h @@ -36,7 +36,7 @@ #define OPL2_VOICE_FREE 255 #define OPL2_NO_VOICE 255 // The "normal" range for LMMS pitchbends -#define BEND_CENTS 100 +#define DEFAULT_BEND_CENTS 100 class opl2instrument : public Instrument { @@ -119,8 +119,7 @@ private: int fnums[128]; // in cents, range defaults to +/-100 cents (should this be changeable?) int pitchbend; - - + int pitchBendRange; int popVoice(); int pushVoice(int v); @@ -128,6 +127,9 @@ private: int Hz2fnum(float Hz); static QMutex emulatorMutex; void setVoiceVelocity(int voice, int vel); + + // Pitch bend range comes through RPNs. + int RPNcoarse, RPNfine; }; From ad27039b9bbba2ab1095ddd3c163a20a02956c96 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 15:56:10 +0100 Subject: [PATCH 59/80] InstrumentTrack: removed compat code for loading old projects We should not need compat code for project files < 0.4.x anymore. Anybody who wants to load project files made before 2008 is advised to open them in LMMS 0.4.x first and save them so they get upgraded. --- src/tracks/InstrumentTrack.cpp | 51 ++-------------------------------- 1 file changed, 3 insertions(+), 48 deletions(-) diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index 88185a8830..56de9a73d6 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -755,37 +755,11 @@ void InstrumentTrack::loadTrackSpecificSettings( const QDomElement & _this ) engine::mixer()->lock(); m_volumeModel.loadSettings( _this, "vol" ); - - // compat-hacks - move to mmp::upgrade - if( _this.hasAttribute( "surpos" ) || _this.hasAttribute( "surpos-x" ) - || !_this.firstChildElement( "automationpattern" ). - firstChildElement( "surpos-x" ).isNull() ) - { - surroundAreaModel m( this, this ); - m.loadSettings( _this, "surpos" ); - m_panningModel.setValue( m.x() * 100 / SURROUND_AREA_SIZE ); - } - else - { - m_panningModel.loadSettings( _this, "pan" ); - } - + m_panningModel.loadSettings( _this, "pan" ); m_pitchModel.loadSettings( _this, "pitch" ); m_pitchRangeModel.loadSettings( _this, "pitchrange" ); m_effectChannelModel.loadSettings( _this, "fxch" ); - - if( _this.hasAttribute( "baseoct" ) ) - { - // TODO: move this compat code to mmp.cpp -> upgrade() - m_baseNoteModel.setInitValue( _this. - attribute( "baseoct" ).toInt() - * KeysPerOctave - + _this.attribute( "basetone" ).toInt() ); - } - else - { - m_baseNoteModel.loadSettings( _this, "basenote" ); - } + m_baseNoteModel.loadSettings( _this, "basenote" ); // clear effect-chain just in case we load an old preset without FX-data m_audioPort.effects()->clear(); @@ -826,28 +800,9 @@ void InstrumentTrack::loadTrackSpecificSettings( const QDomElement & _this ) node.firstChildElement() ); emit instrumentChanged(); } - // compat code - if node-name doesn't match any known - // one, we assume that it is an instrument-plugin - // which we'll try to load - else if( AutomationPattern::classNodeName() != node.nodeName() && - ControllerConnection::classNodeName() != node.nodeName() && - !node.toElement().hasAttribute( "id" ) ) - { - delete m_instrument; - m_instrument = NULL; - m_instrument = Instrument::instantiate( - node.nodeName(), this ); - if( m_instrument->nodeName() == - node.nodeName() ) - { - m_instrument->restoreState( - node.toElement() ); - } - emit instrumentChanged(); - } } node = node.nextSibling(); - } + } engine::mixer()->unlock(); } From 7103bb31d69ee4c4d7a72b84c4f14d780598be62 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 16:02:35 +0100 Subject: [PATCH 60/80] InstrumentTrack: more coding style improvements --- src/tracks/InstrumentTrack.cpp | 152 +++++++++++++++++---------------- 1 file changed, 77 insertions(+), 75 deletions(-) diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index 56de9a73d6..c05a379f14 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -720,51 +720,50 @@ trackView * InstrumentTrack::createView( TrackContainerView* tcv ) -void InstrumentTrack::saveTrackSpecificSettings( QDomDocument & _doc, - QDomElement & _this ) +void InstrumentTrack::saveTrackSpecificSettings( QDomDocument& doc, QDomElement & thisElement ) { - m_volumeModel.saveSettings( _doc, _this, "vol" ); - m_panningModel.saveSettings( _doc, _this, "pan" ); - m_pitchModel.saveSettings( _doc, _this, "pitch" ); - m_pitchRangeModel.saveSettings( _doc, _this, "pitchrange" ); + m_volumeModel.saveSettings( doc, thisElement, "vol" ); + m_panningModel.saveSettings( doc, thisElement, "pan" ); + m_pitchModel.saveSettings( doc, thisElement, "pitch" ); + m_pitchRangeModel.saveSettings( doc, thisElement, "pitchrange" ); - m_effectChannelModel.saveSettings( _doc, _this, "fxch" ); - m_baseNoteModel.saveSettings( _doc, _this, "basenote" ); + m_effectChannelModel.saveSettings( doc, thisElement, "fxch" ); + m_baseNoteModel.saveSettings( doc, thisElement, "basenote" ); if( m_instrument != NULL ) { - QDomElement i = _doc.createElement( "instrument" ); + QDomElement i = doc.createElement( "instrument" ); i.setAttribute( "name", m_instrument->descriptor()->name ); - m_instrument->saveState( _doc, i ); - _this.appendChild( i ); + m_instrument->saveState( doc, i ); + thisElement.appendChild( i ); } - m_soundShaping.saveState( _doc, _this ); - m_noteStacking.saveState( _doc, _this ); - m_arpeggio.saveState( _doc, _this ); - m_midiPort.saveState( _doc, _this ); - m_audioPort.effects()->saveState( _doc, _this ); + m_soundShaping.saveState( doc, thisElement ); + m_noteStacking.saveState( doc, thisElement ); + m_arpeggio.saveState( doc, thisElement ); + m_midiPort.saveState( doc, thisElement ); + m_audioPort.effects()->saveState( doc, thisElement ); } -void InstrumentTrack::loadTrackSpecificSettings( const QDomElement & _this ) +void InstrumentTrack::loadTrackSpecificSettings( const QDomElement & thisElement ) { silenceAllNotes(); engine::mixer()->lock(); - m_volumeModel.loadSettings( _this, "vol" ); - m_panningModel.loadSettings( _this, "pan" ); - m_pitchModel.loadSettings( _this, "pitch" ); - m_pitchRangeModel.loadSettings( _this, "pitchrange" ); - m_effectChannelModel.loadSettings( _this, "fxch" ); - m_baseNoteModel.loadSettings( _this, "basenote" ); + m_volumeModel.loadSettings( thisElement, "vol" ); + m_panningModel.loadSettings( thisElement, "pan" ); + m_pitchModel.loadSettings( thisElement, "pitch" ); + m_pitchRangeModel.loadSettings( thisElement, "pitchrange" ); + m_effectChannelModel.loadSettings( thisElement, "fxch" ); + m_baseNoteModel.loadSettings( thisElement, "basenote" ); // clear effect-chain just in case we load an old preset without FX-data m_audioPort.effects()->clear(); - QDomNode node = _this.firstChild(); + QDomNode node = thisElement.firstChild(); while( !node.isNull() ) { if( node.isElement() ) @@ -793,11 +792,9 @@ void InstrumentTrack::loadTrackSpecificSettings( const QDomElement & _this ) { delete m_instrument; m_instrument = NULL; - m_instrument = Instrument::instantiate( - node.toElement().attribute( "name" ), - this ); - m_instrument->restoreState( - node.firstChildElement() ); + m_instrument = Instrument::instantiate( node.toElement().attribute( "name" ), this ); + m_instrument->restoreState( node.firstChildElement() ); + emit instrumentChanged(); } } @@ -1326,13 +1323,14 @@ InstrumentTrackWindow::~InstrumentTrackWindow() -void InstrumentTrackWindow::setInstrumentTrackView( InstrumentTrackView * _tv ) +void InstrumentTrackWindow::setInstrumentTrackView( InstrumentTrackView* view ) { - if( m_itv && _tv ) + if( m_itv && view ) { m_itv->m_tlb->setChecked( false ); } - m_itv = _tv; + + m_itv = view; } @@ -1382,28 +1380,27 @@ void InstrumentTrackWindow::modelChanged() void InstrumentTrackWindow::saveSettingsBtnClicked() { - FileDialog sfd( this, tr( "Save preset" ), "", - tr( "XML preset file (*.xpf)" ) ); + FileDialog sfd( this, tr( "Save preset" ), "", tr( "XML preset file (*.xpf)" ) ); - QString preset_root = configManager::inst()->userPresetsDir(); - if( !QDir( preset_root ).exists() ) + QString presetRoot = configManager::inst()->userPresetsDir(); + if( !QDir( presetRoot ).exists() ) { - QDir().mkdir( preset_root ); + QDir().mkdir( presetRoot ); } - if( !QDir( preset_root + m_track->instrumentName() ).exists() ) + if( !QDir( presetRoot + m_track->instrumentName() ).exists() ) { - QDir( preset_root ).mkdir( m_track->instrumentName() ); + QDir( presetRoot ).mkdir( m_track->instrumentName() ); } sfd.setAcceptMode( FileDialog::AcceptSave ); - sfd.setDirectory( preset_root + m_track->instrumentName() ); + sfd.setDirectory( presetRoot + m_track->instrumentName() ); sfd.setFileMode( FileDialog::AnyFile ); - if( sfd.exec () == QDialog::Accepted && - !sfd.selectedFiles().isEmpty() && sfd.selectedFiles()[0] != "" - ) + + if( sfd.exec() == QDialog::Accepted && + !sfd.selectedFiles().isEmpty() && + !sfd.selectedFiles().first().isEmpty() ) { - multimediaProject mmp( - multimediaProject::InstrumentTrackSettings ); + multimediaProject mmp( multimediaProject::InstrumentTrackSettings ); m_track->setSimpleSerializing(); m_track->saveSettings( mmp, mmp.content() ); QString f = sfd.selectedFiles()[0]; @@ -1434,8 +1431,7 @@ void InstrumentTrackWindow::updateInstrumentView() delete m_instrumentView; if( m_track->m_instrument != NULL ) { - m_instrumentView = m_track->m_instrument->createView( - m_tabWidget ); + m_instrumentView = m_track->m_instrument->createView( m_tabWidget ); m_tabWidget->addTab( m_instrumentView, tr( "PLUGIN" ), 0 ); m_tabWidget->setActiveTab( 0 ); @@ -1447,19 +1443,18 @@ void InstrumentTrackWindow::updateInstrumentView() -void InstrumentTrackWindow::textChanged( const QString & _new_name ) +void InstrumentTrackWindow::textChanged( const QString& newName ) { - m_track->setName( _new_name ); + m_track->setName( newName ); engine::getSong()->setModified(); } -void InstrumentTrackWindow::toggleVisibility( bool _on ) +void InstrumentTrackWindow::toggleVisibility( bool on ) { - - if( _on ) + if( on ) { show(); parentWidget()->show(); @@ -1474,9 +1469,10 @@ void InstrumentTrackWindow::toggleVisibility( bool _on ) -void InstrumentTrackWindow::closeEvent( QCloseEvent * _ce ) +void InstrumentTrackWindow::closeEvent( QCloseEvent* event ) { - _ce->ignore(); + event->ignore(); + if( engine::mainWindow()->workspace() ) { parentWidget()->hide(); @@ -1485,6 +1481,7 @@ void InstrumentTrackWindow::closeEvent( QCloseEvent * _ce ) { hide(); } + m_itv->m_tlb->setFocus(); m_itv->m_tlb->setChecked( false ); } @@ -1492,7 +1489,7 @@ void InstrumentTrackWindow::closeEvent( QCloseEvent * _ce ) -void InstrumentTrackWindow::focusInEvent( QFocusEvent * ) +void InstrumentTrackWindow::focusInEvent( QFocusEvent* ) { m_pianoView->setFocus(); } @@ -1500,32 +1497,34 @@ void InstrumentTrackWindow::focusInEvent( QFocusEvent * ) -void InstrumentTrackWindow::dragEnterEventGeneric( QDragEnterEvent * _dee ) +void InstrumentTrackWindow::dragEnterEventGeneric( QDragEnterEvent* event ) { - stringPairDrag::processDragEnterEvent( _dee, "instrument,presetfile," - "pluginpresetfile" ); + stringPairDrag::processDragEnterEvent( event, "instrument,presetfile,pluginpresetfile" ); } -void InstrumentTrackWindow::dragEnterEvent( QDragEnterEvent * _dee ) +void InstrumentTrackWindow::dragEnterEvent( QDragEnterEvent* event ) { - dragEnterEventGeneric( _dee ); + dragEnterEventGeneric( event ); } -void InstrumentTrackWindow::dropEvent( QDropEvent * _de ) +void InstrumentTrackWindow::dropEvent( QDropEvent* event ) { - QString type = stringPairDrag::decodeKey( _de ); - QString value = stringPairDrag::decodeValue( _de ); + QString type = stringPairDrag::decodeKey( event ); + QString value = stringPairDrag::decodeValue( event ); + if( type == "instrument" ) { m_track->loadInstrument( value ); + engine::getSong()->setModified(); - _de->accept(); + + event->accept(); } else if( type == "presetfile" ) { @@ -1533,40 +1532,43 @@ void InstrumentTrackWindow::dropEvent( QDropEvent * _de ) InstrumentTrack::removeMidiPortNode( mmp ); m_track->setSimpleSerializing(); m_track->loadSettings( mmp.content().toElement() ); + engine::getSong()->setModified(); - _de->accept(); + + event->accept(); } else if( type == "pluginpresetfile" ) { const QString ext = fileItem::extension( value ); Instrument * i = m_track->instrument(); + if( !i->descriptor()->supportsFileType( ext ) ) { - i = m_track->loadInstrument( - engine::pluginFileHandling()[ext] ); + i = m_track->loadInstrument( engine::pluginFileHandling()[ext] ); } + i->loadFile( value ); - _de->accept(); + + event->accept(); } } -void InstrumentTrackWindow::saveSettings( QDomDocument & _doc, - QDomElement & _this ) +void InstrumentTrackWindow::saveSettings( QDomDocument& doc, QDomElement & thisElement ) { - _this.setAttribute( "tab", m_tabWidget->activeTab() ); - MainWindow::saveWidgetState( this, _this ); + thisElement.setAttribute( "tab", m_tabWidget->activeTab() ); + MainWindow::saveWidgetState( this, thisElement ); } -void InstrumentTrackWindow::loadSettings( const QDomElement & _this ) +void InstrumentTrackWindow::loadSettings( const QDomElement& thisElement ) { - m_tabWidget->setActiveTab( _this.attribute( "tab" ).toInt() ); - MainWindow::restoreWidgetState( this, _this ); + m_tabWidget->setActiveTab( thisElement.attribute( "tab" ).toInt() ); + MainWindow::restoreWidgetState( this, thisElement ); if( isVisible() ) { m_itv->m_tlb->setChecked( true ); From 725ff59f0edb800d9ab3ef400680cfe2f313f433 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 16:44:54 +0100 Subject: [PATCH 61/80] NotePlayHandle: added property to track origin Using the origin property we can track where a NotePlayHandle instance originates from (Pattern, MIDI, ...) and build new functions around this. --- include/note_play_handle.h | 13 ++++++++++++- src/core/note_play_handle.cpp | 6 ++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/include/note_play_handle.h b/include/note_play_handle.h index 859498b698..9c22eea3be 100644 --- a/include/note_play_handle.h +++ b/include/note_play_handle.h @@ -48,12 +48,22 @@ public: void * m_pluginData; basicFilters<> * m_filter; + // specifies origin of NotePlayHandle + enum Origins + { + OriginPattern, /*! playback of a note from a pattern */ + OriginMidiInput, /*! playback of a MIDI note input event */ + OriginCount + }; + typedef Origins Origin; + notePlayHandle( InstrumentTrack * _instrument_track, const f_cnt_t _offset, const f_cnt_t _frames, const note & _n, notePlayHandle * _parent = NULL, const bool _part_of_arp = false, - int midiEventChannel = -1 ); + int midiEventChannel = -1, + Origin origin = OriginPattern ); virtual ~notePlayHandle(); virtual void setVolume( const volume_t volume = DefaultVolume ); @@ -281,6 +291,7 @@ private: MidiTime m_songGlobalParentOffset; const int m_midiChannel; + const Origin m_origin; } ; diff --git a/src/core/note_play_handle.cpp b/src/core/note_play_handle.cpp index c22d2c645c..96d93c3dee 100644 --- a/src/core/note_play_handle.cpp +++ b/src/core/note_play_handle.cpp @@ -50,7 +50,8 @@ notePlayHandle::notePlayHandle( InstrumentTrack * _it, const note & _n, notePlayHandle *parent, const bool _part_of_arp, - int midiEventChannel ) : + int midiEventChannel, + Origin origin ) : playHandle( NotePlayHandle, _offset ), note( _n.length(), _n.pos(), _n.key(), _n.getVolume(), _n.getPanning(), _n.detuning() ), @@ -76,7 +77,8 @@ notePlayHandle::notePlayHandle( InstrumentTrack * _it, m_unpitchedFrequency( 0 ), m_baseDetuning( NULL ), m_songGlobalParentOffset( 0 ), - m_midiChannel( midiEventChannel >= 0 ? midiEventChannel : instrumentTrack()->midiPort()->realOutputChannel() ) + m_midiChannel( midiEventChannel >= 0 ? midiEventChannel : instrumentTrack()->midiPort()->realOutputChannel() ), + m_origin( origin ) { if( isTopNote() ) { From 4b340f7d5f10297bd3f7198bb86877823fe89ede Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 16:46:12 +0100 Subject: [PATCH 62/80] InstrumentTrack: manage MIDI note recording in NotePlayHandle We must not record notes when receiving external MidiNoteOff events as e.g. the sustain pedal still might be pressed. State tracking for features like these is done inside NotePlayHandle so move the recording- related signal emission from InstrumentTrack to NotePlayHandle. Closes #168. --- include/InstrumentTrack.h | 4 +-- src/core/note_play_handle.cpp | 12 ++++++++ src/gui/piano_roll.cpp | 12 ++------ src/tracks/InstrumentTrack.cpp | 50 +++++++--------------------------- 4 files changed, 27 insertions(+), 51 deletions(-) diff --git a/include/InstrumentTrack.h b/include/InstrumentTrack.h index 4057d7990e..d4ca720c33 100644 --- a/include/InstrumentTrack.h +++ b/include/InstrumentTrack.h @@ -204,8 +204,8 @@ public: signals: void instrumentChanged(); void newNote(); - void noteOn( const note & _n ); - void noteOff( const note & _n ); + void midiNoteOn( const note& ); + void midiNoteOff( const note& ); void nameChanged(); diff --git a/src/core/note_play_handle.cpp b/src/core/note_play_handle.cpp index 96d93c3dee..6a434aea68 100644 --- a/src/core/note_play_handle.cpp +++ b/src/core/note_play_handle.cpp @@ -105,6 +105,11 @@ notePlayHandle::notePlayHandle( InstrumentTrack * _it, setFrames( _frames ); + // inform attached components about new MIDI note (used for recording in Piano Roll) + if( m_origin == OriginMidiInput ) + { + m_instrumentTrack->midiNoteOn( *this ); + } if( !isTopNote() || !instrumentTrack()->isArpeggioEnabled() ) { @@ -122,6 +127,13 @@ notePlayHandle::~notePlayHandle() { noteOff( 0 ); + // inform attached components about MIDI finished (used for recording in Piano Roll) + if( m_origin == OriginMidiInput ) + { + setLength( MidiTime( static_cast( totalFramesPlayed() / engine::framesPerTick() ) ) ); + m_instrumentTrack->midiNoteOff( *this ); + } + if( isTopNote() ) { delete m_baseDetuning; diff --git a/src/gui/piano_roll.cpp b/src/gui/piano_roll.cpp index 6eace8b463..ddd450faa6 100644 --- a/src/gui/piano_roll.cpp +++ b/src/gui/piano_roll.cpp @@ -765,15 +765,9 @@ void pianoRoll::setCurrentPattern( pattern * _new_pattern ) // of start-notes and so on...) resizeEvent( NULL ); - connect( m_pattern->instrumentTrack(), - SIGNAL( noteOn( const note & ) ), - this, SLOT( startRecordNote( const note & ) ) ); - connect( m_pattern->instrumentTrack(), - SIGNAL( noteOff( const note & ) ), - this, SLOT( finishRecordNote( const note & ) ) ); - connect( m_pattern->instrumentTrack()->pianoModel(), - SIGNAL( dataChanged() ), - this, SLOT( update() ) ); + connect( m_pattern->instrumentTrack(), SIGNAL( midiNoteOn( const note& ) ), this, SLOT( startRecordNote( const note& ) ) ); + connect( m_pattern->instrumentTrack(), SIGNAL( midiNoteOff( const note& ) ), this, SLOT( finishRecordNote( const note& ) ) ); + connect( m_pattern->instrumentTrack()->pianoModel(), SIGNAL( dataChanged() ), this, SLOT( update() ) ); setWindowTitle( tr( "Piano-Roll - %1" ).arg( m_pattern->name() ) ); diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index c05a379f14..e7a58834ad 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -237,20 +237,16 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti { if( m_notes[event.key()] == NULL ) { - // create temporary note - note n; - n.setKey( event.key() ); - n.setVolume( event.volume() ); - // create (timed) note-play-handle - notePlayHandle* nph = new notePlayHandle( this, time.frames( engine::framesPerTick() ), typeInfo::max() / 2, - n, NULL, false, event.channel() ); + notePlayHandle* nph = new notePlayHandle( this, time.frames( engine::framesPerTick() ), + typeInfo::max() / 2, + note( MidiTime(), MidiTime(), event.key(), event.volume() ), + NULL, false, event.channel(), + notePlayHandle::OriginMidiInput ); if( engine::mixer()->addPlayHandle( nph ) ) { m_notes[event.key()] = nph; } - - emit noteOn( n ); } eventHandled = true; @@ -258,28 +254,15 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti } case MidiNoteOff: - { - notePlayHandle* nph = m_notes[event.key()]; - if( nph != NULL ) + if( m_notes[event.key()] != NULL ) { - // create dummy-note which has the same length - // as the played note for sending it later - // to all slots connected to signal noteOff() - // this is for example needed by piano-roll for - // recording notes into a pattern - note n( MidiTime( static_cast( nph->totalFramesPlayed() / engine::framesPerTick() ) ), - 0, nph->key(), nph->getVolume(), nph->getPanning() ); - - emit noteOff( n ); - - // now do actual note off and remove internal reference to NotePlayHandle (which itself will + // do actual note off and remove internal reference to NotePlayHandle (which itself will // be deleted later automatically) - nph->noteOff(); + m_notes[event.key()]->noteOff(); m_notes[event.key()] = NULL; } eventHandled = true; break; - } case MidiKeyPressure: if( m_notes[event.key()] != NULL ) @@ -467,24 +450,11 @@ QString InstrumentTrack::instrumentName() const -void InstrumentTrack::deleteNotePluginData( notePlayHandle * _n ) +void InstrumentTrack::deleteNotePluginData( notePlayHandle* n ) { if( m_instrument != NULL ) { - m_instrument->deleteNotePluginData( _n ); - } - - // Notes deleted when keys still pressed - if( m_notes[_n->key()] == _n ) - { - note done_note( MidiTime( static_cast( - _n->totalFramesPlayed() / - engine::framesPerTick() ) ), - 0, _n->key(), - _n->getVolume(), _n->getPanning() ); - _n->noteOff(); - m_notes[_n->key()] = NULL; - emit noteOff( done_note ); + m_instrument->deleteNotePluginData( n ); } } From 09395a2f3ec5102c47fc6811958acdc56835a2f5 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 19:09:11 +0100 Subject: [PATCH 63/80] NotePlayHandle: stop properly when arpeggio is played via MIDI If a note is played via MIDI (e.g. with infinite frame count) and arpeggio is enabled the NotePlayHandle never got deleted as framesLeft() always returned a big value even after release. Closes #169. --- src/core/note_play_handle.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core/note_play_handle.cpp b/src/core/note_play_handle.cpp index 6a434aea68..16ce402fe3 100644 --- a/src/core/note_play_handle.cpp +++ b/src/core/note_play_handle.cpp @@ -305,9 +305,10 @@ void notePlayHandle::play( sampleFrame * _working_buffer ) // can set m_releaseFramesDone to m_releaseFramesToDo so that // notePlayHandle::done() returns true and also this base-note is // removed from mixer's active note vector - if( isArpeggioBaseNote() && m_subNotes.size() == 0 ) + if( m_released && isArpeggioBaseNote() && m_subNotes.size() == 0 ) { m_releaseFramesDone = m_releaseFramesToDo; + m_frames = 0; } // update internal data From db0570b1309a4faceffd6facc5e58eb7df7521c4 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 23:14:59 +0100 Subject: [PATCH 64/80] InstrumentSoundShaping: more sanity checking --- src/core/InstrumentSoundShaping.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core/InstrumentSoundShaping.cpp b/src/core/InstrumentSoundShaping.cpp index 535a0d99d2..16a6f50508 100644 --- a/src/core/InstrumentSoundShaping.cpp +++ b/src/core/InstrumentSoundShaping.cpp @@ -326,7 +326,8 @@ f_cnt_t InstrumentSoundShaping::releaseFrames() const { f_cnt_t ret_val = m_envLfoParameters[Volume]->isUsed() ? m_envLfoParameters[Volume]->releaseFrames() : 0; - if( m_instrumentTrack->instrument()->desiredReleaseFrames() > ret_val ) + if( m_instrumentTrack->instrument() && + m_instrumentTrack->instrument()->desiredReleaseFrames() > ret_val ) { ret_val = m_instrumentTrack->instrument()->desiredReleaseFrames(); } From ef4f9b1b60960dd4fb98c24b12d4e7ea405e4130 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 23:18:59 +0100 Subject: [PATCH 65/80] InstrumentTrack: partly revert ad27039b9bbba2ab1095ddd3c163a20a02956c96 Even though there are probably not many old projects out there, at least old presets didn't load properly anymore as of ad27039b9bbba2ab1095ddd3. Fix this by reintroducing compat code. --- src/tracks/InstrumentTrack.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index e7a58834ad..b7412f19f3 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -767,6 +767,22 @@ void InstrumentTrack::loadTrackSpecificSettings( const QDomElement & thisElement emit instrumentChanged(); } + // compat code - if node-name doesn't match any known + // one, we assume that it is an instrument-plugin + // which we'll try to load + else if( AutomationPattern::classNodeName() != node.nodeName() && + ControllerConnection::classNodeName() != node.nodeName() && + !node.toElement().hasAttribute( "id" ) ) + { + delete m_instrument; + m_instrument = NULL; + m_instrument = Instrument::instantiate( node.nodeName(), this ); + if( m_instrument->nodeName() == node.nodeName() ) + { + m_instrument->restoreState( node.toElement() ); + } + emit instrumentChanged(); + } } node = node.nextSibling(); } From e68f88b6980b22d19a75e0a950e77dde9c632a08 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 23:44:36 +0100 Subject: [PATCH 66/80] Export PresetPreviewPlayHandle class The PresetPreviewPlayHandle is referenced by the PeakController plugin now and therefore needs to be exported. --- include/preset_preview_play_handle.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/preset_preview_play_handle.h b/include/preset_preview_play_handle.h index e5185cfbe8..abef2c78ba 100644 --- a/include/preset_preview_play_handle.h +++ b/include/preset_preview_play_handle.h @@ -2,7 +2,7 @@ * preset_preview_play_handle.h - play-handle for playing a short preview-sound * of a preset or a file processed by a plugin * - * Copyright (c) 2005-2008 Tobias Doerffel + * Copyright (c) 2005-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -34,7 +34,7 @@ class InstrumentTrack; class previewTrackContainer; -class presetPreviewPlayHandle : public playHandle +class EXPORT presetPreviewPlayHandle : public playHandle { public: presetPreviewPlayHandle( const QString & _preset_file, From 84f57b776dceec21763dd180ca258ebe86c741ac Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 23:45:09 +0100 Subject: [PATCH 67/80] ZynAddSubFX: fixed compiler warning on Win32 --- plugins/zynaddsubfx/src/Seq/Sequencer.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plugins/zynaddsubfx/src/Seq/Sequencer.cpp b/plugins/zynaddsubfx/src/Seq/Sequencer.cpp index 6dfde4679b..c11e68a7c9 100644 --- a/plugins/zynaddsubfx/src/Seq/Sequencer.cpp +++ b/plugins/zynaddsubfx/src/Seq/Sequencer.cpp @@ -157,10 +157,9 @@ void Sequencer::resettime(timestruct *t) t->abs = 0.0; t->rel = 0.0; - timeval tval; - t->last = 0.0; #ifndef OS_WINDOWS + timeval tval; if(gettimeofday(&tval, NULL) == 0) t->last = tval.tv_sec + tval.tv_usec * 0.000001; #endif @@ -168,9 +167,9 @@ void Sequencer::resettime(timestruct *t) void Sequencer::updatecounter(timestruct *t) { - timeval tval; double current = 0.0; #ifndef OS_WINDOWS + timeval tval; if(gettimeofday(&tval, NULL) == 0) current = tval.tv_sec + tval.tv_usec * 0.000001; #endif From d5113d0059943dde0d2478b97faddacf7853b88a Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 23:45:29 +0100 Subject: [PATCH 68/80] MidiWinMM: fixed MidiPort API calls --- src/core/midi/MidiWinMM.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core/midi/MidiWinMM.cpp b/src/core/midi/MidiWinMM.cpp index a4f52b9144..799d7f5df1 100644 --- a/src/core/midi/MidiWinMM.cpp +++ b/src/core/midi/MidiWinMM.cpp @@ -92,7 +92,7 @@ void MidiWinMM::applyPortMode( MidiPort* port ) { // make sure no subscriptions exist which are not possible with // current port-mode - if( !port->inputEnabled() ) + if( !port->isInputEnabled() ) { for( SubMap::Iterator it = m_inputSubs.begin(); it != m_inputSubs.end(); ++it ) { @@ -100,7 +100,7 @@ void MidiWinMM::applyPortMode( MidiPort* port ) } } - if( !port->outputEnabled() ) + if( !port->isOutputEnabled() ) { for( SubMap::Iterator it = m_outputSubs.begin(); it != m_outputSubs.end(); ++it ) { @@ -145,7 +145,7 @@ QString MidiWinMM::sourcePortName( const MidiEvent& event ) const void MidiWinMM::subscribeReadablePort( MidiPort* port, const QString& dest, bool subscribe ) { - if( subscribe && port->inputEnabled() == false ) + if( subscribe && port->isInputEnabled() == false ) { qWarning( "port %s can't be (un)subscribed!\n", port->displayName().toAscii().constData() ); return; @@ -163,7 +163,7 @@ void MidiWinMM::subscribeReadablePort( MidiPort* port, const QString& dest, bool void MidiWinMM::subscribeWritablePort( MidiPort* port, const QString& dest, bool subscribe ) { - if( subscribe && port->outputEnabled() == false ) + if( subscribe && port->isOutputEnabled() == false ) { qWarning( "port %s can't be (un)subscribed!\n", port->displayName().toAscii().constData() ); return; From ea5f5c4f00eee047c09fe3643d765d376adcc267 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sun, 26 Jan 2014 23:45:49 +0100 Subject: [PATCH 69/80] Papu: fixed out-of-bounds array access due to too small data types Build failed on Win32 with GCC 4.8. --- plugins/papu/gb_apu/Gb_Apu.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/papu/gb_apu/Gb_Apu.h b/plugins/papu/gb_apu/Gb_Apu.h index e2f940b94e..e41bdc2c2e 100644 --- a/plugins/papu/gb_apu/Gb_Apu.h +++ b/plugins/papu/gb_apu/Gb_Apu.h @@ -6,8 +6,8 @@ #ifndef GB_APU_H #define GB_APU_H -typedef long gb_time_t; // clock cycle count -typedef unsigned gb_addr_t; // 16-bit address +typedef int gb_time_t; // clock cycle count +typedef int gb_addr_t; // 16-bit address #include "Gb_Oscs.h" From 62172011848f272ead878ca9ed0a3cb5cb6804fd Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 27 Jan 2014 00:08:36 +0100 Subject: [PATCH 70/80] Added initial versions of new logo --- data/lmms.ico | Bin 132711 -> 368926 bytes data/nsis_branding.bmp | Bin 34254 -> 25886 bytes data/themes/default/icon.png | Bin 6417 -> 21706 bytes src/gui/about_dialog.cpp | 2 +- 4 files changed, 1 insertion(+), 1 deletion(-) diff --git a/data/lmms.ico b/data/lmms.ico index 1b4c1d3702d0229b52bd84a9ccfb9cc6e248f798..507c1099efab21fe57d096e2a710edb948a24a6f 100644 GIT binary patch literal 368926 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 literal 132711 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�$yhSX8PW?|c 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