Compare commits

...

90 Commits

Author SHA1 Message Date
Tres Finocchiaro
9e3f344c70 Bump version for stable-1.1 patch release 2015-02-10 10:19:05 -05:00
Vesa V
aea84602b2 Merge pull request #1747 from Fastigium/lockless-1.1
1.1-based RT-safe fix for race condition causing #1662
2015-02-08 10:24:54 +02:00
Fastigium
d64e93b41a RT-safe fix for race condition causing #1662 2015-02-07 15:21:01 +01:00
Tobias Doerffel
ffe7e8b8fa Travis: updated name of PPA with MinGW-X packages for Precise 2015-01-22 22:24:23 +01:00
Tres Finocchiaro
ee25db797d Merge pull request #1656 from curlymorphic/111649
Proposed fix for 1649 for stable-1.1
2015-01-19 09:15:19 -05:00
Dave French
1ba3088554 Proposed fix for 1649 for stable-1.1 2015-01-19 14:04:57 +00:00
Tres Finocchiaro
c5773c41b0 Merge pull request #1639 from DanWin/stable-1.1
Fix calcSlope1 was not declared errors
2015-01-15 16:59:24 -05:00
Daniel Winzen
d8e552de80 Fix calcSlope1 was not declared errors 2015-01-15 22:15:04 +01:00
Tres Finocchiaro
523e5d048b Bump version for stable-1.1 patch release 2015-01-15 15:32:55 -05:00
Vesa
e33645f9ab Fix monstro slopes 2015-01-15 17:17:33 +02:00
Vesa V
24f869c379 Merge pull request #1599 from curlymorphic/i1526
Proposed fix 1526 Watsyn shows wrong Osc
2015-01-12 21:20:40 +02:00
Vesa V
1abb37529d Merge pull request #1601 from curlymorphic/i1492
Proposed fix 1492 Nescaline crash when playing very high note
2015-01-12 21:04:58 +02:00
Dave French
49b3f36a57 1492 fixed type on line 313 2015-01-11 21:23:30 +00:00
Dave French
a1dce66ca8 Proposed fix 1492 Nescaline crash when playing very high note 2015-01-11 21:10:32 +00:00
Dave French
ffde891cfb Proposed fix 1526 Watsyn shows wrong Osc 2015-01-11 20:15:30 +00:00
Vesa V
5fdc452476 Merge pull request #1542 from DanWin/export
Fix export for some locales
2015-01-04 17:05:14 +02:00
Daniel Winzen
44f72b0f13 Added const 2015-01-02 14:21:39 +01:00
Daniel Winzen
93b6888394 Fix export for some locales 2015-01-02 13:08:11 +01:00
Vesa V
e503875a28 Merge pull request #1469 from DanWin/mem
Fix various memory leaks
2014-12-26 19:39:43 +02:00
Daniel Winzen
5bf095b6b9 Revert Zynaddsubfx changes 2014-12-24 20:08:14 +01:00
Vesa
62df768896 Autoquit improvement: On effect plugins where it's possible for the FX to silence the output, measure the levels of the input signal for autoquit
This so that the effect won't be turned off when there's input that the effect is muting (eg. when you use the Amplifier to temporarily mute a signal)
2014-12-24 19:53:05 +02:00
Tres Finocchiaro
58d864a630 Merge pull request #1491 from curlymorphic/i929n2
Proposed fix for 929 AFP wave display
2014-12-24 08:59:27 -05:00
Dave French
b5538c7da8 used newWaveView in constructor, to remove redundancy 2014-12-23 22:26:36 +00:00
Tres Finocchiaro
122b845105 Bump version for stable-1.1 2014-12-23 12:48:41 -05:00
Dave French
76a1b8c2b6 Proposed fix for 929 AFP wave display 2014-12-23 16:29:04 +00:00
Dave
ee39cbe94d Merge pull request #16 from LMMS/stable-1.1
Stable 1.1
2014-12-23 16:15:28 +00:00
Vesa V
af66303fc4 Merge pull request #1485 from curlymorphic/delay-1.1
Delay effect   Clear buffer on load, correct use of interpolation, reformat
2014-12-23 11:31:41 +02:00
Dave French
6aae0e6897 change as of issue 1474 2014-12-23 09:17:16 +00:00
Tres Finocchiaro
ef7d3ff328 Merge pull request #1479 from DanWin/title
reset window title every time we change the state of a subwindow to show...
2014-12-22 16:17:32 -05:00
Dave French
a0d07db8f1 Delay Clear buffer on load, correct use of interpolation, reformat 2014-12-22 19:29:41 +00:00
Daniel Winzen
36d02b9887 Fix memory leaks in Audio setup tab in the settings dialog 2014-12-22 11:42:35 +01:00
Lukas W
25ab7260f5 Merge pull request #1461 from DanWin/stable-1.1
German translation update
2014-12-22 11:53:45 +02:00
Dave French
5172acb1e3 Proposed fix for 1049 VST knobs won't remember settings 2014-12-21 23:34:08 -05:00
Daniel Winzen
2ee8f1445c reset window title every time we change the state of a subwindow to show the correct title
When maximizing a subwindow it remembers the title the mainwindow had before and resets it after unmaximizing/closing.
As the title might have changed due to a project switch, we have to reset the title again as it would else show an incorrect/old title.
2014-12-21 10:18:55 +01:00
Daniel Winzen
e0f7ea57ac Check if object already exists instead of deleting and recreating it 2014-12-20 16:30:28 +01:00
Daniel Winzen
0a732fbc04 Fix mismatched free() / delete / delete [] in RmsHelper.h 2014-12-20 09:07:21 +01:00
Daniel Winzen
b59a50133a Fix memory leaks in ZynAddSubFX 2014-12-19 21:35:43 +01:00
Daniel Winzen
ddbb180800 Fix memory leaks in LADSPA plugins 2014-12-19 21:33:49 +01:00
Daniel Winzen
f7741f184f German translation update 2014-12-18 20:58:12 +01:00
Vesa V
3ad6d6ca7a Merge pull request #1459 from DanWin/stable-1.1
More memory fixes
2014-12-18 04:02:59 +02:00
Daniel Winzen
0891c53582 More memory fixes
This fixes memory leaks in ZASF and Controller. It also sets an uninitalised variable in audio_file_processor.
2014-12-17 21:01:26 +01:00
Tres Finocchiaro
3c5d940561 Fix ifdef typo leftover from clang fix 2014-12-17 14:20:58 -05:00
tresf
448b783e8b Fix compilation on Xcode 4.6 2014-12-17 13:43:14 -05:00
Tres Finocchiaro
85da25fe2a better naming consistency with windows builds
i.e. `LMMS 1.1.0.dmg` will now be `lmms-1.1.0-mac10.7.dmg`
2014-12-17 12:59:36 -05:00
Vesa V
de56c989e9 Merge pull request #1454 from DanWin/stable-1.1
Remove RackView widget before deleting the ChannelView (Rebase for stable-1.1 of #1448 )
2014-12-17 00:48:47 +02:00
Daniel Winzen
d21f0a7114 Remove RackView widget before deleting the ChannelView
Fixes the following two errors I spotted using valgrind:
When deleting a channel;
==936== Invalid read of size 8
==936==    at 0x56FA1D: FxMixerView::deleteChannel(int) (FxMixerView.cpp:374)
==936==    by 0x60E9A79: QMetaObject::activate(QObject*, QMetaObject const*, int, void**) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.6)
==936==    by 0x5216BF1: QAction::triggered(bool) (in /usr/lib/x86_64-linux-gnu/libQtGui.so.4.8.6)
==936==    by 0x52185C2: QAction::activate(QAction::ActionEvent) (in /usr/lib/x86_64-linux-gnu/libQtGui.so.4.8.6)
==936==  Address 0x14d51b90 is 32 bytes inside a block of size 40 free'd
==936==    at 0x4C2C2E0: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==936==    by 0x56F9ED: FxMixerView::deleteChannel(int) (FxMixerView.cpp:370)
==936==    by 0x60E9A79: QMetaObject::activate(QObject*, QMetaObject const*, int, void**) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.6)
==936==    by 0x5216BF1: QAction::triggered(bool) (in /usr/lib/x86_64-linux-gnu/libQtGui.so.4.8.6)

When loading a new project after adding some channels:
==936== Invalid read of size 8
==936==    at 0x570785: FxMixerView::refreshDisplay() (FxMixerView.cpp:202)
==936==    by 0x4B590E: Song::clearProject() (Song.cpp:740)
==936==    by 0x4B7885: Song::createNewProject() (Song.cpp:817)
==936==    by 0x60E9A79: QMetaObject::activate(QObject*, QMetaObject const*, int, void**) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.6)
==936==  Address 0x56a12ab0 is 32 bytes inside a block of size 40 free'd
==936==    at 0x4C2C2E0: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==936==    by 0x57075B: FxMixerView::refreshDisplay() (FxMixerView.cpp:201)
==936==    by 0x4B590E: Song::clearProject() (Song.cpp:740)
==936==    by 0x4B7885: Song::createNewProject() (Song.cpp:817)
2014-12-16 22:46:37 +01:00
Vesa V
347b5a121d Update papu_instrument.cpp 2014-12-16 23:02:00 +02:00
Vesa V
da6fd6ef5c Update opl2instrument.cpp 2014-12-16 23:00:14 +02:00
Tres Finocchiaro
ed0dc6770d Merge pull request #1453 from falkTX/stable-1.1
Fix for updated Carla API, and fix build on old linux systems
2014-12-16 15:49:01 -05:00
Tres Finocchiaro
f65ec07603 Bump version 2014-12-16 15:32:20 -05:00
falkTX
f2ab783db9 Fix build when using old linux systems 2014-12-16 19:40:31 +00:00
falkTX
91063ab7d2 Update Carla plugin to latest API 2014-12-16 19:40:02 +00:00
Tres Finocchiaro
b789eb9a69 Merge pull request #1449 from curlymorphic/I1432
Proposed fix for issue 1432 LB302 preset preview audio cut-off
2014-12-16 12:30:03 -05:00
Tres Finocchiaro
569c83101a Merge pull request #1451 from curlymorphic/i1450
Proposed fix for 1450 Mem leak in sample-track
2014-12-16 12:23:39 -05:00
Dave French
8b2ce06da8 Proposed fix for 1450 Mem leak in sample-track 2014-12-16 16:41:08 +00:00
Dave French
8d3637e754 Proposed fix for #1411 Crash on LB302 preset preview . 2014-12-16 16:51:06 +01:00
Tres Finocchiaro
c6a22747da Merge pull request #1433 from Sti2nd/stable-1.1
New SnareMarch preset and updated KickPower

No objections after a week, merging. -Tres
2014-12-16 10:48:42 -05:00
Dave French
f27ea7bc2b Proposed fix for #1432 LB302 preset preview audio cut-off 2014-12-15 21:40:58 +00:00
Dave
2aa7b64938 Merge pull request #7 from LMMS/stable-1.1
merge LMMS/lmms
2014-12-15 16:37:53 +00:00
Tres Finocchiaro
e6ae2be65a Bump DualFilter high cutoff to 20k
Closes #1395.
2014-12-13 12:19:20 -05:00
Tres Finocchiaro
a182a3e8cc Fix scroll bar gap
Closes #1437
2014-12-13 12:11:31 -05:00
Tres Finocchiaro
90bb470642 Merge pull request #1442 from tresf/stable-1.1
Check major/minor version before setting theme directory
2014-12-13 08:46:06 -08:00
tresf
a8924a34dd Check major/minor version before setting theme directory 2014-12-13 11:27:14 -05:00
Vesa V
73cad09968 Update FxMixer.cpp
prevent double adding of jobs
2014-12-13 13:05:50 +02:00
Stian Jørgensrud
60ad2c8aa0 New SnareMarch preset and updated KickPower
The snare sounds like it would be used for marching. If you can make it
brighter without making it sound funny, please do...

The kick was too dark for general purpose. Shortened it, raised it in
the frequency range and added more noise.
2014-12-11 00:24:52 +01:00
Vesa
4a6257a47c Fix master channel peak display
Fix #1427

Conflicts:

	src/core/FxMixer.cpp
	src/gui/FxMixerView.cpp
2014-12-10 01:33:49 +02:00
Vesa V
891ab058eb Merge pull request #1425 from tresf/stable-1.1
Cleanup fmaf() usage, move to lmms_math.h
2014-12-09 17:27:07 +02:00
Tres Finocchiaro
bbe337bd03 Use correct FMA_ macros 2014-12-09 08:28:00 -05:00
Tres Finocchiaro
7431e77229 More fmal() fixes 2014-12-08 14:42:19 -05:00
Tres Finocchiaro
5a0dfdd3c0 minor fmaf() formatting fix. 2014-12-08 12:45:31 -05:00
Tres Finocchiaro
76d766fe25 fmaf() code cleanup, typos 2014-12-08 12:30:16 -05:00
Tres Finocchiaro
591acbf732 fastFmaf() formatting fixes 2014-12-08 12:22:33 -05:00
Tres Finocchiaro
56d0910533 Cleanup fmaf() usage, move to lmms_math.h 2014-12-08 12:20:47 -05:00
Tres Finocchiaro
6e01e8d4e0 Merge pull request #1424 from tresf/stable-1.1
Fix compilation on Apple/Clang (ambiguous fmaf())
2014-12-08 06:09:33 -08:00
Vesa
2e8534955b Fix FX mixer race condition
Conflicts:

	src/core/FxMixer.cpp
2014-12-07 22:34:37 +02:00
Vesa V
82cd1ca65d Merge pull request #1415 from curlymorphic/Delay
Delay, added s postfix to knob values where applicable.
2014-12-07 00:38:21 +02:00
dave
decac20298 Replaced whitespace in knob definitions, for consistancy 2014-12-06 19:47:39 +00:00
dave
4a2a60255c Added postfix "s" to knobs where relevant, cleaned up unintentional white space 2014-12-06 18:34:24 +00:00
dave
cefee3a721 added s postfix to knob values where applicable. 2014-12-06 18:28:19 +00:00
Vesa V
97a8705811 Merge pull request #1380 from softrabbit/journalling-killswitch
Master kill switch for journalling, useful when closing program.
2014-12-06 11:41:16 +02:00
Vesa V
074eada27f Merge pull request #1392 from curlymorphic/Delay
Delay Plugin, Changed default delay time to 0.5 seconds from 2.0.
2014-12-06 11:40:16 +02:00
Tres Finocchiaro
951663ec3d Merge pull request #1402 from mikobuntu/origin/stable-1.1
Added TR909-RimShot preset to Kicker Instrument. ( also reverted an old change i had made to zyn-globals.h )
2014-12-05 00:31:19 -05:00
mikobuntu
8c0ab4dfec Fixed naming of Kicker preset (RimShot to TR909-RimShot) 2014-12-04 20:55:39 +00:00
mikobuntu
762b667b47 Added TR909-RimShot preset to Kicker
:///home/mikobuntu/lmms/presets/Kicker/RimShot4.xpf
2014-12-04 19:56:54 +00:00
mikobuntu
fc6374a07b reverted changes to globals.h 2014-12-04 19:49:40 +00:00
dave
e7e8e79630 Changed default delay time to 0.5 seconds from 2.0. 2014-12-04 02:39:26 +00:00
Raine M. Ekman
c3c5501396 Master kill switch for journalling, useful when closing program. 2014-12-01 21:28:29 +02:00
Tres Finocchiaro
4e5d4b95a0 Typo, add missing "else" 2014-11-07 12:39:00 -08:00
Tres Finocchiaro
2a6d6c2a7e Fix Apple/Clang compilation for fmaf() 2014-11-07 12:23:39 -08:00
mikobuntu
9635232b45 Update globals.h 2014-07-17 20:10:25 +01:00
72 changed files with 838 additions and 372 deletions

View File

@@ -5,7 +5,7 @@ env:
- TARGET_OS=win32
- TARGET_OS=win64
before_install:
- if [ $TARGET_OS != linux ]; then sudo add-apt-repository ppa:tobydox/mingw -y; fi
- if [ $TARGET_OS != linux ]; then sudo add-apt-repository ppa:tobydox/mingw-x-precise -y; fi
- sudo apt-get update -qq
install:
- if [ $TARGET_OS != linux ]; then sudo apt-get install -y nsis cloog-isl libmpc2 mingw32; fi

View File

@@ -14,8 +14,8 @@ INCLUDE(CheckIncludeFiles)
INCLUDE(FindPkgConfig)
SET(VERSION_MAJOR "1")
SET(VERSION_MINOR "0")
SET(VERSION_PATCH "99")
SET(VERSION_MINOR "1")
SET(VERSION_PATCH "2")
#SET(VERSION_SUFFIX "")
SET(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
IF(VERSION_SUFFIX)

Binary file not shown.

View File

@@ -654,6 +654,63 @@ Wenn Sie daran interessiert sind LMMS in eine andere Sprache zu übersetzen oder
<translation>Plugin entfe&amp;rnen</translation>
</message>
</context>
<context>
<name>DelayControls</name>
<message>
<source>Delay Samples</source>
<translation>Samples verzögern</translation>
</message>
<message>
<source>Feedback</source>
<translation>Rückkopplung</translation>
</message>
<message>
<source>Lfo Frequency</source>
<translation>LFO-Frequenz</translation>
</message>
<message>
<source>Lfo Amount</source>
<translation>LFO-Stärke</translation>
</message>
</context>
<context>
<name>DelayControlsDialog</name>
<message>
<source>Delay</source>
<translation>Verzögerung</translation>
</message>
<message>
<source>Delay Time</source>
<translation>Verzögerungszeit</translation>
</message>
<message>
<source>Regen</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Feedback Amount</source>
<translation>Rückkopplungsstärke</translation>
</message>
<message>
<source>Rate</source>
<translation>Rate</translation>
</message>
<message>
<source>Lfo</source>
<translation>LFO</translation>
</message>
<message>
<source>Lfo Amt</source>
<translation>LFO-Stärke</translation>
</message>
</context>
<context>
<name>DetuningHelper</name>
<message>
<source>Note detuning</source>
<translation>Noten-Verstimmung</translation>
</message>
</context>
<context>
<name>DualFilterControlDialog</name>
<message>
@@ -780,6 +837,13 @@ Wenn Sie daran interessiert sind LMMS in eine andere Sprache zu übersetzen oder
<translation>Vokalformant-Filter</translation>
</message>
</context>
<context>
<name>DummyEffect</name>
<message>
<source>NOT FOUND</source>
<translation>NICHT GEFUNDEN</translation>
</message>
</context>
<context>
<name>Effect</name>
<message>
@@ -3294,7 +3358,7 @@ Bitte besuchen Sie http://lmms.sf.net/wiki für Dokumentationen über LMMS.</tra
</message>
<message>
<source>Bandlimited Ramp wave</source>
<translation type="unfinished"></translation>
<translation>Bandbegrenzte Sägezahnwelle</translation>
</message>
<message>
<source>Bandlimited Square wave</source>
@@ -3330,7 +3394,7 @@ Bitte besuchen Sie http://lmms.sf.net/wiki für Dokumentationen über LMMS.</tra
</message>
<message>
<source>Digital Ramp wave</source>
<translation type="unfinished"></translation>
<translation>Digitale Sägezahnwelle</translation>
</message>
<message>
<source>Digital Square wave</source>
@@ -3350,7 +3414,7 @@ Bitte besuchen Sie http://lmms.sf.net/wiki für Dokumentationen über LMMS.</tra
</message>
<message>
<source>Ramp wave</source>
<translation type="unfinished"></translation>
<translation>Sägezahnwelle</translation>
</message>
<message>
<source>Square wave</source>
@@ -4085,6 +4149,21 @@ Grund: »%2«</translation>
<translation>LMMS Plugin %1 hat keinen Plugin-Deskriptor namens %2!</translation>
</message>
</context>
<context>
<name>PluginBrowser</name>
<message>
<source>Instrument plugins</source>
<translation>Instrument-Plugins</translation>
</message>
<message>
<source>Instrument browser</source>
<translation>Instrument-Browser</translation>
</message>
<message>
<source>Drag an instrument into either the Song-Editor, the Beat+Bassline Editor or into an existing instrument track.</source>
<translation>Ziehen Sie ein Instrument entweder in den Song-Editor, den Beat+Bassline-Editor oder in eine existierende Instrumentspur.</translation>
</message>
</context>
<context>
<name>ProjectRenderer</name>
<message>
@@ -6990,10 +7069,6 @@ Doppelklicken auf eines der Plugins zeigt Informaitonen über die Ports an.</tra
</context>
<context>
<name>pluginBrowser</name>
<message>
<source>Instrument plugins</source>
<translation>Instrument-Plugins</translation>
</message>
<message>
<source>VST-host for using VST(i)-plugins within LMMS</source>
<translation>VST-Host zum Benutzen von VST(i)-Plugins innerhalb von LMMS</translation>
@@ -7056,14 +7131,6 @@ This chip was used in the Commodore 64 computer.</source>
<translation>Emulation des MOS6581 und MOS8580 SID Chips.
Dieser Chip wurde in Commodore 64 Computern genutzt.</translation>
</message>
<message>
<source>Instrument browser</source>
<translation>Instrument-Browser</translation>
</message>
<message>
<source>Drag an instrument into either the Song-Editor, the Beat+Bassline Editor or into an existing instrument track.</source>
<translation>Ziehen Sie ein Instrument entweder in den Song-Editor, den Beat+Bassline-Editor oder in eine existierende Instrumentspur.</translation>
</message>
<message>
<source>Player for SoundFont files</source>
<translation>Wiedergabe von SoundFont-Dateien</translation>
@@ -7148,6 +7215,10 @@ Dieser Chip wurde in Commodore 64 Computern genutzt.</translation>
<source>Carla Patchbay Instrument</source>
<translation>Carla Patchbay Instrument</translation>
</message>
<message>
<source>A native delay plugin</source>
<translation>Ein natives Verzögerung-Plugin</translation>
</message>
</context>
<context>
<name>projectNotes</name>
@@ -7476,6 +7547,57 @@ Latenz: %2 ms</translation>
<translation>Wiedergabe-Courser im AudioFileProcessor anzeigen</translation>
</message>
</context>
<context>
<name>setupWidget</name>
<message>
<source>OSS (Open Sound System)</source>
<translation>OSS (Open Sound System)</translation>
</message>
<message>
<source>SDL (Simple DirectMedia Layer)</source>
<translation>SDL (Simple DirectMedia Layer)</translation>
</message>
<message>
<source>ALSA-Sequencer (Advanced Linux Sound Architecture)</source>
<translation>ALSA-Sequencer (Advanced Linux Sound Architecture)</translation>
</message>
<message>
<source>JACK (JACK Audio Connection Kit)</source>
<translation>JACK (JACK Audio Connection Kit)</translation>
</message>
<message>
<source>ALSA Raw-MIDI (Advanced Linux Sound Architecture)</source>
<translation>ALSA Raw-MIDI (Advanced Linux Sound Architecture)</translation>
</message>
<message>
<source>PulseAudio (bad latency!)</source>
<translation>PulseAudio (Schlechte Latenz!)</translation>
</message>
<message>
<source>Dummy (no sound output)</source>
<translation>Dummy (Keine Soundausgabe)</translation>
</message>
<message>
<source>Dummy (no MIDI support)</source>
<translation>Dummy (Keine MIDI-Unterstützung)</translation>
</message>
<message>
<source>WinMM MIDI</source>
<translation>WinMM MIDI</translation>
</message>
<message>
<source>OSS Raw-MIDI (Open Sound System)</source>
<translation>OSS Raw-MIDI (Open Sound System)</translation>
</message>
<message>
<source>ALSA (Advanced Linux Sound Architecture)</source>
<translation>ALSA (Advanced Linux Sound Architecture)</translation>
</message>
<message>
<source>PortAudio</source>
<translation>PortAudio</translation>
</message>
</context>
<context>
<name>sf2Instrument</name>
<message>
@@ -7902,6 +8024,13 @@ Latenz: %2 ms</translation>
<translation>Rechts-nach-rechts</translation>
</message>
</context>
<context>
<name>tabWidget</name>
<message>
<source>Settings for %1</source>
<translation>Einstellungen für %1</translation>
</message>
</context>
<context>
<name>timeLine</name>
<message>

View File

@@ -1,20 +1,20 @@
<?xml version="1.0"?>
<!DOCTYPE lmms-project>
<lmms-project version="1.0" creator="LMMS" creatorversion="1.0.98" type="instrumenttracksettings">
<lmms-project version="1.0" creator="LMMS" creatorversion="1.0.99" type="instrumenttracksettings">
<head/>
<instrumenttracksettings muted="0" type="0" name="Kick power" solo="0">
<instrumenttrack pan="0" fxch="0" scale_type="linear" pitchrange="1" pitch="0" basenote="57" vol="100">
<instrumenttrack pan="0" fxch="0" pitchrange="1" pitch="0" basenote="57" vol="100">
<instrument name="kicker">
<kicker decay_numerator="4" decay_denominator="4" distend="0.8" click="0.25" endnote="0" version="1" decay="594" syncmode="0" noise="0" slope="0.33" dist="1.2" env="0.163" scale_type="linear" startnote="0" startfreq="130" endfreq="5" gain="1"/>
<kicker decay_numerator="4" decay_denominator="4" distend="0.8" click="0.25" endnote="0" version="1" decay="360" syncmode="0" noise="0.2" slope="0.372" dist="1.2" env="0.163" startnote="0" startfreq="145" endfreq="30" gain="1"/>
</instrument>
<eldata scale_type="linear" fres="0.5" ftype="0" fcut="14000" fwet="0">
<elvol lspd_denominator="4" sustain="0.5" pdel="0" userwavefile="" dec="0.5" lamt="0" syncmode="0" latt="0" rel="0.1" amt="0" x100="0" att="0" lpdel="0" hold="0.5" lshp="0" lspd="0.1" ctlenvamt="0" lspd_numerator="4" scale_type="linear"/>
<elcut lspd_denominator="4" sustain="0.5" pdel="0" userwavefile="" dec="0.5" lamt="0" syncmode="0" latt="0" rel="0.1" amt="0" x100="0" att="0" lpdel="0" hold="0.5" lshp="0" lspd="0.1" ctlenvamt="0" lspd_numerator="4" scale_type="linear"/>
<elres lspd_denominator="4" sustain="0.5" pdel="0" userwavefile="" dec="0.5" lamt="0" syncmode="0" latt="0" rel="0.1" amt="0" x100="0" att="0" lpdel="0" hold="0.5" lshp="0" lspd="0.1" ctlenvamt="0" lspd_numerator="4" scale_type="linear"/>
<eldata fres="0.5" ftype="0" fcut="14000" fwet="0">
<elvol lspd_denominator="4" sustain="0.5" pdel="0" userwavefile="" dec="0.5" lamt="0" syncmode="0" latt="0" rel="0.1" amt="0" x100="0" att="0" lpdel="0" hold="0.5" lshp="0" lspd="0.1" ctlenvamt="0" lspd_numerator="4"/>
<elcut lspd_denominator="4" sustain="0.5" pdel="0" userwavefile="" dec="0.5" lamt="0" syncmode="0" latt="0" rel="0.1" amt="0" x100="0" att="0" lpdel="0" hold="0.5" lshp="0" lspd="0.1" ctlenvamt="0" lspd_numerator="4"/>
<elres lspd_denominator="4" sustain="0.5" pdel="0" userwavefile="" dec="0.5" lamt="0" syncmode="0" latt="0" rel="0.1" amt="0" x100="0" att="0" lpdel="0" hold="0.5" lshp="0" lspd="0.1" ctlenvamt="0" lspd_numerator="4"/>
</eldata>
<chordcreator chord="0" scale_type="linear" chordrange="1" chord-enabled="0"/>
<arpeggiator arptime="100" arprange="1" arptime_denominator="4" syncmode="0" arpmode="0" scale_type="linear" arp-enabled="0" arp="0" arptime_numerator="4" arpdir="0" arpgate="100"/>
<midiport inputcontroller="0" fixedoutputvelocity="-1" inputchannel="0" scale_type="linear" outputcontroller="0" writable="0" outputchannel="1" fixedinputvelocity="-1" fixedoutputnote="-1" outputprogram="1" basevelocity="63" readable="0"/>
<chordcreator chord="0" chordrange="1" chord-enabled="0"/>
<arpeggiator arptime="100" arprange="1" arptime_denominator="4" syncmode="0" arpmode="0" arp-enabled="0" arp="0" arptime_numerator="4" arpdir="0" arpgate="100"/>
<midiport inputcontroller="0" fixedoutputvelocity="-1" inputchannel="0" outputcontroller="0" writable="0" outputchannel="1" fixedinputvelocity="-1" fixedoutputnote="-1" outputprogram="1" basevelocity="63" readable="0"/>
<fxchain numofeffects="0" enabled="0"/>
</instrumenttrack>
</instrumenttracksettings>

View File

@@ -0,0 +1,161 @@
<?xml version="1.0"?>
<!DOCTYPE lmms-project>
<lmms-project version="1.0" creator="LMMS" creatorversion="1.0.99" type="instrumenttracksettings">
<head/>
<instrumenttracksettings muted="0" type="0" name="Snare March" solo="0">
<instrumenttrack pan="0" fxch="0" pitchrange="1" pitch="0" basenote="57" vol="100">
<instrument name="kicker">
<kicker decay_numerator="4" decay_denominator="4" distend="0" click="1" endnote="0" version="1" decay="240" syncmode="0" noise="0.85" slope="1" dist="0" env="0.644" startnote="0" startfreq="229" endfreq="195" gain="1"/>
</instrument>
<eldata fres="0.56" ftype="3" fcut="929" fwet="1">
<elvol lspd_denominator="4" sustain="0.294" pdel="0" userwavefile="" dec="0.453" lamt="0" syncmode="0" latt="0" rel="0.1" amt="1" x100="0" att="0" lpdel="0" hold="0" lshp="2" lspd="0.0997" ctlenvamt="0" lspd_numerator="4"/>
<elcut lspd_denominator="4" sustain="0.5" pdel="0" userwavefile="" dec="0.5" lamt="0" syncmode="0" latt="0" rel="0.1" amt="0" x100="0" att="0" lpdel="0" hold="0.5" lshp="2" lspd="0.001" ctlenvamt="0" lspd_numerator="4"/>
<elres lspd_denominator="4" sustain="0.5" pdel="0" userwavefile="" dec="0.5" lamt="0" syncmode="0" latt="0" rel="0.1" amt="0" x100="0" att="0" lpdel="0" hold="0.5" lshp="0" lspd="0.1" ctlenvamt="0" lspd_numerator="4"/>
</eldata>
<chordcreator chord="0" chordrange="1" chord-enabled="0"/>
<arpeggiator arptime="100" arprange="1" arptime_denominator="4" syncmode="0" arpmode="0" arp-enabled="0" arp="0" arptime_numerator="4" arpdir="0" arpgate="100"/>
<midiport inputcontroller="0" fixedoutputvelocity="-1" inputchannel="0" outputcontroller="0" writable="0" outputchannel="1" fixedinputvelocity="-1" fixedoutputnote="-1" outputprogram="1" basevelocity="63" readable="0"/>
<fxchain numofeffects="6" enabled="1">
<effect autoquit_numerator="4" autoquit_denominator="4" syncmode="0" autoquit="1" gate="0" name="ladspaeffect" wet="1" on="1">
<ladspacontrols ports="10">
<port02 data="0"/>
<port03 data="0"/>
<port04 data="2.07"/>
<port05 data="3.51"/>
<port06 data="-47.97"/>
<port07 data="-12.69"/>
<port08 data="-47.97"/>
<port09 data="-47.34"/>
<port010 data="-47.97"/>
<port011 data="9.99"/>
</ladspacontrols>
<key>
<attribute value="caps" name="file"/>
<attribute value="Eq2x2" name="plugin"/>
</key>
</effect>
<effect autoquit_numerator="4" autoquit_denominator="4" syncmode="0" autoquit="1" gate="0" name="ladspaeffect" wet="0.5" on="0">
<ladspacontrols ports="4">
<port02 data="0.370265"/>
<port03 data="0"/>
<port04 data="0.9995"/>
<port05 data="0.10875"/>
</ladspacontrols>
<key>
<attribute value="caps" name="file"/>
<attribute value="Plate2x2" name="plugin"/>
</key>
</effect>
<effect autoquit_numerator="4" autoquit_denominator="4" syncmode="0" autoquit="1" gate="0" name="ladspaeffect" wet="1" on="1">
<ladspacontrols ports="9">
<port07>
<data scale_type="log" value="0.4" id="6315252"/>
</port07>
<port08>
<data scale_type="log" value="2000.25" id="2498139"/>
</port08>
<port09 data="0"/>
<port010 data="1"/>
<port011 data="0.5"/>
<port012 data="1"/>
<port013 data="0"/>
<port014>
<data scale_type="log" value="659.34" id="5231681"/>
</port014>
<port015>
<data scale_type="log" value="4862.63" id="1579810"/>
</port015>
</ladspacontrols>
<key>
<attribute value="calf" name="file"/>
<attribute value="Reverb" name="plugin"/>
</key>
</effect>
<effect autoquit_numerator="4" autoquit_denominator="4" syncmode="0" autoquit="1" gate="0" name="ladspaeffect" wet="0.18" on="1">
<ladspacontrols ports="13">
<port04 data="0"/>
<port05 data="1.02375"/>
<port06 data="0.96"/>
<port07 data="0.50125"/>
<port012 data="5.049"/>
<port013 data="10"/>
<port015>
<data scale_type="log" value="20000" id="8103466"/>
</port015>
<port016>
<data scale_type="log" value="10" id="4889780"/>
</port016>
<port017>
<data scale_type="log" value="20000" id="6261168"/>
</port017>
<port018>
<data scale_type="log" value="10" id="4037431"/>
</port018>
<port019>
<data scale_type="log" value="215.82" id="6293968"/>
</port019>
<port020 data="15.9973"/>
<port021>
<data scale_type="log" value="0.9999" id="2846145"/>
</port021>
</ladspacontrols>
<key>
<attribute value="calf" name="file"/>
<attribute value="Saturator" name="plugin"/>
</key>
</effect>
<effect autoquit_numerator="4" autoquit_denominator="4" syncmode="0" autoquit="1" gate="0" name="ladspaeffect" wet="1" on="1">
<ladspacontrols ports="13">
<port04 data="0"/>
<port05 data="1.02375"/>
<port06 data="0.96"/>
<port07 data="1"/>
<port012 data="5.049"/>
<port013 data="10"/>
<port015>
<data scale_type="log" value="20000" id="7709628"/>
</port015>
<port016>
<data scale_type="log" value="10" id="7480205"/>
</port016>
<port017>
<data scale_type="log" value="20000" id="4036038"/>
</port017>
<port018>
<data scale_type="log" value="10" id="1042561"/>
</port018>
<port019>
<data scale_type="log" value="721.71" id="92193"/>
</port019>
<port020 data="1.31484"/>
<port021>
<data scale_type="log" value="0.100237" id="7520542"/>
</port021>
</ladspacontrols>
<key>
<attribute value="calf" name="file"/>
<attribute value="Saturator" name="plugin"/>
</key>
</effect>
<effect autoquit_numerator="4" autoquit_denominator="4" syncmode="0" autoquit="1" gate="0" name="ladspaeffect" wet="1" on="1">
<ladspacontrols ports="10">
<port02 data="-47.97"/>
<port03 data="-10.8"/>
<port04 data="0"/>
<port05 data="0"/>
<port06 data="0"/>
<port07 data="0"/>
<port08 data="0"/>
<port09 data="0"/>
<port010 data="0.72"/>
<port011 data="2.52"/>
</ladspacontrols>
<key>
<attribute value="caps" name="file"/>
<attribute value="Eq2x2" name="plugin"/>
</key>
</effect>
</fxchain>
</instrumenttrack>
</instrumenttracksettings>
</lmms-project>

View File

@@ -0,0 +1,21 @@
<?xml version="1.0"?>
<!DOCTYPE lmms-project>
<lmms-project version="1.0" creator="LMMS" creatorversion="1.0.98" type="instrumenttracksettings">
<head/>
<instrumenttracksettings muted="0" type="0" name="TR909-RimShot" solo="0">
<instrumenttrack pan="0" fxch="0" pitchrange="1" pitch="0" basenote="57" vol="100">
<instrument name="kicker">
<kicker decay_numerator="4" decay_denominator="4" distend="0.8" click="0.15" endnote="0" version="1" decay="40" syncmode="0" noise="0.13" slope="0.265" dist="100" env="0.044" startnote="0" startfreq="330" endfreq="5" gain="0.75"/>
</instrument>
<eldata fres="2.75" ftype="1" fcut="100" fwet="1">
<elvol lspd_denominator="4" sustain="0" pdel="0" userwavefile="" dec="0.2" lamt="1" syncmode="7" latt="0.1" rel="0" amt="1" x100="0" att="0" lpdel="0" hold="0" lshp="0" lspd="0.0027" ctlenvamt="0" lspd_numerator="4"/>
<elcut lspd_denominator="4" sustain="0" pdel="0" userwavefile="" dec="0" lamt="0" syncmode="6" latt="0" rel="0" amt="0.2" x100="0" att="0" lpdel="0" hold="0.2" lshp="1" lspd="0.0054" ctlenvamt="0" lspd_numerator="4"/>
<elres lspd_denominator="4" sustain="0" pdel="0" userwavefile="" dec="0.5" lamt="0" syncmode="0" latt="0" rel="0" amt="0.2" x100="0" att="0" lpdel="0" hold="0" lshp="0" lspd="0.1" ctlenvamt="0" lspd_numerator="4"/>
</eldata>
<chordcreator chord="0" chordrange="1" chord-enabled="0"/>
<arpeggiator arptime="100" arprange="1" arptime_denominator="4" syncmode="0" arpmode="0" arp-enabled="0" arp="0" arptime_numerator="4" arpdir="0" arpgate="100"/>
<midiport inputcontroller="0" fixedoutputvelocity="-1" inputchannel="0" outputcontroller="0" writable="0" outputchannel="1" fixedinputvelocity="-1" fixedoutputnote="-1" outputprogram="1" basevelocity="63" readable="0"/>
<fxchain numofeffects="0" enabled="0"/>
</instrumenttrack>
</instrumenttracksettings>
</lmms-project>

View File

@@ -16,10 +16,11 @@ DMG_BACKGROUND_IMG="dmg_branding.png"
cp "@CMAKE_SOURCE_DIR@/data/${DMG_BACKGROUND_IMG}" .
# you should not need to change these
OS_VER=`sw_vers -productVersion|cut -d"." -f1-2`
APP_LOWERCASE=$(echo $APP_NAME|tr '[:upper:]' '[:lower:]')
APP_EXE="${APP_NAME}.app/Contents/MacOS/${APP_LOWERCASE}"
VOL_NAME="${APP_NAME} ${VERSION}" # volume name will be "SuperCoolApp 1.0.0"
VOL_NAME="${APP_LOWERCASE}-${VERSION}-mac${OS_VER}" # volume name will be "SuperCoolApp 1.0.0"
DMG_TMP="${VOL_NAME}-temp.dmg"
DMG_FINAL="${VOL_NAME}.dmg" # final DMG name will be "SuperCoolApp 1.0.0.dmg"
STAGING_DIR="./Install" # we copy all our stuff into this dir

View File

@@ -74,7 +74,7 @@ public:
}
void clearJournal();
void stopAllJournalling();
JournallingObject * journallingObject( const jo_id_t _id )
{
if( m_joIDs.contains( _id ) )

View File

@@ -38,7 +38,7 @@ public:
}
virtual ~RmsHelper()
{
if( m_buffer ) delete m_buffer;
if( m_buffer ) delete[] m_buffer;
}
inline void setSize( int size )

View File

@@ -32,6 +32,7 @@
#include <math.h>
#include "lmms_constants.h"
#include "lmms_math.h"
inline float hermiteInterpolate( float x0, float x1, float x2, float x3,
float frac_pos )
@@ -80,24 +81,13 @@ inline float cubicInterpolate( float v0, float v1, float v2, float v3, float x )
inline float cosinusInterpolate( float v0, float v1, float x )
{
const float f = ( 1.0f - cosf( x * F_PI ) ) * 0.5f;
#ifdef FP_FAST_FMAF
return fmaf( f, v1-v0, v0 );
#else
return f * (v1-v0) + v0;
#endif
// return( v0*f + v1*( 1.0f-f ) );
return fastFmaf( f, v1-v0, v0 );
}
inline float linearInterpolate( float v0, float v1, float x )
{
// take advantage of fma function if present in hardware
#ifdef FP_FAST_FMAF
return fmaf( x, v1-v0, v0 );
#else
return x * (v1-v0) + v0;
#endif
return fastFmaf( x, v1-v0, v0 );
}

View File

@@ -130,7 +130,40 @@ static inline int fast_rand()
return( (unsigned)( next / 65536 ) % 32768 );
}
//! @brief Takes advantage of fmal() function if present in hardware
static inline long double fastFmal( long double a, long double b, long double c ) {
#ifdef FP_FAST_FMAL
#ifdef __clang__
return fma( a, b, c );
#else
return fmal( a, b, c );
#endif
#else
return a * b + c;
#endif
}
//! @brief Takes advantage of fmaf() function if present in hardware
static inline float fastFmaf( float a, float b, float c ) {
#ifdef FP_FAST_FMAF
#ifdef __clang__
return fma( a, b, c );
#else
return fmaf( a, b, c );
#endif
#else
return a * b + c;
#endif
}
//! @brief Takes advantage of fma() function if present in hardware
static inline double fastFma( double a, double b, double c ) {
#ifdef FP_FAST_FMA
return fma( a, b, c );
#else
return a * b + c;
#endif
}
// source: http://martin.ankerl.com/2007/10/04/optimized-pow-approximation-for-java-and-c-c/
static inline double fastPow( double a, double b )

View File

@@ -77,30 +77,30 @@ bool AmplifierEffect::processAudioBuffer( sampleFrame* buf, const fpp_t frames )
for( fpp_t f = 0; f < frames; ++f )
{
// qDebug( "offset %d, value %f", f, m_ampControls.m_volumeModel.value( f ) );
outSum += buf[f][0]*buf[f][0] + buf[f][1]*buf[f][1];
sample_t s[2] = { buf[f][0], buf[f][1] };
// convert vol/pan values to left/right values
const float left1 = m_ampControls.m_volumeModel.value( f ) *
( m_ampControls.m_panModel.value( f ) <= 0
const float left1 = m_ampControls.m_volumeModel.value() *
( m_ampControls.m_panModel.value() <= 0
? 1.0
: 1.0 - m_ampControls.m_panModel.value( f ) / 100.0 );
const float right1 = m_ampControls.m_volumeModel.value( f ) *
( m_ampControls.m_panModel.value( f ) >= 0
const float right1 = m_ampControls.m_volumeModel.value() *
( m_ampControls.m_panModel.value() >= 0
? 1.0
: 1.0 + m_ampControls.m_panModel.value( f ) / 100.0 );
: 1.0 + m_ampControls.m_panModel.value() / 100.0 );
// first stage amplification
s[0] *= ( left1 / 100.0 );
s[1] *= ( right1 / 100.0 );
// second stage amplification
s[0] *= ( m_ampControls.m_leftModel.value( f ) / 100.0 );
s[1] *= ( m_ampControls.m_rightModel.value( f ) / 100.0 );
s[0] *= ( m_ampControls.m_leftModel.value() / 100.0 );
s[1] *= ( m_ampControls.m_rightModel.value() / 100.0 );
buf[f][0] = d * buf[f][0] + w * s[0];
buf[f][1] = d * buf[f][1] + w * s[1];
outSum += buf[f][0]*buf[f][0] + buf[f][1]*buf[f][1];
}
checkGate( outSum / frames );

View File

@@ -88,13 +88,13 @@ bool BassBoosterEffect::processAudioBuffer( sampleFrame* buf, const fpp_t frames
const float w = wetLevel();
for( fpp_t f = 0; f < frames; ++f )
{
outSum += buf[f][0]*buf[f][0] + buf[f][1]*buf[f][1];
sample_t s[2] = { buf[f][0], buf[f][1] };
m_bbFX.nextSample( s[0], s[1] );
buf[f][0] = d * buf[f][0] + w * s[0];
buf[f][1] = d * buf[f][1] + w * s[1];
outSum += buf[f][0]*buf[f][0] + buf[f][1]*buf[f][1];
}
checkGate( outSum / frames );

View File

@@ -155,11 +155,11 @@ bool DualFilterEffect::processAudioBuffer( sampleFrame* buf, const fpp_t frames
s[0] += ( s2[0] * mix2 );
s[1] += ( s2[1] * mix2 );
}
outSum += buf[f][0]*buf[f][0] + buf[f][1]*buf[f][1];
// do another mix with dry signal
buf[f][0] = d * buf[f][0] + w * s[0];
buf[f][1] = d * buf[f][1] + w * s[1];
outSum += buf[f][0]*buf[f][0] + buf[f][1]*buf[f][1];
}
checkGate( outSum / frames );

View File

@@ -39,7 +39,7 @@ DualFilterControls::DualFilterControls( DualFilterEffect* effect ) :
m_enabled1Model( true, this, tr( "Filter 1 enabled" ) ),
m_filter1Model( this, tr( "Filter 1 type" ) ),
m_cut1Model( 7000.0f, 1.0f, 14000.0f, 1.0f, this, tr( "Cutoff 1 frequency" ) ),
m_cut1Model( 7000.0f, 1.0f, 20000.0f, 1.0f, this, tr( "Cutoff 1 frequency" ) ),
m_res1Model( 0.5, basicFilters<0>::minQ(), 10.0, 0.01, this, tr( "Q/Resonance 1" ) ),
m_gain1Model( 100.0f, 0.0f, 200.0f, 0.1f, this, tr( "Gain 1" ) ),
@@ -47,7 +47,7 @@ DualFilterControls::DualFilterControls( DualFilterEffect* effect ) :
m_enabled2Model( true, this, tr( "Filter 2 enabled" ) ),
m_filter2Model( this, tr( "Filter 2 type" ) ),
m_cut2Model( 7000.0f, 1.0f, 14000.0f, 1.0f, this, tr( "Cutoff 2 frequency" ) ),
m_cut2Model( 7000.0f, 1.0f, 20000.0f, 1.0f, this, tr( "Cutoff 2 frequency" ) ),
m_res2Model( 0.5, basicFilters<0>::minQ(), 10.0, 0.01, this, tr( "Q/Resonance 2" ) ),
m_gain2Model( 100.0f, 0.0f, 200.0f, 0.1f, this, tr( "Gain 2" ) )
{

View File

@@ -567,6 +567,22 @@ lookahead_limiter::lookahead_limiter() {
asc_coeff = 1.f;
}
lookahead_limiter::~lookahead_limiter()
{
if( buffer != NULL)
{
free(buffer);
}
if( nextpos != NULL)
{
free(nextpos);
}
if( nextdelta != NULL)
{
free(nextdelta);
}
}
void lookahead_limiter::activate()
{
is_active = true;

View File

@@ -608,6 +608,7 @@ public:
void reset_asc();
bool get_asc();
lookahead_limiter();
~lookahead_limiter();
void set_multi(bool set);
void process(float &left, float &right, float *multi_buffer);
void set_sample_rate(uint32_t sr);

View File

@@ -47,6 +47,7 @@ struct ladspa_instance: public plugin_ctl_iface
#endif
ladspa_instance(audio_module_iface *_module, ladspa_plugin_metadata_set *_ladspa, int sample_rate);
virtual ~ladspa_instance();
virtual const line_graph_iface *get_line_graph_iface() const { return module->get_line_graph_iface(); }
virtual float get_param_value(int param_no);
virtual void set_param_value(int param_no, float value);

View File

@@ -263,6 +263,7 @@ class mono_audio_module:
}
public:
mono_audio_module();
~mono_audio_module();
void params_changed();
void activate();
void set_sample_rate(uint32_t sr);
@@ -291,6 +292,7 @@ class stereo_audio_module:
}
public:
stereo_audio_module();
~stereo_audio_module();
void params_changed();
void activate();
void set_sample_rate(uint32_t sr);

View File

@@ -84,6 +84,7 @@ public:
uint32_t srate;
bool is_active;
multibandlimiter_audio_module();
~multibandlimiter_audio_module();
void activate();
void deactivate();
void params_changed();

View File

@@ -460,6 +460,14 @@ stereo_audio_module::stereo_audio_module() {
meter_outR = 0.f;
}
stereo_audio_module::~stereo_audio_module()
{
if( buffer != NULL )
{
free(buffer);
}
}
void stereo_audio_module::activate() {
active = true;
}
@@ -686,6 +694,14 @@ mono_audio_module::mono_audio_module() {
meter_outR = 0.f;
}
mono_audio_module::~mono_audio_module()
{
if( buffer != NULL )
{
free(buffer);
}
}
void mono_audio_module::activate() {
active = true;
}

View File

@@ -252,6 +252,14 @@ multibandlimiter_audio_module::multibandlimiter_audio_module()
asc_old = true;
}
multibandlimiter_audio_module::~multibandlimiter_audio_module()
{
if( buffer != NULL)
{
free(buffer);
}
}
void multibandlimiter_audio_module::activate()
{
is_active = true;

View File

@@ -54,6 +54,11 @@ ladspa_instance::ladspa_instance(audio_module_iface *_module, ladspa_plugin_meta
module->post_instantiate();
}
ladspa_instance::~ladspa_instance()
{
delete module;
}
float ladspa_instance::get_param_value(int param_no)
{
// XXXKF hack

View File

@@ -116,6 +116,8 @@ static void activateDj_eq_mono(LADSPA_Handle instance) {
}
static void cleanupDj_eq_mono(LADSPA_Handle instance) {
Dj_eq_mono *plugin_data = (Dj_eq_mono *)instance;
free(plugin_data->filters);
free(instance);
}
@@ -283,6 +285,8 @@ static void activateDj_eq(LADSPA_Handle instance) {
}
static void cleanupDj_eq(LADSPA_Handle instance) {
Dj_eq *plugin_data = (Dj_eq *)instance;
free(plugin_data->filters);
free(instance);
}

View File

@@ -137,6 +137,7 @@ static void cleanupFastLookaheadLimiter(LADSPA_Handle instance) {
#line 188 "fast_lookahead_limiter_1913.xml"
FastLookaheadLimiter *plugin_data = (FastLookaheadLimiter *)instance;
free(plugin_data->buffer);
free(plugin_data->chunks);
free(instance);
}

View File

@@ -74,7 +74,11 @@ static fftw_real *real_in, *real_out, *comp_in, *comp_out;
unsigned int fft_length[IMPULSES];
#ifdef __clang__
void impulse2freq(int id, float *imp, unsigned int length, fftw_real *out)
#else
inline void impulse2freq(int id, float *imp, unsigned int length, fftw_real *out)
#endif
{
fftw_real impulse_time[MAX_FFT_LENGTH];
#ifdef FFTW3
@@ -198,6 +202,11 @@ static void cleanupImp(LADSPA_Handle instance) {
local_free(plugin_data->op);
local_free(plugin_data->overlap);
local_free(plugin_data->opc);
unsigned int i;
for (i=0; i<IMPULSES; i++) {
local_free(plugin_data->impulse_freq[i]);
}
local_free(plugin_data->impulse_freq);
free(instance);
}

View File

@@ -163,6 +163,7 @@ static void cleanupVynil(LADSPA_Handle instance) {
free(plugin_data->buffer_m);
free(plugin_data->buffer_s);
free(plugin_data->click_buffer);
free(plugin_data->highp);
free(plugin_data->lowp_m);
free(plugin_data->lowp_s);
free(plugin_data->noise_filt);

View File

@@ -145,7 +145,8 @@ activate_eq(LADSPA_Handle instance) {
static
void
cleanup_eq(LADSPA_Handle instance) {
eq *plugin_data = (eq *)instance;
free(plugin_data->filters);
free(instance);
}

View File

@@ -167,7 +167,8 @@ activate_eq(LADSPA_Handle instance) {
static
void
cleanup_eq(LADSPA_Handle instance) {
eq *plugin_data = (eq *)instance;
free(plugin_data->filters);
free(instance);
}

View File

@@ -575,13 +575,8 @@ AudioFileProcessorView::AudioFileProcessorView( Instrument * _instrument,
m_interpBox->setFont( pointSize<8>( m_interpBox->font() ) );
// wavegraph
m_waveView = new AudioFileProcessorWaveView( this, 245, 75, castModel<audioFileProcessor>()->m_sampleBuffer );
m_waveView->move( 2, 172 );
m_waveView->setKnobs(
dynamic_cast<AudioFileProcessorWaveView::knob *>( m_startKnob ),
dynamic_cast<AudioFileProcessorWaveView::knob *>( m_endKnob ),
dynamic_cast<AudioFileProcessorWaveView::knob *>( m_loopKnob )
);
m_waveView = 0;
newWaveView();
connect( castModel<audioFileProcessor>(), SIGNAL( isPlaying( f_cnt_t ) ),
m_waveView, SLOT( isPlaying( f_cnt_t ) ) );
@@ -630,6 +625,25 @@ void AudioFileProcessorView::dragEnterEvent( QDragEnterEvent * _dee )
void AudioFileProcessorView::newWaveView()
{
if ( m_waveView )
{
delete m_waveView;
m_waveView = 0;
}
m_waveView = new AudioFileProcessorWaveView( this, 245, 75, castModel<audioFileProcessor>()->m_sampleBuffer );
m_waveView->move( 2, 172 );
m_waveView->setKnobs(
dynamic_cast<AudioFileProcessorWaveView::knob *>( m_startKnob ),
dynamic_cast<AudioFileProcessorWaveView::knob *>( m_endKnob ),
dynamic_cast<AudioFileProcessorWaveView::knob *>( m_loopKnob ) );
m_waveView->show();
}
void AudioFileProcessorView::dropEvent( QDropEvent * _de )
{
QString type = stringPairDrag::decodeKey( _de );
@@ -638,6 +652,7 @@ void AudioFileProcessorView::dropEvent( QDropEvent * _de )
{
castModel<audioFileProcessor>()->setAudioFile( value );
_de->accept();
newWaveView();
return;
}
else if( type == QString( "tco_%1" ).arg( track::SampleTrack ) )
@@ -691,6 +706,7 @@ void AudioFileProcessorView::paintEvent( QPaintEvent * )
void AudioFileProcessorView::sampleUpdated( void )
{
newWaveView();
m_waveView->update();
update();
}
@@ -707,6 +723,7 @@ void AudioFileProcessorView::openAudioFile( void )
{
castModel<audioFileProcessor>()->setAudioFile( af );
engine::getSong()->setModified();
newWaveView();
}
}
@@ -740,6 +757,7 @@ AudioFileProcessorWaveView::AudioFileProcessorWaveView( QWidget * _parent, int _
m_to( m_sampleBuffer.frames() ),
m_last_from( 0 ),
m_last_to( 0 ),
m_last_amp( 0 ),
m_startKnob( 0 ),
m_endKnob( 0 ),
m_loopKnob( 0 ),

View File

@@ -118,7 +118,7 @@ public:
AudioFileProcessorView( Instrument * _instrument, QWidget * _parent );
virtual ~AudioFileProcessorView();
void newWaveView();
protected slots:
void sampleUpdated();
void openAudioFile();

View File

@@ -251,16 +251,16 @@ intptr_t CarlaInstrument::handleDispatcher(const NativeHostDispatcherOpcode opco
switch (opcode)
{
case HOST_OPCODE_NULL:
case NATIVE_HOST_OPCODE_NULL:
break;
case HOST_OPCODE_UPDATE_PARAMETER:
case HOST_OPCODE_UPDATE_MIDI_PROGRAM:
case HOST_OPCODE_RELOAD_PARAMETERS:
case HOST_OPCODE_RELOAD_MIDI_PROGRAMS:
case HOST_OPCODE_RELOAD_ALL:
case NATIVE_HOST_OPCODE_UPDATE_PARAMETER:
case NATIVE_HOST_OPCODE_UPDATE_MIDI_PROGRAM:
case NATIVE_HOST_OPCODE_RELOAD_PARAMETERS:
case NATIVE_HOST_OPCODE_RELOAD_MIDI_PROGRAMS:
case NATIVE_HOST_OPCODE_RELOAD_ALL:
// nothing
break;
case HOST_OPCODE_UI_UNAVAILABLE:
case NATIVE_HOST_OPCODE_UI_UNAVAILABLE:
handleUiClosed();
break;
}
@@ -459,7 +459,7 @@ PluginView* CarlaInstrument::instantiateView(QWidget* parent)
void CarlaInstrument::sampleRateChanged()
{
fDescriptor->dispatcher(fHandle, PLUGIN_OPCODE_SAMPLE_RATE_CHANGED, 0, 0, nullptr, handleGetSampleRate());
fDescriptor->dispatcher(fHandle, NATIVE_PLUGIN_OPCODE_SAMPLE_RATE_CHANGED, 0, 0, nullptr, handleGetSampleRate());
}
// -------------------------------------------------------------------

View File

@@ -30,14 +30,14 @@
#include "song.h"
DelayControls::DelayControls( DelayEffect* effect ):
EffectControls( effect ),
m_effect ( effect ),
m_delayTimeModel( 2.0, 0.01, 20.0, 0.0001, 20000.0, this, tr( "Delay Samples" )) ,
m_feedbackModel(0.0f,0.0f,1.0f,0.01f,this,tr( "Feedback" ) ),
m_lfoTimeModel(2.0, 0.01, 20.0, 0.0001, 20000.0, this, tr( "Lfo Frequency" ) ),
m_lfoAmountModel(0.0, 0.0, 2.0, 0.0001, 2000.0, this, tr ( "Lfo Amount" ) )
EffectControls( effect ),
m_effect ( effect ),
m_delayTimeModel( 0.5, 0.01, 20.0, 0.0001, 20000.0, this, tr( "Delay Samples" )) ,
m_feedbackModel(0.0f,0.0f,1.0f,0.01f,this,tr( "Feedback" ) ),
m_lfoTimeModel(2.0, 0.01, 20.0, 0.0001, 20000.0, this, tr( "Lfo Frequency" ) ),
m_lfoAmountModel(0.0, 0.0, 2.0, 0.0001, 2000.0, this, tr ( "Lfo Amount" ) )
{
connect( engine::mixer(), SIGNAL( sampleRateChanged() ), this, SLOT( changeSampleRate() ) );
connect( engine::mixer(), SIGNAL( sampleRateChanged() ), this, SLOT( changeSampleRate() ) );
}
@@ -45,10 +45,10 @@ DelayControls::DelayControls( DelayEffect* effect ):
void DelayControls::loadSettings( const QDomElement &_this )
{
m_delayTimeModel.loadSettings(_this, "DelayTimeSamples" );
m_feedbackModel.loadSettings( _this, "FeebackAmount" );
m_lfoTimeModel.loadSettings( _this , "LfoFrequency");
m_lfoAmountModel.loadSettings( _this, "LfoAmount");
m_delayTimeModel.loadSettings(_this, "DelayTimeSamples" );
m_feedbackModel.loadSettings( _this, "FeebackAmount" );
m_lfoTimeModel.loadSettings( _this , "LfoFrequency");
m_lfoAmountModel.loadSettings( _this, "LfoAmount");
}
@@ -56,17 +56,15 @@ void DelayControls::loadSettings( const QDomElement &_this )
void DelayControls::saveSettings( QDomDocument& doc, QDomElement& _this )
{
m_delayTimeModel.saveSettings( doc, _this, "DelayTimeSamples" );
m_feedbackModel.saveSettings( doc, _this ,"FeebackAmount" );
m_lfoTimeModel.saveSettings( doc, _this, "LfoFrequency" );
m_lfoAmountModel.saveSettings( doc, _this ,"LfoAmount" );
m_delayTimeModel.saveSettings( doc, _this, "DelayTimeSamples" );
m_feedbackModel.saveSettings( doc, _this ,"FeebackAmount" );
m_lfoTimeModel.saveSettings( doc, _this, "LfoFrequency" );
m_lfoAmountModel.saveSettings( doc, _this ,"LfoAmount" );
}
void DelayControls::changeSampleRate()
{
m_effect->changeSampleRate();
m_effect->changeSampleRate();
}
#include "moc_delaycontrols.cxx"

View File

@@ -35,38 +35,38 @@ class DelayEffect;
class DelayControls : public EffectControls
{
Q_OBJECT
Q_OBJECT
public:
DelayControls( DelayEffect* effect );
virtual ~DelayControls()
{
}
virtual void saveSettings( QDomDocument& doc, QDomElement& parent );
virtual void loadSettings( const QDomElement& _this );
inline virtual QString nodeName() const
{
return "Delay";
}
virtual int controlCount(){
return 4;
}
virtual EffectControlDialog* createView()
{
return new DelayControlsDialog( this );
}
DelayControls( DelayEffect* effect );
virtual ~DelayControls()
{
}
virtual void saveSettings( QDomDocument& doc, QDomElement& parent );
virtual void loadSettings( const QDomElement& _this );
inline virtual QString nodeName() const
{
return "Delay";
}
virtual int controlCount(){
return 4;
}
virtual EffectControlDialog* createView()
{
return new DelayControlsDialog( this );
}
private slots:
void changeSampleRate();
void changeSampleRate();
private:
DelayEffect* m_effect;
TempoSyncKnobModel m_delayTimeModel;
FloatModel m_feedbackModel;
TempoSyncKnobModel m_lfoTimeModel;
TempoSyncKnobModel m_lfoAmountModel;
DelayEffect* m_effect;
TempoSyncKnobModel m_delayTimeModel;
FloatModel m_feedbackModel;
TempoSyncKnobModel m_lfoTimeModel;
TempoSyncKnobModel m_lfoAmountModel;
friend class DelayControlsDialog;
friend class DelayEffect;
friend class DelayControlsDialog;
friend class DelayEffect;
};
#endif // DELAYCONTROLS_H

View File

@@ -31,40 +31,44 @@
DelayControlsDialog::DelayControlsDialog( DelayControls *controls ) :
EffectControlDialog( controls )
EffectControlDialog( controls )
{
setAutoFillBackground( true );
QPalette pal;
pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) );
setPalette( pal );
setFixedSize( 200, 75 );
setAutoFillBackground( true );
QPalette pal;
pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) );
setPalette( pal );
setFixedSize( 200, 75 );
TempoSyncKnob* sampleDelayKnob = new TempoSyncKnob( knobBright_26, this );
sampleDelayKnob->move( 20,10 );
sampleDelayKnob->setVolumeKnob( false );
sampleDelayKnob->setModel( &controls->m_delayTimeModel );
sampleDelayKnob->setLabel( tr( "Delay" ) );
sampleDelayKnob->setHintText( tr( "Delay Time Seconds:" ) + " ", "" );
TempoSyncKnob* sampleDelayKnob = new TempoSyncKnob( knobBright_26, this );
sampleDelayKnob->move( 20,10 );
sampleDelayKnob->setVolumeKnob( false );
sampleDelayKnob->setModel( &controls->m_delayTimeModel );
sampleDelayKnob->setLabel( tr( "Delay" ) );
sampleDelayKnob->setHintText( tr( "Delay Time" ) + " ", " s" );
knob * feedbackKnob = new knob( knobBright_26, this );
feedbackKnob->move( 63,10 );
feedbackKnob->setVolumeKnob( true) ;
feedbackKnob->setModel( &controls->m_feedbackModel);
feedbackKnob->setLabel( tr( "Regen" ) );
feedbackKnob->setHintText( tr ( "Feedback Amount:" ) + " ", "" );
knob * feedbackKnob = new knob( knobBright_26, this );
feedbackKnob->move( 63,10 );
feedbackKnob->setVolumeKnob( true) ;
feedbackKnob->setModel( &controls->m_feedbackModel);
feedbackKnob->setLabel( tr( "Regen" ) );
feedbackKnob->setHintText( tr ( "Feedback Amount" ) + " " , "" );
TempoSyncKnob * lfoFreqKnob = new TempoSyncKnob( knobBright_26, this );
lfoFreqKnob->move( 106,10 );
lfoFreqKnob->setVolumeKnob( false );
lfoFreqKnob->setModel( &controls->m_lfoTimeModel );
lfoFreqKnob->setLabel( tr( "Rate" ) );
lfoFreqKnob->setHintText( tr ( "Lfo Seconds:" ) + " ", "" );
TempoSyncKnob * lfoFreqKnob = new TempoSyncKnob( knobBright_26, this );
lfoFreqKnob->move( 106,10 );
lfoFreqKnob->setVolumeKnob( false );
lfoFreqKnob->setModel( &controls->m_lfoTimeModel );
lfoFreqKnob->setLabel( tr( "Rate" ) );
lfoFreqKnob->setHintText( tr ( "Lfo") + " ", " s" );
TempoSyncKnob * lfoAmtKnob = new TempoSyncKnob( knobBright_26, this );
lfoAmtKnob->move( 150,10 );
lfoAmtKnob->setVolumeKnob( false );
lfoAmtKnob->setModel( &controls->m_lfoAmountModel );
lfoAmtKnob->setLabel( tr( "Lfo" ) );
lfoAmtKnob->setHintText( tr ( "Lfo Amt" ) + " " , " s" );
TempoSyncKnob * lfoAmtKnob = new TempoSyncKnob( knobBright_26, this );
lfoAmtKnob->move( 150,10 );
lfoAmtKnob->setVolumeKnob( false );
lfoAmtKnob->setModel( &controls->m_lfoAmountModel );
lfoAmtKnob->setLabel( tr( "Lfo" ) );
lfoAmtKnob->setHintText( tr ( "Lfo Amt:" ) + " ", "" );
}
#include "moc_delaycontrols.cxx"

View File

@@ -32,10 +32,10 @@ class DelayControls;
class DelayControlsDialog : public EffectControlDialog
{
public:
DelayControlsDialog( DelayControls* controls );
virtual ~DelayControlsDialog()
{
}
DelayControlsDialog( DelayControls* controls );
virtual ~DelayControlsDialog()
{
}
};
#endif // DELAYCONTROLSDIALOG_H

View File

@@ -32,27 +32,27 @@ extern "C"
Plugin::Descriptor PLUGIN_EXPORT delay_plugin_descriptor =
{
STRINGIFY( PLUGIN_NAME ),
"Delay",
QT_TRANSLATE_NOOP( "pluginBrowser", "A native delay plugin" ),
"Dave French <contact/dot/dave/dot/french3/at/googlemail/dot/com>",
0x0100,
Plugin::Effect,
new PluginPixmapLoader( "logo" ),
NULL,
NULL
STRINGIFY( PLUGIN_NAME ),
"Delay",
QT_TRANSLATE_NOOP( "pluginBrowser", "A native delay plugin" ),
"Dave French <contact/dot/dave/dot/french3/at/googlemail/dot/com>",
0x0100,
Plugin::Effect,
new PluginPixmapLoader( "logo" ),
NULL,
NULL
} ;
DelayEffect::DelayEffect( Model* parent, const Plugin::Descriptor::SubPluginFeatures::Key* key ) :
Effect( &delay_plugin_descriptor, parent, key ),
m_delayControls( this )
Effect( &delay_plugin_descriptor, parent, key ),
m_delayControls( this )
{
m_delay = 0;
m_delay = new StereoDelay( 20, engine::mixer()->processingSampleRate() );
m_lfo = new Lfo( engine::mixer()->processingSampleRate() );
m_delay = 0;
m_delay = new StereoDelay( 20, engine::mixer()->processingSampleRate() );
m_lfo = new Lfo( engine::mixer()->processingSampleRate() );
}
@@ -60,14 +60,14 @@ DelayEffect::DelayEffect( Model* parent, const Plugin::Descriptor::SubPluginFeat
DelayEffect::~DelayEffect()
{
if( m_delay )
{
delete m_delay;
}
if( m_lfo )
{
delete m_lfo;
}
if( m_delay )
{
delete m_delay;
}
if( m_lfo )
{
delete m_lfo;
}
}
@@ -75,37 +75,37 @@ DelayEffect::~DelayEffect()
bool DelayEffect::processAudioBuffer( sampleFrame* buf, const fpp_t frames )
{
if( !isEnabled() || !isRunning () )
{
return( false );
}
double outSum = 0.0;
const float d = dryLevel();
const float w = wetLevel();
const float length = m_delayControls.m_delayTimeModel.value() * engine::mixer()->processingSampleRate();
const float amplitude = m_delayControls.m_lfoAmountModel.value() * engine::mixer()->processingSampleRate();
m_lfo->setFrequency( 1.0 / m_delayControls.m_lfoTimeModel.value() );
m_delay->setFeedback( m_delayControls.m_feedbackModel.value() );
sample_t dryS[2];
for( fpp_t f = 0; f < frames; ++f )
{
dryS[0] = buf[f][0];
dryS[1] = buf[f][1];
m_delay->setLength( ( float )length + ( amplitude * ( float )m_lfo->tick() ) );
m_delay->tick( buf[f] );
if( !isEnabled() || !isRunning () )
{
return( false );
}
double outSum = 0.0;
const float d = dryLevel();
const float w = wetLevel();
const float length = m_delayControls.m_delayTimeModel.value() * engine::mixer()->processingSampleRate();
const float amplitude = m_delayControls.m_lfoAmountModel.value() * engine::mixer()->processingSampleRate();
m_lfo->setFrequency( 1.0 / m_delayControls.m_lfoTimeModel.value() );
m_delay->setFeedback( m_delayControls.m_feedbackModel.value() );
sample_t dryS[2];
for( fpp_t f = 0; f < frames; ++f )
{
dryS[0] = buf[f][0];
dryS[1] = buf[f][1];
m_delay->setLength( ( float )length + ( amplitude * ( float )m_lfo->tick() ) );
m_delay->tick( buf[f] );
buf[f][0] = ( d * dryS[0] ) + ( w * buf[f][0] );
buf[f][1] = ( d * dryS[1] ) + ( w * buf[f][1] );
outSum += buf[f][0]*buf[f][0] + buf[f][1]*buf[f][1];
}
checkGate( outSum / frames );
return isRunning();
buf[f][0] = ( d * dryS[0] ) + ( w * buf[f][0] );
buf[f][1] = ( d * dryS[1] ) + ( w * buf[f][1] );
outSum += buf[f][0]*buf[f][0] + buf[f][1]*buf[f][1];
}
checkGate( outSum / frames );
return isRunning();
}
void DelayEffect::changeSampleRate()
{
m_lfo->setSampleRate( engine::mixer()->processingSampleRate() );
m_delay->setSampleRate( engine::mixer()->processingSampleRate() );
m_lfo->setSampleRate( engine::mixer()->processingSampleRate() );
m_delay->setSampleRate( engine::mixer()->processingSampleRate() );
}
@@ -117,7 +117,7 @@ extern "C"
//needed for getting plugin out of shared lib
Plugin * PLUGIN_EXPORT lmms_plugin_main( Model* parent, void* data )
{
return new DelayEffect( parent , static_cast<const Plugin::Descriptor::SubPluginFeatures::Key *>( data ) );
return new DelayEffect( parent , static_cast<const Plugin::Descriptor::SubPluginFeatures::Key *>( data ) );
}
}}

View File

@@ -33,19 +33,19 @@
class DelayEffect : public Effect
{
public:
DelayEffect(Model* parent , const Descriptor::SubPluginFeatures::Key* key );
virtual ~DelayEffect();
virtual bool processAudioBuffer( sampleFrame* buf, const fpp_t frames );
virtual EffectControls* controls()
{
return &m_delayControls;
}
void changeSampleRate();
DelayEffect(Model* parent , const Descriptor::SubPluginFeatures::Key* key );
virtual ~DelayEffect();
virtual bool processAudioBuffer( sampleFrame* buf, const fpp_t frames );
virtual EffectControls* controls()
{
return &m_delayControls;
}
void changeSampleRate();
private:
DelayControls m_delayControls;
StereoDelay* m_delay;
Lfo* m_lfo;
DelayControls m_delayControls;
StereoDelay* m_delay;
Lfo* m_lfo;
};
#endif // DELAYEFFECT_H

View File

@@ -30,8 +30,8 @@
Lfo::Lfo( int samplerate )
{
m_samplerate = samplerate;
m_twoPiOverSr = F_2PI / samplerate;
m_samplerate = samplerate;
m_twoPiOverSr = F_2PI / samplerate;
}
@@ -39,8 +39,8 @@ Lfo::Lfo( int samplerate )
float Lfo::tick()
{
float output = sinf( m_phase );
m_phase += m_increment;
float output = sinf( m_phase );
m_phase += m_increment;
return output;
return output;
}

View File

@@ -30,50 +30,50 @@
class Lfo
{
public:
Lfo( int samplerate );
~Lfo()
{
}
Lfo( int samplerate );
~Lfo()
{
}
inline void setFrequency( double frequency )
{
if( frequency < 0 || frequency > ( m_samplerate / 2.0 ) || frequency == m_frequency )
{
return;
}
m_frequency = frequency;
m_increment = m_frequency * m_twoPiOverSr;
inline void setFrequency( double frequency )
{
if( frequency < 0 || frequency > ( m_samplerate / 2.0 ) || frequency == m_frequency )
{
return;
}
m_frequency = frequency;
m_increment = m_frequency * m_twoPiOverSr;
if( m_phase >= F_2PI )
{
m_phase -= F_2PI;
}
}
if( m_phase >= F_2PI )
{
m_phase -= F_2PI;
}
}
inline void setSampleRate ( int samplerate )
{
m_samplerate = samplerate;
m_twoPiOverSr = F_2PI / samplerate;
m_increment = m_frequency * m_twoPiOverSr;
}
inline void setSampleRate ( int samplerate )
{
m_samplerate = samplerate;
m_twoPiOverSr = F_2PI / samplerate;
m_increment = m_frequency * m_twoPiOverSr;
}
float tick();
float tick();
private:
double m_frequency;
double m_phase;
double m_increment;
double m_twoPiOverSr;
int m_samplerate;
double m_frequency;
double m_phase;
double m_increment;
double m_twoPiOverSr;
int m_samplerate;
};
#endif // LFO_H

View File

@@ -31,14 +31,14 @@
StereoDelay::StereoDelay( int maxTime, int sampleRate )
{
m_buffer = 0;
m_maxTime = maxTime;
m_maxLength = maxTime * sampleRate;
m_length = m_maxLength;
m_buffer = 0;
m_maxTime = maxTime;
m_maxLength = maxTime * sampleRate;
m_length = m_maxLength;
m_index = 0;
m_feedback = 0.0f;
setSampleRate( sampleRate );
m_index = 0;
m_feedback = 0.0f;
setSampleRate( sampleRate );
}
@@ -46,10 +46,10 @@ StereoDelay::StereoDelay( int maxTime, int sampleRate )
StereoDelay::~StereoDelay()
{
if( m_buffer )
{
delete m_buffer;
}
if( m_buffer )
{
delete m_buffer;
}
}
@@ -57,24 +57,24 @@ StereoDelay::~StereoDelay()
void StereoDelay::tick( sampleFrame frame )
{
m_buffer[m_index][0] = frame[0];
m_buffer[m_index][1] = frame[1];
m_buffer[m_index][0] = frame[0];
m_buffer[m_index][1] = frame[1];
int readIndex = m_index - ( int )m_length;
if( readIndex < 0 )
{
readIndex += m_maxLength;
}
float fract = fraction( m_length );
frame[0] = linearInterpolate( m_buffer[readIndex][0] ,
m_buffer[( readIndex+1) % m_maxLength][0], fract );
frame[1] = linearInterpolate( m_buffer[readIndex][1] ,
m_buffer[( readIndex+1) % m_maxLength][1], fract );
int readIndex = m_index - ( int )m_length - 1;
if( readIndex < 0 )
{
readIndex += m_maxLength;
}
float fract = 1.0f - fraction( m_length );
frame[0] = linearInterpolate( m_buffer[readIndex][0] ,
m_buffer[( readIndex+1) % m_maxLength][0], fract );
frame[1] = linearInterpolate( m_buffer[readIndex][1] ,
m_buffer[( readIndex+1) % m_maxLength][1], fract );
m_buffer[m_index][0] += frame[0] * m_feedback;
m_buffer[m_index][1] += frame[1] * m_feedback;
m_buffer[m_index][0] += frame[0] * m_feedback;
m_buffer[m_index][1] += frame[1] * m_feedback;
m_index = ( m_index + 1) % m_maxLength;
m_index = ( m_index + 1) % m_maxLength;
}
@@ -82,13 +82,18 @@ void StereoDelay::tick( sampleFrame frame )
void StereoDelay::setSampleRate( int sampleRate )
{
if( m_buffer )
{
delete m_buffer;
}
if( m_buffer )
{
delete m_buffer;
}
m_buffer = new sampleFrame[( int )( sampleRate * m_maxTime )];
int bufferSize = ( int )( sampleRate * m_maxTime );
m_buffer = new sampleFrame[bufferSize];
for( int i = 0 ; i < bufferSize ; i++)
{
m_buffer[i][0] = 0.0;
m_buffer[i][1] = 0.0;
}
}

View File

@@ -30,31 +30,31 @@
class StereoDelay
{
public:
StereoDelay( int maxLength, int sampleRate );
~StereoDelay();
inline void setLength( float length )
{
if( length <= m_maxLength && length >= 0 )
{
m_length = length;
}
}
StereoDelay( int maxLength, int sampleRate );
~StereoDelay();
inline void setLength( float length )
{
if( length <= m_maxLength && length >= 0 )
{
m_length = length;
}
}
inline void setFeedback( float feedback )
{
m_feedback = feedback;
}
inline void setFeedback( float feedback )
{
m_feedback = feedback;
}
void tick( sampleFrame frame );
void setSampleRate( int sampleRate );
void tick( sampleFrame frame );
void setSampleRate( int sampleRate );
private:
sampleFrame* m_buffer;
int m_maxLength;
float m_length;
int m_index;
float m_feedback;
float m_maxTime;
sampleFrame* m_buffer;
int m_maxLength;
float m_length;
int m_index;
float m_feedback;
float m_maxTime;
};
#endif // STEREODELAY_H

View File

@@ -214,11 +214,10 @@ bool dynProcEffect::processAudioBuffer( sampleFrame * _buf,
s[0] *= outputGain;
s[1] *= outputGain;
out_sum += _buf[f][0]*_buf[f][0] + _buf[f][1]*_buf[f][1];
// mix wet/dry signals
_buf[f][0] = d * _buf[f][0] + w * s[0];
_buf[f][1] = d * _buf[f][1] + w * s[1];
out_sum += _buf[f][0]*_buf[f][0] + _buf[f][1]*_buf[f][1];
}
checkGate( out_sum / _frames );

View File

@@ -780,16 +780,18 @@ void lb302Synth::processNote( NotePlayHandle * _n )
void lb302Synth::play( sampleFrame * _working_buffer )
{
m_notesMutex.lock();
while( ! m_notes.isEmpty() )
{
processNote( m_notes.takeFirst() );
};
m_notesMutex.unlock();
const fpp_t frames = engine::mixer()->framesPerPeriod();
process( _working_buffer, frames );
instrumentTrack()->processAudioBuffer( _working_buffer, frames, NULL );
release_frame = 0;
// release_frame = 0; //removed for issue # 1432
}

View File

@@ -784,7 +784,7 @@ inline void MonstroSynth::updateModulators( float * env1, float * env2, float *
}
else if( m_env_phase[i] < 2.0f ) // attack phase
{
env[i][f] = calcSlope1( fraction( m_env_phase[i] ) );
env[i][f] = calcSlope( i, fraction( m_env_phase[i] ) );
m_env_phase[i] = qMin( 2.0f, m_env_phase[i] + m_env_att[i] );
}
else if( m_env_phase[i] < 3.0f ) // hold phase
@@ -794,7 +794,7 @@ inline void MonstroSynth::updateModulators( float * env1, float * env2, float *
}
else if( m_env_phase[i] < 4.0f ) // decay phase
{
const sample_t s = calcSlope1( 1.0f - fraction( m_env_phase[i] ) );
const sample_t s = calcSlope( i, 1.0f - fraction( m_env_phase[i] ) );
if( s <= m_env_sus[i] )
{
env[i][f] = m_env_sus[i];
@@ -808,7 +808,7 @@ inline void MonstroSynth::updateModulators( float * env1, float * env2, float *
}
else if( m_env_phase[i] < 5.0f ) // release phase
{
env[i][f] = calcSlope1( 1.0f - fraction( m_env_phase[i] ) );
env[i][f] = calcSlope( i, 1.0f - fraction( m_env_phase[i] ) );
m_env_phase[i] += m_env_rel[i];
}
else env[i][f] = 0.0f;
@@ -817,18 +817,11 @@ inline void MonstroSynth::updateModulators( float * env1, float * env2, float *
}
inline sample_t MonstroSynth::calcSlope1( sample_t s )
inline sample_t MonstroSynth::calcSlope( int slope, sample_t s )
{
if( m_parent->m_slope1 == 1.0f ) return s;
if( m_parent->m_slope[slope] == 1.0f ) return s;
if( s == 0.0f ) return s;
return fastPow( s, m_parent->m_slope1 );
}
inline sample_t MonstroSynth::calcSlope2( sample_t s )
{
if( m_parent->m_slope2 == 1.0f ) return s;
if( s == 0.0f ) return s;
return fastPow( s, m_parent->m_slope2 );
return fastPow( s, m_parent->m_slope[slope] );
}
@@ -1439,14 +1432,14 @@ void MonstroInstrument::updateSamplerate()
void MonstroInstrument::updateSlope1()
{
const float slope = m_env1Slope.value();
m_slope1 = exp10f( slope * -1.0f );
m_slope[0] = exp10f( slope * -1.0f );
}
void MonstroInstrument::updateSlope2()
{
const float slope = m_env2Slope.value();
m_slope2 = exp10f( slope * -1.0f );
m_slope[1] = exp10f( slope * -1.0f );
}

View File

@@ -177,10 +177,7 @@ private:
return s1 + ( s2 - s1 ) * x;
}*/ // using interpolation.h from now on
inline sample_t calcSlope1( sample_t s );
inline sample_t calcSlope2( sample_t s );
inline sample_t calcSlope( int slope, sample_t s );
// checks for lower bound for phase, upper bound is already checked by oscillator-functions in both
// oscillator.h and bandlimitedwave.h so we save some cpu by only checking lower bound
@@ -411,8 +408,7 @@ protected:
f_cnt_t m_env1_relF;
f_cnt_t m_env2_relF;
float m_slope1;
float m_slope2;
float m_slope [2];
f_cnt_t m_lfo1_att;
f_cnt_t m_lfo2_att;

View File

@@ -234,7 +234,7 @@ void NesObject::renderOutput( sampleFrame * buf, fpp_t frames )
// update framecounters
m_ch1Counter++;
m_ch1Counter = m_ch1Counter % m_wlen1;
m_ch1Counter = m_wlen1 ? m_ch1Counter % m_wlen1 : 0;
m_ch1EnvCounter++;
if( m_ch1EnvCounter >= ch1EnvLen )
@@ -287,7 +287,7 @@ void NesObject::renderOutput( sampleFrame * buf, fpp_t frames )
// update framecounters
m_ch2Counter++;
m_ch2Counter = m_ch2Counter % m_wlen2;
m_ch2Counter = m_wlen2 ? m_ch2Counter % m_wlen2 : 0;
m_ch2EnvCounter++;
if( m_ch2EnvCounter >= ch2EnvLen )
@@ -310,13 +310,13 @@ void NesObject::renderOutput( sampleFrame * buf, fpp_t frames )
////////////////////////////////
// make sure we don't overflow
m_ch3Counter %= m_wlen3;
m_ch3Counter = m_wlen3 ? m_ch3Counter % m_wlen3 : 0;
// render triangle wave
if( m_wlen3 <= m_maxWlen && ch3Enabled )
{
ch3Level = static_cast<int>( m_parent->m_ch3Volume.value() );
ch3 = TRIANGLE_WAVETABLE[ ( m_ch3Counter * 32 ) / m_wlen3 ];
ch3 = m_wlen3 ? TRIANGLE_WAVETABLE[ ( m_ch3Counter * 32 ) / m_wlen3 ] : 0;
ch3 = ( ch3 * ch3Level ) / 15;
}
else ch3 = ch3Level = 0;

View File

@@ -497,7 +497,7 @@ void opl2instrument::loadPatch(unsigned char inst[14]) {
void opl2instrument::tuneEqual(int center, float Hz) {
float tmp;
for(int n=0; n<128; ++n) {
tmp = Hz*pow( 2, ( n - center ) / 12.0 + pitchbend / 1200.0 );
tmp = Hz*pow( 2.0, ( n - center ) * ( 1.0 / 12.0 ) + pitchbend * ( 1.0 / 1200.0 ) );
fnums[n] = Hz2fnum( tmp );
}
}
@@ -505,7 +505,7 @@ void opl2instrument::tuneEqual(int center, float Hz) {
// Find suitable F number in lowest possible block
int opl2instrument::Hz2fnum(float Hz) {
for(int block=0; block<8; ++block) {
unsigned int fnum = Hz * pow(2, 20-block) / 49716;
unsigned int fnum = Hz * pow( 2.0, 20.0 - (double)block ) * ( 1.0 / 49716.0 );
if(fnum<1023) {
return fnum + (block << 10);
}

View File

@@ -360,11 +360,11 @@ void papuInstrument::playNote( NotePlayHandle * _n,
//PRNG Frequency = (1048576 Hz / (ratio + 1)) / 2 ^ (shiftclockfreq + 1)
char sopt=0;
char ropt=1;
float fopt = 524288.0 / ( ropt * pow( 2, sopt+1 ) );
float fopt = 524288.0 / ( ropt * pow( 2.0, sopt + 1.0 ) );
float f;
for ( char s=0; s<16; s++ )
for ( char r=0; r<8; r++ ) {
f = 524288.0 / ( r * pow( 2, s+1 ) );
f = 524288.0 / ( r * pow( 2.0, s + 1.0 ) );
if( fabs( freq-fopt ) > fabs( freq-f ) ) {
fopt = f;
ropt = r;

View File

@@ -81,15 +81,6 @@ malletsInstrument::malletsInstrument( InstrumentTrack * _instrument_track ):
!QFileInfo( configManager::inst()->stkDir() + QDir::separator()
+ "sinewave.raw" ).exists() )
{
// try to inform user about missing Stk-installation
if( m_filesMissing && engine::hasGUI() )
{
QMessageBox::information( 0, tr( "Missing files" ),
tr( "Your Stk-installation seems to be "
"incomplete. Please make sure "
"the full Stk-package is installed!" ),
QMessageBox::Ok );
}
// ModalBar
m_presetsModel.addItem( tr( "Marimba" ) );
@@ -334,6 +325,16 @@ malletsInstrumentView::malletsInstrumentView( malletsInstrument * _instrument,
m_spreadKnob->setLabel( tr( "Spread" ) );
m_spreadKnob->move( 190, 140 );
m_spreadKnob->setHintText( tr( "Spread:" ) + " ", "" );
// try to inform user about missing Stk-installation
if( _instrument->m_filesMissing && engine::hasGUI() )
{
QMessageBox::information( 0, tr( "Missing files" ),
tr( "Your Stk-installation seems to be "
"incomplete. Please make sure "
"the full Stk-package is installed!" ),
QMessageBox::Ok );
}
}

View File

@@ -415,7 +415,7 @@ void VstPlugin::setParameterDump( const QMap<QString, QString> & _pdump )
{
( *it ).section( ':', 0, 0 ).toInt(),
"",
( *it ).section( ':', 1, 1 ).toFloat()
( *it ).section( ':', 2, -1 ).toFloat()
} ;
m.addInt( item.index );
m.addString( item.shortLabel );

View File

@@ -748,6 +748,8 @@ WatsynView::WatsynView( Instrument * _instrument,
m_selectedGraphGroup -> addButton( a2_selectButton );
m_selectedGraphGroup -> addButton( b1_selectButton );
m_selectedGraphGroup -> addButton( b2_selectButton );
WatsynInstrument * w = castModel<WatsynInstrument>();
m_selectedGraphGroup -> setModel( &w -> m_selectedGraph);
// A-modulation button group
pixmapButton * amod_mixButton = new pixmapButton( this, NULL );

View File

@@ -130,11 +130,10 @@ bool waveShaperEffect::processAudioBuffer( sampleFrame * _buf,
s[0] *= output;
s[1] *= output;
out_sum += _buf[f][0]*_buf[f][0] + _buf[f][1]*_buf[f][1];
// mix wet/dry signals
_buf[f][0] = d * _buf[f][0] + w * s[0];
_buf[f][1] = d * _buf[f][1] + w * s[1];
out_sum += _buf[f][0]*_buf[f][0] + _buf[f][1]*_buf[f][1];
}
checkGate( out_sum / _frames );

View File

@@ -89,6 +89,7 @@ LocalZynAddSubFx::LocalZynAddSubFx() :
LocalZynAddSubFx::~LocalZynAddSubFx()
{
delete m_master;
delete m_ioEngine;
if( --s_instanceCount == 0 )
{

View File

@@ -173,8 +173,11 @@ Controller * Controller::create( ControllerTypes _ct, Model * _parent )
if( dummy )
c = dummy;
else
{
c = new Controller( DummyController, NULL,
QString() );
dummy = c;
}
break;
case Controller::LfoController:

View File

@@ -98,12 +98,11 @@ inline void FxChannel::processed()
void FxChannel::incrementDeps()
{
m_dependenciesMet.ref();
if( m_dependenciesMet >= m_receives.size() )
int i = m_dependenciesMet.fetchAndAddOrdered( 1 ) + 1;
if( i >= m_receives.size() && ! m_queued )
{
m_queued = true;
MixerWorkerThread::addJob( this );
m_dependenciesMet = 0;
}
}
@@ -164,8 +163,8 @@ void FxChannel::doProcessing( sampleFrame * _buf )
{
m_peakLeft = m_peakRight = 0.0f;
}
// increment dependency counter of all receivers
// increment dependency counter of all receivers
processed();
}
@@ -358,7 +357,7 @@ FxRoute * FxMixer::createRoute( FxChannel * from, FxChannel * to, float amount )
// add us to fxmixer's list
engine::fxMixer()->m_fxRoutes.append( route );
m_sendsMutex.unlock();
return route;
}
@@ -515,9 +514,6 @@ void FxMixer::masterMix( sampleFrame * _buf )
const float v = m_fxChannels[0]->m_volumeModel.value();
MixHelpers::addSanitizedMultiplied( _buf, m_fxChannels[0]->m_buffer, v, fpp );
m_fxChannels[0]->m_peakLeft *= engine::mixer()->masterGain();
m_fxChannels[0]->m_peakRight *= engine::mixer()->masterGain();
// clear all channel buffers and
// reset channel process state
for( int i = 0; i < numChannels(); ++i)
@@ -527,6 +523,7 @@ void FxMixer::masterMix( sampleFrame * _buf )
m_fxChannels[i]->m_queued = false;
// also reset hasInput
m_fxChannels[i]->m_hasInput = false;
m_fxChannels[i]->m_dependenciesMet = 0;
}
}
@@ -600,7 +597,7 @@ void FxMixer::saveSettings( QDomDocument & _doc, QDomElement & _this )
ch->m_sends[si]->amount()->saveSettings( _doc, sendsDom, "amount" );
}
}
}
}
// make sure we have at least num channels
void FxMixer::allocateChannelsTo(int num)

View File

@@ -70,14 +70,19 @@ void JournallingObject::addJournalCheckPoint()
QDomElement JournallingObject::saveState( QDomDocument & _doc,
QDomElement & _parent )
{
QDomElement _this = SerializingObject::saveState( _doc, _parent );
if( isJournalling() )
{
QDomElement _this = SerializingObject::saveState( _doc, _parent );
QDomElement journalNode = _doc.createElement( "journallingObject" );
journalNode.setAttribute( "id", id() );
journalNode.setAttribute( "metadata", true );
_this.appendChild( journalNode );
QDomElement journalNode = _doc.createElement( "journallingObject" );
journalNode.setAttribute( "id", id() );
journalNode.setAttribute( "metadata", true );
_this.appendChild( journalNode );
return _this;
return _this;
} else {
return QDomElement();
}
}

View File

@@ -168,5 +168,17 @@ void ProjectJournal::clearJournal()
}
}
void ProjectJournal::stopAllJournalling()
{
for( JoIdMap::Iterator it = m_joIDs.begin(); it != m_joIDs.end(); ++it)
{
if( it.value() != NULL )
{
it.value()->setJournalling(false);
}
}
setJournalling(false);
}

View File

@@ -942,6 +942,7 @@ void SampleBuffer::visualize( QPainter & _p, const QRect & _dr,
_p.drawPolyline( l, nb_frames / fpp );
_p.drawPolyline( r, nb_frames / fpp );
delete[] l;
delete[] r;
}

View File

@@ -523,7 +523,7 @@ AudioAlsa::setupWidget::setupWidget( QWidget * _parent ) :
AudioAlsa::setupWidget::~setupWidget()
{
delete m_channels->model();
}

View File

@@ -464,6 +464,7 @@ AudioJack::setupWidget::setupWidget( QWidget * _parent ) :
AudioJack::setupWidget::~setupWidget()
{
delete m_channels->model();
}

View File

@@ -356,7 +356,7 @@ AudioOss::setupWidget::setupWidget( QWidget * _parent ) :
AudioOss::setupWidget::~setupWidget()
{
delete m_channels->model();
}

View File

@@ -307,7 +307,7 @@ AudioPulseAudio::setupWidget::setupWidget( QWidget * _parent ) :
AudioPulseAudio::setupWidget::~setupWidget()
{
delete m_channels->model();
}

View File

@@ -289,7 +289,13 @@ void configManager::loadConfigFile()
node = node.nextSibling();
}
if( value( "paths", "artwork" ) != "" )
// don't use dated theme folders as they break the UI (i.e. 0.4 != 1.0, etc)
bool use_artwork_path =
root.attribute( "version" ).startsWith(
QString::number( LMMS_VERSION_MAJOR ) + "." +
QString::number( LMMS_VERSION_MINOR ) );
if( use_artwork_path && value( "paths", "artwork" ) != "" )
{
m_artworkDir = value( "paths", "artwork" );
if( !QDir( m_artworkDir ).exists() )

View File

@@ -115,6 +115,7 @@ void engine::init( const bool _has_gui )
void engine::destroy()
{
s_projectJournal->stopAllJournalling();
s_mixer->stopProcessing();
deleteHelper( &s_projectNotes );

View File

@@ -194,11 +194,12 @@ void FxMixerView::refreshDisplay()
for( int i = 1; i<m_fxChannelViews.size(); ++i )
{
chLayout->removeWidget(m_fxChannelViews[i]->m_fxLine);
m_racksLayout->removeWidget( m_fxChannelViews[i]->m_rackView );
delete m_fxChannelViews[i]->m_fader;
delete m_fxChannelViews[i]->m_muteBtn;
delete m_fxChannelViews[i]->m_fxLine;
delete m_fxChannelViews[i]->m_rackView;
delete m_fxChannelViews[i];
m_racksLayout->removeWidget( m_fxChannelViews[i]->m_rackView );
}
m_channelAreaWidget->adjustSize();
@@ -343,15 +344,14 @@ void FxMixerView::deleteChannel(int index)
// delete the view
chLayout->removeWidget(m_fxChannelViews[index]->m_fxLine);
m_racksLayout->removeWidget( m_fxChannelViews[index]->m_rackView );
delete m_fxChannelViews[index]->m_fader;
delete m_fxChannelViews[index]->m_muteBtn;
delete m_fxChannelViews[index]->m_fxLine;
delete m_fxChannelViews[index]->m_rackView;
delete m_fxChannelViews[index];
m_channelAreaWidget->adjustSize();
// delete the fx rack
m_racksLayout->removeWidget( m_fxChannelViews[index]->m_rackView );
// make sure every channel knows what index it is
for(int i=0; i<m_fxChannelViews.size(); ++i)
{
@@ -480,6 +480,11 @@ void FxMixerView::clear()
void FxMixerView::updateFaders()
{
FxMixer * m = engine::fxMixer();
// apply master gain
m->m_fxChannels[0]->m_peakLeft *= engine::mixer()->masterGain();
m->m_fxChannels[0]->m_peakRight *= engine::mixer()->masterGain();
for( int i = 0; i < m_fxChannelViews.size(); ++i )
{
const float opl = m_fxChannelViews[i]->m_fader->getPeak_L();

View File

@@ -529,6 +529,11 @@ void MainWindow::finalize()
setupDialog sd( setupDialog::AudioSettings );
sd.exec();
}
// reset window title every time we change the state of a subwindow to show the correct title
foreach( QMdiSubWindow * subWindow, workspace()->subWindowList() )
{
connect( subWindow, SIGNAL( windowStateChanged(Qt::WindowStates,Qt::WindowStates) ), this, SLOT( resetWindowTitle() ) );
}
}

View File

@@ -70,6 +70,11 @@
#include "text_float.h"
#if QT_VERSION < 0x040800
#define MiddleButton MidButton
#endif
typedef AutomationPattern::timeMap timeMap;

View File

@@ -253,10 +253,13 @@ ProjectRenderer* exportProjectDialog::prepRender()
static_cast<Mixer::qualitySettings::Interpolation>(interpolationCB->currentIndex()),
static_cast<Mixer::qualitySettings::Oversampling>(oversamplingCB->currentIndex()) );
const int samplerates[5] = { 44100, 48000, 88200, 96000, 192000 };
const int bitrates[6] = { 64, 128, 160, 192, 256, 320 };
ProjectRenderer::OutputSettings os = ProjectRenderer::OutputSettings(
samplerateCB->currentText().section(" ", 0, 0).toUInt(),
samplerates[ samplerateCB->currentIndex() ],
false,
bitrateCB->currentText().section(" ", 0, 0).toUInt(),
bitrates[ bitrateCB->currentIndex() ],
static_cast<ProjectRenderer::Depths>( depthCB->currentIndex() ) );
engine::getSong()->setExportLoop( exportLoopCB->isChecked() );

View File

@@ -28,6 +28,8 @@
#include <QtGui/QMouseEvent>
#include <QtGui/QScrollArea>
#include <algorithm> // for std::sort
#include "plugin_browser.h"
#include "embed.h"
#include "debug.h"

View File

@@ -86,7 +86,7 @@ const char * volume_help = QT_TRANSLATE_NOOP( "InstrumentTrack",
const int INSTRUMENT_WIDTH = 254;
const int INSTRUMENT_HEIGHT = INSTRUMENT_WIDTH;
const int PIANO_HEIGHT = 84;
const int PIANO_HEIGHT = 82;
const int INSTRUMENT_WINDOW_CACHE_SIZE = 8;