bugfixes and some small new features

git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@45 0778d3d1-df1d-0410-868b-ea421aaaa00d
This commit is contained in:
Tobias Doerffel
2006-01-09 10:31:28 +00:00
parent 052224c8e2
commit 4804108a1d
26 changed files with 896 additions and 143 deletions

326
ChangeLog
View File

@@ -1,3 +1,50 @@
2006-01-08 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* include/piano_roll.h:
* src/core/piano_roll.cpp:
* src/tracks/pattern.cpp:
simple support for editing (existing) steps in piano-roll, e.g. for
changing key of a step
* plugins/vestige/vestige.cpp:
per default switch to users VST-plugin-directory when opening plugin
* include/config_mgr.h:
* include/setup_dialog.h:
* src/core/config_mgr.cpp:
* src/core/setup_dialog.cpp:
added possibility to setup working-directory and location of VST-plugins
* src/widgets/tempo_sync_knob.cpp:
removed a lot of obsolete #include's
* include/piano_widget.h:
* src/core/note_play_handle.cpp:
* src/core/piano_widget.cpp:
display played keys as if they were pressed
* include/arp_and_chords_tab_widget.h:
* include/note_play_handle.h:
* src/core/arp_and_chords_tab_widget.cpp:
* src/core/note_play_handle.cpp:
added sort-mode for more powerful arpeggios
* src/core/arp_and_chords_tab_widget.cpp:
fixed bug which made the arpeggiator skipping notes sometimes at
certain arpeggio-times
* src/core/lmms_main_win.cpp:
commented out code for creating effect-board-window
* src/core/channel_track.cpp:
removed inclusion of paths.h which isn't part of LMMS for quite a long
while... - there were no problems because Linux has paths.h too
2006-01-06 dieEasy <dieeasy/at/cheapnet.it>
* locale/it.ts:
added Italian translation
2006-01-02 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* plugins/vestige/vestige.cpp:
@@ -275,6 +322,285 @@
* configure.in:
made 0.1.2 release
=======
2006-01-02 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* plugins/vestige/vestige.cpp:
set vestige-logo as window-icon of plugin-GUI-window
* src/core/instrument.cpp:
set logo of plugin as window-icon of channel-track
* include/dummy_instrument.h:
* include/dummy_plugin.h:
* include/instrument.h:
* include/plugin.h:
* src/core/instrument.cpp:
* src/core/plugin.cpp:
small changes in plugin-API: plugin now always has to pass pointer to
plugin-descriptor to plugin-dtor to make the latter one able to
provide several information
* src/core/plugin.cpp:
search for plugin-libs in configManager::pluginDir() which is
$prefix/lib/lmms - hopefully solves problems with finding plugins on
some systems
* include/channel_track.h:
* include/midi_tab_widget.h:
* src/core/midi_tab_widget.cpp:
* src/tracks/channel_track.cpp:
when using Raw-MIDI-client, make items "MIDI input/output" checkable
and enable/disable MIDI-input/output accordingly if user
checked/unchecked it and update check-state if user changed MIDI-mode
in midi-tab-widget in channel-track
* src/core/midi_tab_widget.cpp:
set MIDI-output-channel to 1 per default
* src/lib/sample_buffer.cpp:
added flac-files to filter of file-selection-dialog
* include/note_play_handle.h:
* src/core/note_play_handle.cpp:
when invalidating note-play-handle, do some stuff which actually would
be done by dtor if m_channelTrack wouldn't be NULL
2006-01-01 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* src/core/track.cpp:
added tooltip to track-op-widget telling the user something about
drag'n'drop-functionality...
* include/lmms_main_win.h:
* src/core/lmms_main_win.cpp:
* src/lib/string_pair_drag.cpp:
if main-window looses focus or a drag is completed, clear
key-modifiers of LMMS-main-window, because we might have lost
key-release-events in these cases and therefore our modifier-state-map
could be incorrect - fixes several bugs concerning drag'n'drop
* README:
* src/core/about_dialog.cpp:
extended copyright from 2005 to 2006 - Happy New Year!
2005-12-31 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* include/channel_track.h:
* src/tracks/channel_track.cpp:
removed surround-area in track-settings-widget and added button with
MIDI-connection-menu instead
2005-12-30 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* include/track.h:
* include/track_container.h:
* src/core/track.cpp:
* src/core/track_container.cpp:
revised all the things around track-operations:
- tracks are now directly movable via the grip at the beginning of a
track - replaces "move up/down"-buttons and is much more usable
- actions (clone/delete track) are now part of a popup-menu
* src/core/lmms_main_win.cpp:
- corrected file-description at the beginning
- add space at left side before adding tool-buttons
* src/core/midi_tab_widget.cpp:
use smaller font for connection-selection-menu
2005-12-29 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* src/widgets/fade_button.cpp:
do not update() directly in nextState(), use QTimer instead for avoiding
xlib-threading-errors
2005-12-28 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* plugins/vestige/communication.h:
* plugins/vestige/fstclient.cpp:
* plugins/vestige/fstclient.h:
* plugins/vestige/fstserver.cpp:
* plugins/vestige/vestige.cpp:
* plugins/vestige/vestige.h:
- support for telling plugin current BPM, also catches BPM-changes
- handle plugins without GUI correctly
* include/tool_button.h:
* src/widgets/tool_button.cpp:
catch toggle-signals to emit clicked()-signal which is neccessary if a
button is checked using setChecked()-method and not by the user -
fixes some bugs with piano-roll
* include/piano_roll.h:
* src/core/piano_roll.cpp:
- show text-float after user copied notes
- do not play note when just moving selection
- when update()ing paint everything in a pixmap which is painted in
paintEvent() - saves all the repaints everytime mouse-cursor is moved
and makes painting tool-cursor possible again
* src/tracks/channel_track.cpp:
corrected calculation in channelTrack::masterKey()
2005-12-27 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* include/piano_roll.h:
* src/core/piano_roll.cpp:
always reset cursor when receiving leave-event
* include/channel_track.h:
* src/tracks/channel_track.cpp:
use new fade-button as MIDI-event-indicator as well as simple
play-default-tone-button
* include/fade_button.h:
* src/widgets/fade_button.cpp:
added fade-button which can be activated and fades back to
default-color afterwards
* src/core/arp_and_chords_tab_widget.cpp:
* src/core/envelope_and_lfo_widget.cpp:
* src/core/envelope_tab_widget.cpp:
* src/core/midi_tab_widget.cpp:
* src/core/note.cpp:
* src/core/song_editor.cpp:
* src/core/track.cpp:
* src/tracks/bb_track.cpp:
* src/tracks/channel_track.cpp:
* src/tracks/sample_track.cpp:
do not use QString::number() for saving scalar value with
setAttribute() as it is obsolete
* src/audio/audio_alsa.cpp:
* src/audio/audio_oss.cpp:
start audio-thread with QThread::HightestPriority for having less xruns
* src/tracks/pattern.cpp:
save m_steps-property, otherwise restoring it in loadSettings() makes
no sense... - fixes bug which caused LMMS to always reset number of
steps to 16 when loading files, even if the user created patterns
containing more than 16 steps
* include/audio_dummy.h:
- fixed missing implementation of thread running the whole time and
calling audioDevice::processNextBuffer() -> fixes bugs & lockups when
using audio-dummy-driver
- thread now always waits the amount of time that is left for the
current buffer, so if rendering of current buffer went faster than
in realtime, the song doesn't play at a higher speed
2005-12-26 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* plugins/vestige/vestige.cpp:
determine real key of note using channelTrack::masterKey
* include/micro_timer.h:
moved micro-timer-class from mixer.cpp in separate header for being
available to all modules of LMMS
* src/core/mixer.cpp:
added metronome-sounds when recording in piano-roll
* src/lib/sample_buffer.cpp:
- added resample()-method for resampling whole sample-buffer
- after libsndfile try to load sample with libvorbis instead of
SDL_sound as the latter one seems to be buggy on few systems and
leads to unexpected crashes
- if sample-decoder doesn't resample sample automatically, do it
afterwards using resample()
* src/core/track_container.cpp:
accept drops of type samplefile and sampledata too and create new
channel-track with AudioFileProcessor
* plugins/audio_file_processor/audio_file_processor.cpp:
save/load sample-data which was dragged on plugin in settings
* src/core/track.cpp:
display correct length and now additionally start- and end-position of
track-content-object
* include/bb_track.h:
* src/tracks/bb_track.cpp:
do not align position and length of bb-track-objects on tact-boundaries
as it offers an interesting new feature (incomplete/start beats etc.!)
2005-12-25 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* src/widgets/visualization_widget.cpp:
enable visualization-widget per default
* plugins/vestige/vestige.cpp:
- do not crash when loading settings with empty plugin-attribute (e.g.
older projects/presets)
- set channel-name according to plugin-name
- added note-off-button for being able to note off hanging notes
(which sometimes occurs in combination with arpeggios)
2005-12-24 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* plugins/vestige/vestige.cpp:
use new parameter-saving/loading-feature when saving/loading settings
* plugins/vestige/communication.h:
* plugins/vestige/fstclient.cpp:
* plugins/vestige/fstclient.h:
* plugins/vestige/fstserver.cpp:
* plugins/vestige/fstserver.h:
* plugins/vestige/fstcore.c:
- added support for saving/loading parameters which almost completes
LMMS's rudimentary VST-support
- support for querying parameter-properties
- some changes in initialization of plugin
* src/tracks/pattern.cpp:
pass unused wheel-events to trackContentObect for being able to scroll
within song-editor
2005-12-23 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* plugins/vestige/fstcore.c:
a lot of clean-ups and other bug-fixes making VeSTige almost usable
and stable
* plugins/vestige/fstclient.h:
* plugins/vestige/fstclient.cpp:
save PID of children when fork()ing XFST-server which is used for
sending SIGTERM when destroying everything
* plugins/vestige/communication.h:
* plugins/vestige/fstclient.cpp:
* plugins/vestige/fstserver.cpp:
* plugins/vestige/fstcore.c:
do not show editor until client created x11-embed-widget - solves
problems with not-embedded plugins under KDE
* plugins/vestige/fstserver.cpp:
rewrote MIDI-enqueueing-code as the old one was very buggy and
unreliable
* plugins/vestige/vestige.h:
* plugins/vestige/vestige.cpp:
added mutex for plugin which solves some problems
* include/mixer.h:
* src/core/mixer.cpp:
per default clear all play-handles but instrument-play-handles in
mixer::clear() as instrument-playhandles normally exist during the
whole life-time of a certain plugin and must not be deleted when just
stopping song etc.
* include/play_handle.h:
added type-information, so every derived class has to pass a
type-constant to playHandle-constructor
2005-12-22 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* configure.in:
made 0.1.2 release
>>>>>>> 1.27
2005-12-21 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* src/lib/sample_buffer.cpp:

View File

@@ -2,8 +2,13 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.50)
<<<<<<< configure.in
AC_INIT(lmms, 0.1.2-cvs20060108, tobydox/at/users.sourceforge.net)
AM_INIT_AUTOMAKE(lmms, 0.1.2-cvs20060108)
=======
AC_INIT(lmms, 0.1.2-cvs20060102, tobydox/at/users.sourceforge.net)
AM_INIT_AUTOMAKE(lmms, 0.1.2-cvs20060102)
>>>>>>> 1.26
AM_CONFIG_HEADER(config.h)

View File

@@ -2,7 +2,7 @@
* arp_and_chords_tab_widget.h - declaration of class arpAndChordWidget which
* provides code for using arpeggio and chords
*
* Copyright (c) 2004-2005 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2004-2006 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -53,6 +53,7 @@ class QPixmap;
class channelTrack;
class groupBox;
class knob;
class ledCheckBox;
class notePlayHandle;
class pixmapButton;
class tempoSyncKnob;
@@ -132,6 +133,8 @@ private:
pixmapButton * m_arpUpAndDownBtn;
pixmapButton * m_arpRandomBtn;
ledCheckBox * m_sortMode;
} ;

View File

@@ -1,7 +1,7 @@
/*
* audio_device.h - base-class for audio-devices, used by LMMS-mixer
*
* Copyright (c) 2004-2005 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2004-2006 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -112,7 +112,7 @@ public:
public:
setupWidget( const QString & _caption, QWidget * _parent ) :
tabWidget( tabWidget::tr( "Settings for %1" ).arg(
_caption ), _parent )
_caption ).toUpper(), _parent )
{
}

View File

@@ -1,7 +1,7 @@
/*
* config_mgr.h - class configManager, a class for managing LMMS-configuration
*
* Copyright (c) 2005 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2005-2006 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -82,35 +82,45 @@ public:
return( s_instanceOfMe );
}
const QString & lmmsWorkingDir( void ) const
const QString & workingDir( void ) const
{
return( m_lmmsWorkingDir );
}
QString projectsDir( void ) const
{
return( m_lmmsWorkingDir + PROJECTS_PATH );
}
QString presetsDir( void ) const
{
return( m_lmmsWorkingDir + PRESETS_PATH );
}
QString samplesDir( void ) const
{
return( m_lmmsWorkingDir + SAMPLES_PATH );
}
QString artworkDir( void ) const
{
return( m_lmmsDataDir + ARTWORK_PATH );
}
QString localeDir( void ) const
{
return( m_lmmsDataDir + LOCALE_PATH );
}
const QString & pluginDir( void ) const
{
return( m_lmmsPluginDir );
return( m_workingDir );
}
QString projectsDir( void ) const
{
return( m_workingDir + PROJECTS_PATH );
}
QString presetsDir( void ) const
{
return( m_workingDir + PRESETS_PATH );
}
QString samplesDir( void ) const
{
return( m_workingDir + SAMPLES_PATH );
}
QString artworkDir( void ) const
{
return( m_dataDir + ARTWORK_PATH );
}
QString localeDir( void ) const
{
return( m_dataDir + LOCALE_PATH );
}
const QString & pluginDir( void ) const
{
return( m_pluginDir );
}
const QString & vstDir( void ) const
{
return( m_vstDir );
}
const QString & value( const QString & _class,
const QString & _attribute ) const;
@@ -121,9 +131,13 @@ public:
void saveConfigFile( void );
public slots:
void setWorkingDir( const QString & _wd );
void setVSTDir( const QString & _wd );
protected slots:
void openWorkingDir( void );
void setWorkingDir( const QString & _wd );
virtual void accept( void );
@@ -152,9 +166,10 @@ private:
const QString m_lmmsRcFile;
QString m_lmmsWorkingDir;
QString m_lmmsDataDir;
QString m_lmmsPluginDir;
QString m_workingDir;
QString m_dataDir;
QString m_pluginDir;
QString m_vstDir;
typedef vvector<QPair<QString, QString> > stringPairVector;
typedef QMap<QString, stringPairVector> settingsMap;

View File

@@ -1,7 +1,7 @@
/*
* midi_client.h - base-class for MIDI-clients like ALSA-sequencer-client
*
* Copyright (c) 2005 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2005-2006 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -116,7 +116,7 @@ public:
public:
setupWidget( const QString & _caption, QWidget * _parent ) :
tabWidget( tabWidget::tr( "Settings for %1" ).arg(
_caption ), _parent )
_caption ).toUpper(), _parent )
{
}

View File

@@ -1,7 +1,7 @@
/*
* mixer.h - audio-device-independent mixer for LMMS
*
* Copyright (c) 2004-2005 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2004-2006 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -196,6 +196,11 @@ public:
m_playHandlesToRemove.push_back( _ph );
}
inline const playHandleVector & playHandles( void ) const
{
return( m_playHandles );
}
void checkValidityOfPlayHandles( void );

View File

@@ -2,7 +2,7 @@
* note.h - declaration of class note which contains all informations about a
* note + definitions of several constants and enums
*
* Copyright (c) 2004-2005 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2004-2006 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -96,7 +96,9 @@ public:
tones _tone = A, octaves _octave = DEFAULT_OCTAVE,
volume _volume = DEFAULT_VOLUME,
panning _panning = DEFAULT_PANNING ) FASTCALL;
~note();
void FASTCALL setLength( const midiTime & _length );
void FASTCALL setPos( const midiTime & _pos );
void FASTCALL setTone( tones _tone = C );
@@ -104,38 +106,47 @@ public:
void FASTCALL setKey( int _key );
void FASTCALL setVolume( volume _volume = DEFAULT_VOLUME );
void FASTCALL setPanning( panning _panning = DEFAULT_PANNING );
inline midiTime endPos( void ) const
{
return( m_pos + m_length);
}
inline const midiTime & length( void ) const
{
return( m_length );
}
inline const midiTime & pos( void ) const
{
return( m_pos );
}
inline midiTime pos( midiTime _base_pos ) const
{
return( m_pos - _base_pos );
}
inline tones tone( void ) const
{
return( m_tone );
}
inline octaves octave( void ) const
{
return( m_octave );
}
inline int key( void ) const
{
return( m_octave * NOTES_PER_OCTAVE + m_tone );
}
inline volume getVolume( void ) const
{
return( m_volume );
}
inline panning getPanning( void ) const
{
return( m_panning );

View File

@@ -38,6 +38,7 @@ class channelTrack;
class notePlayHandle;
typedef vvector<notePlayHandle *> notePlayHandleVector;
typedef vvector<const notePlayHandle *> constNotePlayHandleVector;
class notePlayHandle : public playHandle, public note
@@ -138,6 +139,11 @@ public:
return( m_arpNote );
}
inline void setArpNote( bool _on )
{
m_arpNote = _on;
}
// returns whether note is base-note for arpeggio
inline bool arpBaseNote( void ) const
{
@@ -151,6 +157,17 @@ public:
void mute( void );
// returns index of note-play-handle in vector of note-play-handles
// belonging to this channel
int index( void ) const;
// note-play-handles belonging to given channel
static constNotePlayHandleVector nphsOfChannelTrack(
const channelTrack * _ct );
// return whether given note-play-handle is equal to *this
bool operator==( const notePlayHandle & _nph ) const;
private:
channelTrack * m_channelTrack; // needed for calling

View File

@@ -2,7 +2,7 @@
* piano_roll.h - declaration of class pianoRoll which is a window where you
* can set and edit notes in an easy way
*
* Copyright (c) 2004-2005 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2004-2006 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -108,8 +108,10 @@ protected:
virtual void wheelEvent( QWheelEvent * _we );
int FASTCALL getKey( int _y );
inline void drawNoteRect( QPainter & _p, Uint16 _x, Uint16 _y,
Sint16 _width, bool _is_selected );
static inline void drawNoteRect( QPainter & _p, Uint16 _x, Uint16 _y,
Sint16 _width,
const bool _is_selected,
const bool _is_step_note );
void removeSelection( void );
void selectAll( void );
void FASTCALL getSelectedNotes( noteVector & _selected_notes );

View File

@@ -2,7 +2,7 @@
* piano_widget.h - declaration of class pianoWidget, a widget which provides
* an interactive piano/keyboard-widget
*
* Copyright (c) 2004-2005 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2004-2006 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -45,6 +45,7 @@
#include "note.h"
#include "templates.h"
class channelTrack;
@@ -65,6 +66,13 @@ public:
pianoWidget( channelTrack * _channel_track );
virtual ~pianoWidget();
inline void setKeyState( int _key, bool _on = FALSE )
{
m_pressedKeys[tLimit( _key, 0, NOTES_PER_OCTAVE *
OCTAVES -1 )] = _on;
update();
}
protected:
virtual void paintEvent( QPaintEvent * );

View File

@@ -2,7 +2,7 @@
* play_handle.h - base-class playHandle which is needed by
* LMMS-Player-Engine
*
* Copyright (c) 2004-2005 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2004-2006 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -87,6 +87,7 @@ private:
typedef vvector<playHandle *> playHandleVector;
typedef vvector<const playHandle *> constPlayHandleVector;
#endif

View File

@@ -139,6 +139,7 @@ inline QString baseName( const QString & _file )
// QString
#define toLower lower
#define toUpper upper
// QTextEdit

View File

@@ -47,6 +47,7 @@
class QComboBox;
class QLabel;
class QLineEdit;
class QSlider;
class tabBar;
@@ -75,6 +76,10 @@ private slots:
void resetBufSize( void );
void displayBufSizeHelp( void );
// directory settings widget
void setWorkingDir( const QString & _wd );
void setVSTDir( const QString & _vd );
// audio settings widget
void audioInterfaceChanged( const QString & _driver );
void displayAudioHelp( void );
@@ -89,6 +94,10 @@ private slots:
void toggleGIMPLikeWindows( bool _enabled );
void openWorkingDir( void );
void openVSTDir( void );
private:
tabBar * m_tabBar;
@@ -101,6 +110,13 @@ private:
bool m_gimpLikeWindows;
QLineEdit * m_wdLineEdit;
QLineEdit * m_vdLineEdit;
QString m_workingDir;
QString m_vstDir;
typedef QMap<QString, audioDevice::setupWidget *> aswMap;
typedef QMap<QString, midiClient::setupWidget *> mswMap;

View File

@@ -1,7 +1,7 @@
/*
* tempo_sync_knob.h - adds bpm to ms conversion for knob class
*
* Copyright (c) 2005 Danny McRae <khjklujn@yahoo.com>
* Copyright (c) 2005 Danny McRae <khjklujn/at/yahoo.com>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*

View File

@@ -388,7 +388,7 @@ void vestigeInstrument::openPlugin( void )
}
else
{
dir = QDir::home().path();
dir = configManager::inst()->vstDir();
}
// change dir to position of previously opened file
ofd.setDirectory( dir );

Binary file not shown.

View File

@@ -2,7 +2,7 @@
* arp_and_chords_tab_widget.cpp - widget for use in arp/chord-tab of
* channel-window
*
* Copyright (c) 2004-2005 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2004-2006 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -41,8 +41,6 @@
#include <qcombobox.h>
#include <qwhatsthis.h>
#define setChecked setOn
#endif
@@ -62,6 +60,7 @@
#include "gui_templates.h"
#include "tempo_sync_knob.h"
#include "channel_track.h"
#include "led_checkbox.h"
@@ -153,9 +152,9 @@ arpAndChordsTabWidget::chord arpAndChordsTabWidget::s_chords[] =
{ arpAndChordsTabWidget::tr( "Diminished" ), { 0, 2, 3, 5, 6, 8, 9,
11, -1 } },
{ arpAndChordsTabWidget::tr( "Major pentatonic" ), { 0, 2, 4, 7, 10,
-1 } },
-1 } },
{ arpAndChordsTabWidget::tr( "Minor pentatonic" ), { 0, 3, 5, 7, 10,
-1 } },
-1 } },
{ arpAndChordsTabWidget::tr( "Jap in sen" ), { 0, 1, 5, 7, 10, -1 } },
{ arpAndChordsTabWidget::tr( "Major bebop" ), { 0, 2, 4, 5, 7, 8, 9,
11, -1 } },
@@ -164,7 +163,7 @@ arpAndChordsTabWidget::chord arpAndChordsTabWidget::s_chords[] =
{ arpAndChordsTabWidget::tr( "Blues" ), { 0, 3, 5, 6, 7, 10, -1 } },
{ arpAndChordsTabWidget::tr( "Arabic" ), { 0, 1, 4, 5, 7, 8, 11, -1 } },
{ arpAndChordsTabWidget::tr( "Enigmatic" ), { 0, 1, 4, 6, 8, 10, 11,
-1 } },
-1 } },
{ arpAndChordsTabWidget::tr( "Neopolitan" ), { 0, 1, 3, 5, 7, 9, 11,
-1 } },
{ arpAndChordsTabWidget::tr( "Neopolitan minor" ), { 0, 1, 3, 5, 7, 9,
@@ -173,14 +172,14 @@ arpAndChordsTabWidget::chord arpAndChordsTabWidget::s_chords[] =
11, -1 } },
{ arpAndChordsTabWidget::tr( "Dorian" ), { 0, 2, 3, 5, 7, 9, 10, -1 } },
{ arpAndChordsTabWidget::tr( "Phrygolydian" ), { 0, 1, 3, 5, 7, 8, 10,
-1 } },
-1 } },
{ arpAndChordsTabWidget::tr( "Lydian" ), { 0, 2, 4, 6, 7, 9, 11, -1 } },
{ arpAndChordsTabWidget::tr( "Mixolydian" ), { 0, 2, 4, 5, 7, 9, 10,
-1 } },
-1 } },
{ arpAndChordsTabWidget::tr( "Aeolian" ), { 0, 2, 3, 5, 7, 8, 10,
-1 } },
-1 } },
{ arpAndChordsTabWidget::tr( "Locrian" ), { 0, 1, 3, 5, 6, 8, 10,
-1 } },
-1 } },
{ "", { -1, -1 } }
@@ -323,13 +322,13 @@ arpAndChordsTabWidget::arpAndChordsTabWidget( channelTrack * _channel_track ) :
"can make cool staccato-arpeggios." ) );
m_arpDirectionLbl = new QLabel( tr( "DIRECTION:" ), m_arpGroupBox );
m_arpDirectionLbl->setGeometry( 10, 70, 64, 8 );
m_arpDirectionLbl->setFont( pointSize<6>( m_arpDirectionLbl->font() ) );
m_arpDirectionLbl->setGeometry( 10, 60, 64, 8 );
m_arpDirectionLbl->setFont( pointSize<7>( m_arpDirectionLbl->font() ) );
m_arpUpBtn = new pixmapButton( m_arpGroupBox );
m_arpUpBtn->move( 70, 70 );
m_arpUpBtn->move( 70, 60 );
m_arpUpBtn->setActiveGraphic( embed::getIconPixmap( "arp_up_on" ) );
m_arpUpBtn->setInactiveGraphic( embed::getIconPixmap( "arp_up_off" ) );
#ifdef QT4
@@ -345,7 +344,7 @@ arpAndChordsTabWidget::arpAndChordsTabWidget( channelTrack * _channel_track ) :
SLOT( arpUpToggled( bool ) ) );
m_arpDownBtn = new pixmapButton( m_arpGroupBox );
m_arpDownBtn->move( 90, 70 );
m_arpDownBtn->move( 90, 60 );
m_arpDownBtn->setActiveGraphic( embed::getIconPixmap( "arp_down_on" ) );
m_arpDownBtn->setInactiveGraphic( embed::getIconPixmap(
"arp_down_off" ) );
@@ -357,7 +356,7 @@ arpAndChordsTabWidget::arpAndChordsTabWidget( channelTrack * _channel_track ) :
SLOT( arpDownToggled( bool ) ) );
m_arpUpAndDownBtn = new pixmapButton( m_arpGroupBox );
m_arpUpAndDownBtn->move( 110, 70 );
m_arpUpAndDownBtn->move( 110, 60 );
m_arpUpAndDownBtn->setActiveGraphic( embed::getIconPixmap(
"arp_up_and_down_on" ) );
m_arpUpAndDownBtn->setInactiveGraphic( embed::getIconPixmap(
@@ -371,7 +370,7 @@ arpAndChordsTabWidget::arpAndChordsTabWidget( channelTrack * _channel_track ) :
SLOT( arpUpAndDownToggled( bool ) ) );
m_arpRandomBtn = new pixmapButton( m_arpGroupBox );
m_arpRandomBtn->move( 130, 70 );
m_arpRandomBtn->move( 130, 60 );
m_arpRandomBtn->setActiveGraphic( embed::getIconPixmap(
"arp_random_on" ) );
m_arpRandomBtn->setInactiveGraphic( embed::getIconPixmap(
@@ -392,6 +391,10 @@ arpAndChordsTabWidget::arpAndChordsTabWidget( channelTrack * _channel_track ) :
#ifndef QT4
m_arpDirections_group->hide();
#endif
m_sortMode = new ledCheckBox( tr( "SORT-MODE" ), m_arpGroupBox );
m_sortMode->move( 10, 90 );
}
@@ -485,28 +488,40 @@ void arpAndChordsTabWidget::processNote( notePlayHandle * _n )
const int selected_arp = m_arpComboBox->currentItem();
#endif
constNotePlayHandleVector cnphv = notePlayHandle::nphsOfChannelTrack(
_n->getChannelTrack() );
// VERY unlikely, but better check this before ending in a crash
if( cnphv.size() == 0 )
{
return;
}
const int cur_chord_size = getChordSize( s_chords[selected_arp] );
const int total_range = (int)( cur_chord_size *
m_arpRangeKnob->value() );
const int range = (int)( cur_chord_size * m_arpRangeKnob->value() );
const int total_range = range * cnphv.size();
// number of frames that every note should be played
const Uint32 arp_frames = (Uint32)( m_arpTimeKnob->value() / 1000.0f *
mixer::inst()->sampleRate() );
const Uint32 gated_frames = (Uint32)( m_arpGateKnob->value() *
arp_frames / 100.0f );
// used for calculating remaining frames for arp-note, we have to add
// arp_frames-1, otherwise the first arp-note will not be setup
// correctly... -> arp_frames frames silence at the start of every note!
int cur_frame = _n->totalFramesPlayed() + arp_frames - 1;
int cur_frame = ( ( m_sortMode->isChecked() == TRUE ) ?
cnphv.first()->totalFramesPlayed() :
_n->totalFramesPlayed() )
+ arp_frames - 1;
// used for loop
Uint32 frames_processed = 0;
// len for all arp-notes (depending on arp-time)
while( frames_processed < mixer::inst()->framesPerAudioBuffer() )
{
const Uint32 remaining_frames_for_cur_arp = arp_frames -
( cur_frame % arp_frames );
// does current arp-note fill whole audio-buffer?
if( remaining_frames_for_cur_arp >=
if( remaining_frames_for_cur_arp >
mixer::inst()->framesPerAudioBuffer() )
{
// then we don't have to do something!
@@ -518,36 +533,46 @@ void arpAndChordsTabWidget::processNote( notePlayHandle * _n )
// init with zero
int cur_arp_idx = 0;
if( m_sortMode->isChecked() == TRUE &&
( ( cur_frame / arp_frames ) % total_range ) /
range != (csize) _n->index() )
{
// update counters
frames_processed += arp_frames;
cur_frame += arp_frames;
break;
}
// process according to arpeggio-direction...
if( m_arpDirection == UP )
{
cur_arp_idx = ( cur_frame / arp_frames ) % total_range;
cur_arp_idx = ( cur_frame / arp_frames ) % range;
}
else if( m_arpDirection == DOWN )
{
cur_arp_idx = total_range - ( cur_frame / arp_frames ) %
total_range - 1;
cur_arp_idx = range - ( cur_frame / arp_frames ) %
range - 1;
}
else if( m_arpDirection == UP_AND_DOWN && total_range > 1 )
else if( m_arpDirection == UP_AND_DOWN && range > 1 )
{
// imagine, we had to play the arp once up and then
// once down -> makes 2 * total_range possible notes...
// once down -> makes 2 * range possible notes...
// because we don't play the lower and upper notes
// twice, we have to subtract 2
cur_arp_idx = ( cur_frame / arp_frames ) %
( total_range * 2 - 2 );
// if greater than total_range, we have to play down...
( range * 2 - 2 );
// if greater than range, we have to play down...
// looks like the code for arp_dir==DOWN... :)
if( cur_arp_idx >= total_range )
if( cur_arp_idx >= range )
{
cur_arp_idx = total_range - cur_arp_idx %
( total_range - 1 ) - 1;
cur_arp_idx = range - cur_arp_idx %
( range - 1 ) - 1;
}
}
else if( m_arpDirection == RANDOM )
{
// just pick a random chord-index
cur_arp_idx = (int)( total_range * ( (float) rand() /
cur_arp_idx = (int)( range * ( (float) rand() /
(float) RAND_MAX ) );
}
@@ -584,20 +609,27 @@ void arpAndChordsTabWidget::processNote( notePlayHandle * _n )
// and is_arp_note=TRUE
notePlayHandle * note_play_handle = new notePlayHandle(
_n->getChannelTrack(),
_n->framesAhead() +
( ( m_sortMode->isChecked() == TRUE ) ?
cnphv.first()->framesAhead() :
_n->framesAhead() ) +
frames_processed,
gated_frames,
&new_note,
TRUE );
// add sub-note to base-note, now all stuff is done by
// notePlayHandle::play_note()
// add sub-note to base-note - now all stuff is done by
// notePlayHandle::playNote()
_n->addSubNote( note_play_handle );
// update counters
frames_processed += arp_frames;
cur_frame += arp_frames;
}
// make sure, note is handled as arp-base-note, even if we didn't add a
// sub-note so far
_n->setArpNote( TRUE );
}
@@ -607,6 +639,9 @@ void arpAndChordsTabWidget::saveSettings( QDomDocument & _doc,
QDomElement & _parent )
{
QDomElement act_de = _doc.createElement( nodeName() );
<<<<<<< arp_and_chords_tab_widget.cpp
act_de.setAttribute( "chorddisabled", !m_chordsGroupBox->isActive() );
=======
act_de.setAttribute( "chorddisabled", !m_chordsGroupBox->isActive() );
#ifdef QT4
act_de.setAttribute( "chord", m_chordsComboBox->currentIndex() );
@@ -615,6 +650,32 @@ void arpAndChordsTabWidget::saveSettings( QDomDocument & _doc,
#endif
act_de.setAttribute( "chordrange", m_chordRangeKnob->value() );
act_de.setAttribute( "arpdisabled", !m_arpGroupBox->isActive() );
>>>>>>> 1.11
#ifdef QT4
<<<<<<< arp_and_chords_tab_widget.cpp
act_de.setAttribute( "chord", m_chordsComboBox->currentIndex() );
=======
act_de.setAttribute( "arp", m_arpComboBox->currentIndex() );
>>>>>>> 1.11
#else
<<<<<<< arp_and_chords_tab_widget.cpp
act_de.setAttribute( "chord", m_chordsComboBox->currentItem() );
=======
act_de.setAttribute( "arp", m_arpComboBox->currentItem() );
>>>>>>> 1.11
#endif
<<<<<<< arp_and_chords_tab_widget.cpp
act_de.setAttribute( "chordrange", m_chordRangeKnob->value() );
=======
act_de.setAttribute( "arprange", m_arpRangeKnob->value() );
act_de.setAttribute( "arptime", m_arpTimeKnob->value() );
act_de.setAttribute( "arpgate", m_arpGateKnob->value() );
act_de.setAttribute( "arpdir", m_arpDirection );
act_de.setAttribute( "arpsyncmode",
( int ) m_arpTimeKnob->getSyncMode() );
>>>>>>> 1.11
act_de.setAttribute( "arpdisabled", !m_arpGroupBox->isActive() );
#ifdef QT4
act_de.setAttribute( "arp", m_arpComboBox->currentIndex() );
@@ -628,7 +689,7 @@ void arpAndChordsTabWidget::saveSettings( QDomDocument & _doc,
act_de.setAttribute( "arpsyncmode",
( int ) m_arpTimeKnob->getSyncMode() );
act_de.setAttribute( "sortmode", m_sortMode->isChecked() );
_parent.appendChild( act_de );
}
@@ -659,6 +720,8 @@ void arpAndChordsTabWidget::loadSettings( const QDomElement & _this )
( tempoSyncKnob::tempoSyncMode ) _this.attribute(
"arpsyncmode" ).toInt() );
m_sortMode->setChecked( _this.attribute( "sortmode" ).toInt() );
m_arpGroupBox->setState( m_arpDirection != OFF &&
!_this.attribute( "arpdisabled" ).toInt() );
switch( m_arpDirection )

View File

@@ -1,7 +1,7 @@
/*
* config_mgr.cpp - implementation of class configManager
*
* Copyright (c) 2005 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2005-2006 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -59,6 +59,8 @@
#include <qradiobutton.h>
#include <qapplication.h>
#define absolutePath absPath
#ifndef __USE_XOPEN_EXTENDED
#define __USE_XOPEN_EXTENDED
#endif
@@ -153,31 +155,27 @@ configManager * configManager::s_instanceOfMe = NULL;
configManager::configManager( void ) :
QDialog(),
#ifdef QT4
m_lmmsRcFile( QDir::home().absolutePath() + "/.lmmsrc.xml" ),
m_lmmsWorkingDir( QDir::home().absolutePath() + "/lmms" ),
#else
m_lmmsRcFile( QDir::home().absPath() + "/.lmmsrc.xml" ),
m_lmmsWorkingDir( QDir::home().absPath() + "/lmms" ),
#endif
m_workingDir( QDir::home().absolutePath() + "/lmms" ),
#if QT_VERSION >= 0x030200
m_lmmsDataDir( qApp->applicationDirPath().section( '/', 0, -2 ) +
m_dataDir( qApp->applicationDirPath().section( '/', 0, -2 ) +
"/share/lmms/" ),
#else
// hardcode since qt < 3.2 doesn't know something like
// applicationDirPath and implementing own function would be senseless
// since real support for qt < 3.2 is senseless too ;-)
m_lmmsDataDir( "/usr/share/lmms" ),
m_dataDir( "/usr/share/lmms" ),
#endif
#if QT_VERSION >= 0x030200
m_lmmsPluginDir( qApp->applicationDirPath().section( '/', 0, -2 ) +
m_pluginDir( qApp->applicationDirPath().section( '/', 0, -2 ) +
"/lib/lmms/" ),
#else
// hardcode since qt < 3.2 doesn't know something like
// applicationDirPath and implementing own function would be senseless
// since real support for qt < 3.2 is senseless too ;-)
m_lmmsPluginDir( "/usr/lib/lmms" ),
m_pluginDir( "/usr/lib/lmms" ),
#endif
m_vstDir( QDir::home().absolutePath() ),
m_currentPage( 0 )
{
}
@@ -335,8 +333,7 @@ void configManager::createWidgets( void )
workingdir_input_fields_layout->setSpacing( 10 );
workingdir_input_fields_layout->setMargin( 0 );
m_wdLineEdit = new QLineEdit( m_lmmsWorkingDir,
workingdir_input_fields );
m_wdLineEdit = new QLineEdit( m_workingDir, workingdir_input_fields );
connect( m_wdLineEdit, SIGNAL( textChanged( const QString & ) ), this,
SLOT( setWorkingDir( const QString & ) ) );
@@ -516,12 +513,11 @@ void configManager::openWorkingDir( void )
{
#ifdef QT4
QString new_dir = QFileDialog::getExistingDirectory( this,
tr( "Choose LMMS-working-directory" ),
m_lmmsWorkingDir );
tr( "Choose LMMS working directory" ),
m_workingDir );
#else
QString new_dir = QFileDialog::getExistingDirectory( m_lmmsWorkingDir,
0, 0,
tr( "Choose LMMS-working-directory" ),
QString new_dir = QFileDialog::getExistingDirectory( m_workingDir, 0, 0,
tr( "Choose LMMS working directory" ),
TRUE );
#endif
if( new_dir != QString::null )
@@ -535,7 +531,15 @@ void configManager::openWorkingDir( void )
void configManager::setWorkingDir( const QString & _wd )
{
m_lmmsWorkingDir = _wd;
m_workingDir = _wd;
}
void configManager::setVSTDir( const QString & _vd )
{
m_vstDir = _vd;
}
@@ -543,11 +547,11 @@ void configManager::setWorkingDir( const QString & _wd )
void configManager::accept( void )
{
if( m_lmmsWorkingDir.right( 1 ) != "/" )
if( m_workingDir.right( 1 ) != "/" )
{
m_lmmsWorkingDir += '/';
m_workingDir += '/';
}
if( !QDir( m_lmmsWorkingDir ).exists() )
if( !QDir( m_workingDir ).exists() )
{
if( QMessageBox::
#if QT_VERSION >= 0x030200
@@ -562,7 +566,7 @@ void configManager::accept( void )
QMessageBox::Yes, QMessageBox::No )
== QMessageBox::Yes )
{
mkPath( m_lmmsWorkingDir );
mkPath( m_workingDir );
}
else
{
@@ -570,23 +574,21 @@ void configManager::accept( void )
return;
}
}
processFilesRecursively( m_lmmsDataDir + "samples/", m_lmmsWorkingDir +
processFilesRecursively( m_dataDir + "samples/", m_workingDir +
"samples/",
m_samplesCopyRB->isChecked() ?
&copyFile :
&linkFile );
processFilesRecursively( m_lmmsDataDir + "presets/", m_lmmsWorkingDir +
processFilesRecursively( m_dataDir + "presets/", m_workingDir +
"presets/",
m_presetsCopyRB->isChecked() ?
&copyFile :
&linkFile );
processFilesRecursively( m_lmmsDataDir + "projects/", m_lmmsWorkingDir +
processFilesRecursively( m_dataDir + "projects/", m_workingDir +
"projects/",
m_projectsCopyRB->isChecked() ?
&copyFile :
&linkFile );
setValue( "paths", "workingdir", m_lmmsWorkingDir );
saveConfigFile();
QDialog::accept();
@@ -825,7 +827,13 @@ bool configManager::loadConfigFile( void )
node = node.nextSibling();
}
m_lmmsWorkingDir = value( "paths", "workingdir" );
m_workingDir = value( "paths", "workingdir" );
m_vstDir = value( "paths", "vstdir" );
if( m_vstDir == "" )
{
m_vstDir = QDir::home().absolutePath();
}
return( TRUE );
}
@@ -835,6 +843,9 @@ bool configManager::loadConfigFile( void )
void configManager::saveConfigFile( void )
{
setValue( "paths", "workingdir", m_workingDir );
setValue( "paths", "vstdir", m_vstDir );
QDomDocument doc( "lmms-config-file" );
QDomElement lmms_config = doc.createElement( "lmms" );

View File

@@ -32,6 +32,7 @@
#include "midi.h"
#include "midi_port.h"
#include "song_editor.h"
#include "piano_widget.h"
@@ -57,6 +58,7 @@ notePlayHandle::notePlayHandle( channelTrack * _chnl_trk,
m_muted( FALSE )
{
setFrames( _frames );
m_channelTrack->m_pianoWidget->setKeyState( key(), TRUE );
// send MIDI-note-on-event
m_channelTrack->processOutEvent( midiEvent( NOTE_ON,
m_channelTrack->m_midiPort->outputChannel(),
@@ -241,6 +243,7 @@ void notePlayHandle::noteOff( Uint32 _s )
{
m_releaseFramesToDo =
m_channelTrack->m_envWidget->releaseFrames();
m_channelTrack->m_pianoWidget->setKeyState( key(), FALSE );
// send MIDI-note-off-event
m_channelTrack->processOutEvent( midiEvent( NOTE_OFF,
m_channelTrack->m_midiPort->outputChannel(),
@@ -301,3 +304,72 @@ void notePlayHandle::mute( void )
m_muted = TRUE;
}
int notePlayHandle::index( void ) const
{
const playHandleVector & phv = mixer::inst()->playHandles();
int idx = 0;
for( constPlayHandleVector::const_iterator it = phv.begin();
it != phv.end(); ++it )
{
const notePlayHandle * nph =
dynamic_cast<const notePlayHandle *>( *it );
if( nph == NULL || nph->m_channelTrack != m_channelTrack ||
nph->released() == TRUE )
{
continue;
}
if( nph == this )
{
break;
}
++idx;
}
return( idx );
}
constNotePlayHandleVector notePlayHandle::nphsOfChannelTrack(
const channelTrack * _ct )
{
const playHandleVector & phv = mixer::inst()->playHandles();
constNotePlayHandleVector cnphv;
for( constPlayHandleVector::const_iterator it = phv.begin();
it != phv.end(); ++it )
{
const notePlayHandle * nph =
dynamic_cast<const notePlayHandle *>( *it );
if( nph != NULL && nph->m_channelTrack == _ct &&
nph->released() == FALSE )
{
cnphv.push_back( nph );
}
}
return( cnphv );
}
bool notePlayHandle::operator==( const notePlayHandle & _nph ) const
{
return( length() == _nph.length() &&
pos() == _nph.pos() &&
key() == _nph.key() &&
getVolume() == _nph.getVolume() &&
getPanning() == _nph.getPanning() &&
m_channelTrack == _nph.m_channelTrack &&
m_frames == _nph.m_frames &&
m_framesAhead == _nph.m_framesAhead &&
m_totalFramesPlayed == _nph.m_totalFramesPlayed &&
m_released == _nph.m_released &&
m_baseNote == _nph.m_baseNote &&
m_arpNote == _nph.m_arpNote &&
m_muted == _nph.m_muted );
}

View File

@@ -524,7 +524,12 @@ void pianoRoll::setCurrentPattern( pattern * _new_pattern )
inline void pianoRoll::drawNoteRect( QPainter & _p, Uint16 _x, Uint16 _y,
<<<<<<< piano_roll.cpp
Sint16 _width, const bool _is_selected,
const bool _is_step_note )
=======
Sint16 _width, const bool _is_selected )
>>>>>>> 1.14
{
++_x;
++_y;
@@ -536,7 +541,11 @@ inline void pianoRoll::drawNoteRect( QPainter & _p, Uint16 _x, Uint16 _y,
}
QColor current_color( 0xFF, 0xB0, 0x00 );
if( _is_selected )
if( _is_step_note == TRUE )
{
current_color.setRgb( 0, 255, 0 );
}
else if( _is_selected == TRUE )
{
current_color.setRgb( 0x00, 0x40, 0xC0 );
}
@@ -815,10 +824,15 @@ void pianoRoll::update( void )
{
Sint32 len_tact_64th = ( *it )->length();
if( len_tact_64th <= 0 )
if( len_tact_64th == 0 )
{
continue;
}
else if( len_tact_64th < 0 )
{
len_tact_64th = 4;
}
const int key = ( *it )->key() - m_startKey + 1;
Sint32 pos_tact_64th = ( *it )->pos();
@@ -865,7 +879,8 @@ void pianoRoll::update( void )
drawNoteRect( p, x + WHITE_KEY_WIDTH,
y_base - key * KEY_LINE_HEIGHT,
note_width,
is_selected );
is_selected,
( *it )->length() < 0 );
}
// draw volume-line of note
p.setPen( QPen( QColor( 0, 255, 0 ), NE_LINE_WIDTH ) );
@@ -919,6 +934,7 @@ void pianoRoll::update( void )
void pianoRoll::removeSelection( void )
{
<<<<<<< piano_roll.cpp
m_selectStartTact64th = 0;
m_selectedTact64th = 0;
m_selectStartKey = 0;
@@ -926,8 +942,29 @@ void pianoRoll::removeSelection( void )
}
=======
m_selectStartTact64th = 0;
m_selectedTact64th = 0;
m_selectStartKey = 0;
m_selectedKeys = 0;
}
>>>>>>> 1.14
<<<<<<< piano_roll.cpp
void pianoRoll::closeEvent( QCloseEvent * _ce )
{
QApplication::restoreOverrideCursor();
hide();
_ce->ignore ();
}
=======
>>>>>>> 1.14
<<<<<<< piano_roll.cpp
=======
void pianoRoll::closeEvent( QCloseEvent * _ce )
{
QApplication::restoreOverrideCursor();
@@ -936,6 +973,7 @@ void pianoRoll::closeEvent( QCloseEvent * _ce )
}
>>>>>>> 1.14
void pianoRoll::enterEvent( QEvent * _e )
@@ -1065,14 +1103,27 @@ void pianoRoll::keyPressEvent( QKeyEvent * _ke )
_ke->ignore();
break;
}
<<<<<<< piano_roll.cpp
}
=======
}
>>>>>>> 1.14
<<<<<<< piano_roll.cpp
void pianoRoll::leaveEvent( QEvent * _e )
{
while( QApplication::overrideCursor() != NULL )
=======
void pianoRoll::leaveEvent( QEvent * _e )
{
while( QApplication::overrideCursor() != NULL )
>>>>>>> 1.14
{
QApplication::restoreOverrideCursor();
}
@@ -1122,14 +1173,18 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me )
// loop through whole note-vector...
while( it != notes.end() )
{
midiTime len = ( *it )->length();
if( len < 0 )
{
len = 4;
}
// and check whether the user clicked on an
// existing note or an edit-line
if( pos_tact_64th >= ( *it )->pos() &&
( *it )->length() > 0 &&
len > 0 &&
(
( edit_note == FALSE &&
pos_tact_64th <= ( *it )->pos() +
( *it )->length() &&
pos_tact_64th <= ( *it )->pos() + len &&
( *it )->key() == key_num )
||
( edit_note == TRUE &&
@@ -1202,7 +1257,8 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me )
// clicked at the "tail" of the note?
if( pos_tact_64th > m_currentNote->pos() +
m_currentNote->length() -
RESIZE_AREA_WIDTH )
RESIZE_AREA_WIDTH &&
m_currentNote->length() > 0 )
{
// then resize the note
m_action = RESIZE_NOTE;
@@ -1237,10 +1293,17 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me )
play_note = FALSE;
if( it != notes.end() )
{
m_pattern->removeNote( *it );
if( ( *it )->length() > 0 )
{
m_pattern->removeNote( *it );
}
else
{
( *it )->setLength( 0 );
m_pattern->update();
}
songEditor::inst()->setModified();
}
songEditor::inst()->setModified();
}
else if( _me->button() == Qt::LeftButton &&
m_editMode == SELECT )
@@ -1497,7 +1560,7 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me )
pos_tact_64th <= ( *it )->pos() +
( *it )->length() &&
( *it )->key() == key_num &&
(*it )->length() > 0 )
( *it )->length() > 0 )
{
break;
}
@@ -1509,7 +1572,8 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me )
if( it != notes.end() )
{
// cursor at the "tail" of the note?
if( pos_tact_64th > ( *it )->pos() +
if( ( *it )->length() > 0 &&
pos_tact_64th > ( *it )->pos() +
( *it )->length() -
RESIZE_AREA_WIDTH )
{

View File

@@ -2,7 +2,7 @@
* piano_widget.cpp - implementation of piano-widget used in channel-window
* for testing channel
*
* Copyright (c) 2004-2005 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2004-2006 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -119,7 +119,7 @@ pianoWidget::pianoWidget (channelTrack * _parent ) :
4 );
m_pianoScroll->setSingleStep( 1 );
m_pianoScroll->setPageStep( 20 );
m_pianoScroll->setValue( OCTAVE_3*WHITE_KEYS_PER_OCTAVE );
m_pianoScroll->setValue( OCTAVE_3 * WHITE_KEYS_PER_OCTAVE );
#else
// create scrollbar below piano-widget...
m_pianoScroll = new QScrollBar( 0, WHITE_KEYS_PER_OCTAVE *

View File

@@ -1,7 +1,7 @@
/*
* setup_dialog.cpp - dialog for setting up LMMS
*
* Copyright (c) 2005 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2005-2006 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -33,6 +33,8 @@
#include <QWhatsThis>
#include <QComboBox>
#include <QMessageBox>
#include <QLineEdit>
#include <QFileDialog>
#else
@@ -42,6 +44,8 @@
#include <qwhatsthis.h>
#include <qcombobox.h>
#include <qmessagebox.h>
#include <qlineedit.h>
#include <qfiledialog.h>
#endif
@@ -100,10 +104,13 @@ setupDialog::setupDialog( configTabs _tab_to_open ) :
m_classicalKnobUsability( configManager::inst()->value( "knobs",
"classicalusability" ).toInt() ),
m_gimpLikeWindows( configManager::inst()->value( "app",
"gimplikewindows" ).toInt() )
"gimplikewindows" ).toInt() ),
m_workingDir( configManager::inst()->workingDir() ),
m_vstDir( configManager::inst()->vstDir() )
{
setWindowIcon( embed::getIconPixmap( "setup_general" ) );
setWindowTitle( tr( "Setup LMMS" ) );
setModal( TRUE );
QVBoxLayout * vlayout = new QVBoxLayout( this );
vlayout->setSpacing( 0 );
@@ -206,6 +213,59 @@ setupDialog::setupDialog( configTabs _tab_to_open ) :
QWidget * directories = new QWidget( ws );
directories->setFixedSize( 360, 200 );
QVBoxLayout * dir_layout = new QVBoxLayout( directories );
dir_layout->setSpacing( 0 );
dir_layout->setMargin( 0 );
labelWidget( directories, tr( "Directories" ) );
// working-dir
tabWidget * lmms_wd_tw = new tabWidget( tr(
"LMMS working directory" ).toUpper(),
directories );
lmms_wd_tw->setFixedHeight( 56 );
m_wdLineEdit = new QLineEdit( m_workingDir, lmms_wd_tw );
m_wdLineEdit->setGeometry( 10, 20, 300, 16 );
connect( m_wdLineEdit, SIGNAL( textChanged( const QString & ) ), this,
SLOT( setWorkingDir( const QString & ) ) );
QPushButton * workingdir_select_btn = new QPushButton(
embed::getIconPixmap( "project_open", 16, 16 ),
"", lmms_wd_tw );
workingdir_select_btn->setFixedSize( 24, 24 );
workingdir_select_btn->move( 320, 20 );
connect( workingdir_select_btn, SIGNAL( clicked() ), this,
SLOT( openWorkingDir() ) );
// vst-dir
tabWidget * vst_tw = new tabWidget( tr(
"VST-plugin directory" ).toUpper(),
directories );
vst_tw->setFixedHeight( 56 );
m_vdLineEdit = new QLineEdit( m_vstDir, vst_tw );
m_vdLineEdit->setGeometry( 10, 20, 300, 16 );
connect( m_vdLineEdit, SIGNAL( textChanged( const QString & ) ), this,
SLOT( setVSTDir( const QString & ) ) );
QPushButton * vstdir_select_btn = new QPushButton(
embed::getIconPixmap( "project_open", 16, 16 ),
"", vst_tw );
vstdir_select_btn->setFixedSize( 24, 24 );
vstdir_select_btn->move( 320, 20 );
connect( vstdir_select_btn, SIGNAL( clicked() ), this,
SLOT( openVSTDir() ) );
dir_layout->addWidget( lmms_wd_tw );
dir_layout->addSpacing( 10 );
dir_layout->addWidget( vst_tw );
dir_layout->addStretch();
QWidget * audio = new QWidget( ws );
audio->setFixedSize( 360, 200 );
@@ -381,9 +441,12 @@ setupDialog::setupDialog( configTabs _tab_to_open ) :
m_tabBar->addTab( general, tr( "General settings" ), 0, FALSE, TRUE
)->setIcon( embed::getIconPixmap( "setup_general" ) );
m_tabBar->addTab( audio, tr( "Audio settings" ), 1, FALSE, TRUE
m_tabBar->addTab( directories, tr( "Directories" ), 1, FALSE, TRUE
)->setIcon( embed::getIconPixmap(
"setup_directories" ) );
m_tabBar->addTab( audio, tr( "Audio settings" ), 2, FALSE, TRUE
)->setIcon( embed::getIconPixmap( "setup_audio" ) );
m_tabBar->addTab( midi, tr( "MIDI settings" ), 2, TRUE, TRUE
m_tabBar->addTab( midi, tr( "MIDI settings" ), 3, TRUE, TRUE
)->setIcon( embed::getIconPixmap( "setup_midi" ) );
#undef setIcon
@@ -452,6 +515,10 @@ void setupDialog::accept( void )
QString::number( m_classicalKnobUsability ) );
configManager::inst()->setValue( "app", "gimplikewindows",
QString::number( m_gimpLikeWindows ) );
configManager::inst()->setWorkingDir( m_workingDir );
configManager::inst()->setVSTDir( m_vstDir );
// tell all audio-settings-widget to save their settings
for( aswMap::iterator it = m_audioIfaceSetupWidgets.begin();
it != m_audioIfaceSetupWidgets.end(); ++it )
@@ -531,6 +598,64 @@ void setupDialog::displayBufSizeHelp( void )
void setupDialog::openWorkingDir( void )
{
#ifdef QT4
QString new_dir = QFileDialog::getExistingDirectory( this,
tr( "Choose LMMS working directory" ),
m_workingDir );
#else
QString new_dir = QFileDialog::getExistingDirectory( m_workingDir,
0, 0,
tr( "Choose LMMS working directory" ),
TRUE );
#endif
if( new_dir != QString::null )
{
m_wdLineEdit->setText( new_dir );
}
}
void setupDialog::setWorkingDir( const QString & _wd )
{
m_workingDir = _wd;
}
void setupDialog::openVSTDir( void )
{
#ifdef QT4
QString new_dir = QFileDialog::getExistingDirectory( this,
tr( "Choose your VST-plugin directory" ),
m_vstDir );
#else
QString new_dir = QFileDialog::getExistingDirectory( m_vstDir,
0, 0,
tr( "Choose your VST-plugin directory" ),
TRUE );
#endif
if( new_dir != QString::null )
{
m_vdLineEdit->setText( new_dir );
}
}
void setupDialog::setVSTDir( const QString & _vd )
{
m_vstDir = _vd;
}
void setupDialog::audioInterfaceChanged( const QString & _iface )
{
for( aswMap::iterator it = m_audioIfaceSetupWidgets.begin();

View File

@@ -1,7 +1,7 @@
/*
* pattern.cpp - implementation of class pattern which holds notes
*
* Copyright (c) 2004-2005 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2004-2006 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2005 Danny McRae <khjklujn@yahoo.com>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
@@ -790,6 +790,10 @@ void pattern::mousePressEvent( QMouseEvent * _me )
}
songEditor::inst()->setModified();
update();
if( pianoRoll::inst()->currentPattern() == this )
{
pianoRoll::inst()->update();
}
}
else if( m_frozenPattern != NULL && _me->button() == Qt::LeftButton &&
lmmsMainWin::isShiftPressed() == TRUE )
@@ -849,11 +853,23 @@ void pattern::wheelEvent( QWheelEvent * _we )
}
songEditor::inst()->setModified();
update();
<<<<<<< pattern.cpp
if( pianoRoll::inst()->currentPattern() == this )
{
pianoRoll::inst()->update();
}
_we->accept();
}
else
{
trackContentObject::wheelEvent( _we );
=======
_we->accept();
}
else
{
trackContentObject::wheelEvent( _we );
>>>>>>> 1.12
}
}

View File

@@ -1,7 +1,7 @@
/*
* led_checkbox.cpp - class ledCheckBox, an improved QCheckBox
*
* Copyright (c) 2005 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2005-2006 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -148,7 +148,7 @@ void ledCheckBox::paintEvent( QPaintEvent * )
p.drawPixmap( 0, 0, *m_ledOffPixmap );
}
p.drawText( m_ledOffPixmap->width() + 2, 10, text() );
p.drawText( m_ledOffPixmap->width() + 2, 8, text() );
#ifndef QT4
// and blit all the drawn stuff on the screen...

View File

@@ -1,7 +1,8 @@
/*
* tempo_sync_knob.h - adds bpm to ms conversion for knob class
* tempo_sync_knob.cpp - adds bpm to ms conversion for knob class
*
* Copyright (c) 2005 Danny McRae <khjklujn@yahoo.com>
* Copyright (c) 2005 Danny McRae <khjklujn/at/yahoo.com>
* Copyright (c) 2005-2006 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -27,21 +28,15 @@
#ifdef QT4
#include <QPainter>
#include <QPalette>
#include <QBitmap>
#include <QLabel>
#include <QStatusBar>
#include <QMouseEvent>
#include <QMenu>
#include <QStatusBar>
#include <QFontMetrics>
#include <QApplication>
#else
#include <qlabel.h>
#include <qpopupmenu.h>
#include <qcursor.h>
#define addSeparator insertSeparator
#define addMenu insertItem
@@ -52,9 +47,6 @@
#include "tempo_sync_knob.h"
#include "song_editor.h"
#include "embed.h"
#include "tooltip.h"
#include "config_mgr.h"
#include "text_float.h"