From 52d9ca470bfe894cd39bdeacb11a14921315ba6c Mon Sep 17 00:00:00 2001 From: Javier Serrano Polo Date: Wed, 28 Mar 2007 02:54:25 +0000 Subject: [PATCH] dynamic tempo, online help, filter directories git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@469 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 29 +++++++++++++ configure.in | 4 +- data/locale/ca.qm | Bin 109295 -> 109371 bytes data/locale/ca.ts | 9 +++++ include/basic_filters.h | 26 +++++++----- include/file_browser.h | 5 ++- include/main_window.h | 5 ++- include/mixer.h | 7 +++- include/note_play_handle.h | 5 +++ src/core/file_browser.cpp | 74 ++++++++++++++++++++++++---------- src/core/main.cpp | 6 +-- src/core/main_window.cpp | 49 +++++++++++++++++++++- src/core/note_play_handle.cpp | 23 ++++++++++- src/core/song_editor.cpp | 14 ++++++- src/widgets/knob.cpp | 10 ++--- 15 files changed, 217 insertions(+), 49 deletions(-) diff --git a/ChangeLog b/ChangeLog index ac7843d6e..c6f841fd8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,32 @@ +2007-03-28 Javier Serrano Polo + + * include/mixer.h: + * include/note_play_handle.h: + * src/core/note_play_handle.cpp: + * src/core/song_editor.cpp: + fixed notes with dynamic tempo + + * include/main_window.h: + * src/core/main_window.cpp: + added online help + + * include/file_browser.h: + * src/core/file_browser.cpp: + - filter directories without relevant content + - simplified entry retrieval + + * include/basic_filters.h: + limit Moog instability + + * src/core/main.cpp: + updated year + + * src/widgets/knob.cpp: + initialize members according to last arrangement + + * data/locale/ca.ts: + updated translation + 2007-03-26 Tobias Doerffel * configure.in: diff --git a/configure.in b/configure.in index 11c56f93f..c5a3ab63b 100644 --- a/configure.in +++ b/configure.in @@ -2,8 +2,8 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.50) -AC_INIT(lmms, 0.2.1-svn20070325, lmms-devel/at/lists/dot/sf/dot/net) -AM_INIT_AUTOMAKE(lmms, 0.2.1-svn20070325) +AC_INIT(lmms, 0.2.1-svn20070328, lmms-devel/at/lists/dot/sf/dot/net) +AM_INIT_AUTOMAKE(lmms, 0.2.1-svn20070328) AM_CONFIG_HEADER(config.h) diff --git a/data/locale/ca.qm b/data/locale/ca.qm index a14147c3e55af5bb8a3d6a18e4bf52aba9ca39fd..6d81a7767231e56687b24830dfd762acbc9e65f4 100644 GIT binary patch delta 6842 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 D?m{f= diff --git a/data/locale/ca.ts b/data/locale/ca.ts index 4ca0a6238..91f70f2fd 100644 --- a/data/locale/ca.ts +++ b/data/locale/ca.ts @@ -2338,6 +2338,15 @@ Per favor, visita http://wiki.mindrules.net per a documentació sobre LMMS.MultiMedia Project (*.mmp *.mmpz);;MultiMedia Project Template (*.mpt) Projecte MultiMèdia (*.mmp *.mmpz);;Plantilla de Projecte MultiMèdia (*.mpt) + + Online help + Ajuda en línia + + + start + doku.php id + start + mallets diff --git a/include/basic_filters.h b/include/basic_filters.h index 66be90f55..a581a70ab 100644 --- a/include/basic_filters.h +++ b/include/basic_filters.h @@ -4,7 +4,7 @@ * original file by ??? * modified and enhanced by Tobias Doerffel * - * Copyright (c) 2004-2006 Tobias Doerffel + * Copyright (c) 2004-2007 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -115,14 +115,22 @@ public: // four cascaded onepole filters // (bilinear transform) - m_y1[_chnl] = x*m_p + m_oldx[_chnl]*m_p - - m_k*m_y1[_chnl]; - m_y2[_chnl] = m_y1[_chnl]*m_p+m_oldy1[_chnl]* - m_p - m_k*m_y2[_chnl]; - m_y3[_chnl] = m_y2[_chnl]*m_p+m_oldy2[_chnl]* - m_p - m_k*m_y3[_chnl]; - m_y4[_chnl] = m_y3[_chnl]*m_p+m_oldy3[_chnl]* - m_p - m_k*m_y4[_chnl]; + m_y1[_chnl] = tLimit( + x*m_p + m_oldx[_chnl]*m_p - + m_k*m_y1[_chnl], + -10.0f, 10.0f ); + m_y2[_chnl] = tLimit( + m_y1[_chnl]*m_p+m_oldy1[_chnl]* + m_p - m_k*m_y2[_chnl], + -10.0f, 10.0f ); + m_y3[_chnl] = tLimit( + m_y2[_chnl]*m_p+m_oldy2[_chnl]* + m_p - m_k*m_y3[_chnl], + -10.0f, 10.0f ); + m_y4[_chnl] = tLimit( + m_y3[_chnl]*m_p+m_oldy3[_chnl]* + m_p - m_k*m_y4[_chnl], + -10.0f, 10.0f ); m_oldx[_chnl] = x; m_oldy1[_chnl] = m_y1[_chnl]; diff --git a/include/file_browser.h b/include/file_browser.h index e03057f35..28933c93f 100644 --- a/include/file_browser.h +++ b/include/file_browser.h @@ -1,7 +1,7 @@ /* * file_browser.h - include file for fileBrowser * - * Copyright (c) 2004-2006 Tobias Doerffel + * Copyright (c) 2004-2007 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -68,6 +68,9 @@ public: QWidget * _parent, engine * _engine ); virtual ~fileBrowser(); + static bool isDirWithContent( const QString & _path, + const QString & _filter ); + public slots: void reloadTree( void ); diff --git a/include/main_window.h b/include/main_window.h index e6f78359f..a68ea71ba 100644 --- a/include/main_window.h +++ b/include/main_window.h @@ -1,7 +1,7 @@ /* * main_window.h - declaration of class mainWindow, the main window of LMMS * - * Copyright (c) 2004-2006 Tobias Doerffel + * Copyright (c) 2004-2007 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -169,11 +169,14 @@ private: QMenu * m_tools_menu; vlist m_tools; + bool have_www_browser( void ); + friend class engine; private slots: + void browseHelp( void ); void fillTemplatesMenu( void ); void showTool( int _idx ); diff --git a/include/mixer.h b/include/mixer.h index 4e1a4b17d..df678ee2e 100644 --- a/include/mixer.h +++ b/include/mixer.h @@ -1,7 +1,7 @@ /* * mixer.h - audio-device-independent mixer for LMMS * - * Copyright (c) 2004-2006 Tobias Doerffel + * Copyright (c) 2004-2007 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -182,6 +182,11 @@ public: return( m_playHandles ); } + inline playHandleVector & playHandles( void ) + { + return( m_playHandles ); + } + void checkValidityOfPlayHandles( void ); inline bool haveNoRunningNotes( void ) const diff --git a/include/note_play_handle.h b/include/note_play_handle.h index 90e45194e..e5c69b5d0 100644 --- a/include/note_play_handle.h +++ b/include/note_play_handle.h @@ -208,6 +208,7 @@ public: } void processMidiTime( const midiTime & _time ); + void resize( const bpm_t _new_bpm ); #if SINGERBOT_SUPPORT int patternIndex( void ) @@ -250,6 +251,10 @@ private: int m_patternIndex; // position among relevant notes #endif + // tempo reaction + bpm_t m_orig_bpm; // original bpm + f_cnt_t m_orig_frames; // original m_frames + private slots: void updateFrequency( void ); diff --git a/src/core/file_browser.cpp b/src/core/file_browser.cpp index 776ee29bd..33bc4745d 100644 --- a/src/core/file_browser.cpp +++ b/src/core/file_browser.cpp @@ -4,7 +4,7 @@ * file_browser.cpp - implementation of the project-, preset- and * sample-file-browser * - * Copyright (c) 2004-2006 Tobias Doerffel + * Copyright (c) 2004-2007 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -160,7 +160,7 @@ void fileBrowser::reloadTree( void ) void fileBrowser::addItems( const QString & _path ) { QDir cdir( _path ); - QStringList files = cdir.entryList( QDir::NoFilter, QDir::Name ); + QStringList files = cdir.entryList( QDir::Files, QDir::Name ); // TODO: after dropping qt3-support we can use QStringList's iterator // which makes it possible to travel through the list in reverse @@ -169,9 +169,7 @@ void fileBrowser::addItems( const QString & _path ) for( csize i = 0; i < files.size(); ++i ) { QString cur_file = files[files.size() - i - 1]; - if( cur_file[0] != '.' && - QFileInfo( _path + QDir::separator() + - cur_file ).isDir() == FALSE + if( cur_file[0] != '.' #ifdef QT4 // TBD #else @@ -185,12 +183,13 @@ void fileBrowser::addItems( const QString & _path ) } } + files = cdir.entryList( QDir::Dirs, QDir::Name ); for( csize i = 0; i < files.size(); ++i ) { QString cur_file = files[files.size() - i - 1]; if( cur_file[0] != '.' && - QFileInfo( _path + QDir::separator() + - cur_file ).isDir() ) + isDirWithContent( _path + QDir::separator() + cur_file, + m_filter ) ) { QListViewItem * item = m_l->findItem( cur_file, 0 ); if( item == NULL ) @@ -210,6 +209,44 @@ void fileBrowser::addItems( const QString & _path ) +bool fileBrowser::isDirWithContent( const QString & _path, + const QString & _filter ) +{ + QDir cdir( _path ); + QStringList files = cdir.entryList( QDir::Files, QDir::Unsorted ); + for( QStringList::iterator it = files.begin(); it != files.end(); ++it ) + { + QString cur_file = *it; + if( cur_file[0] != '.' +#ifdef QT4 +// TBD +#else + && QDir::match( _filter, cur_file.lower() ) +#endif + ) + { + return( TRUE ); + } + } + + files = cdir.entryList( QDir::Dirs, QDir::Unsorted ); + for( QStringList::iterator it = files.begin(); it != files.end(); ++it ) + { + QString cur_file = *it; + if( cur_file[0] != '.' && + isDirWithContent( _path + QDir::separator() + cur_file, + _filter ) ) + { + return( TRUE ); + } + } + + return( FALSE ); +} + + + + void fileBrowser::keyPressEvent( QKeyEvent * _ke ) { if( _ke->key() == Qt::Key_F5 ) @@ -740,41 +777,34 @@ bool directory::addItems( const QString & _path ) bool added_something = FALSE; - QStringList files = thisDir.entryList( QDir::NoFilter, QDir::Name ); + QStringList files = thisDir.entryList( QDir::Files, QDir::Name ); for( csize i = 0; i < files.size(); ++i ) { QString cur_file = files[files.size() - i - 1]; + if( cur_file[0] != '.' #ifdef QT4 - if( cur_file[0] != '.' && !QFileInfo( - thisDir.absolutePath() + QDir::separator() + - cur_file ).isDir() && - thisDir.match( m_filter, cur_file.toLower() ) - /*QDir::match( FILE_FILTER, cur_file )*/ ) + && thisDir.match( m_filter, cur_file.toLower() ) #else - if( cur_file[0] != '.' && !QFileInfo( - thisDir.absPath() + QDir::separator() + - cur_file ).isDir() && - thisDir.match( m_filter, cur_file.lower() ) - /*QDir::match( FILE_FILTER, cur_file )*/ ) + && thisDir.match( m_filter, cur_file.lower() ) #endif + /*QDir::match( FILE_FILTER, cur_file )*/ ) { (void) new fileItem( this, cur_file, _path ); added_something = TRUE; } } + files = thisDir.entryList( QDir::Dirs, QDir::Name ); for( csize i = 0; i < files.size(); ++i ) { QString cur_file = files[files.size() - i - 1]; + if( cur_file[0] != '.' && fileBrowser::isDirWithContent( #ifdef QT4 - if( cur_file[0] != '.' && QFileInfo( thisDir.absolutePath() + QDir::separator() + - cur_file ).isDir() ) #else - if( cur_file[0] != '.' && QFileInfo( thisDir.absPath() + QDir::separator() + - cur_file ).isDir() ) #endif + cur_file, m_filter ) ) { new directory( this, cur_file, _path, m_filter ); added_something = TRUE; diff --git a/src/core/main.cpp b/src/core/main.cpp index 2da910f3c..53b0cf0f4 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -3,7 +3,7 @@ /* * main.cpp - just main.cpp which is starting up app... * - * Copyright (c) 2004-2006 Tobias Doerffel + * Copyright (c) 2004-2007 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -101,7 +101,7 @@ int main( int argc, char * * argv ) QString( app.argv()[i] ) == "-v" ) { printf( "\nLinux MultiMedia Studio %s\n\n" - "Copyright (c) 2004-2006 Tobias Doerffel and others.\n\n" + "Copyright (c) 2004-2007 Tobias Doerffel and others.\n\n" "This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public\n" "License as published by the Free Software Foundation; either\n" @@ -115,7 +115,7 @@ int main( int argc, char * * argv ) QString( app.argv()[i] ) == "-h" ) ) { printf( "\nLinux MultiMedia Studio %s\n" - "Copyright (c) 2004-2006 Tobias Doerffel and others.\n\n" + "Copyright (c) 2004-2007 Tobias Doerffel and others.\n\n" "usage: lmms [ -r [ -o ] [ -h ] " "[ ]\n" "-r, --render render given file.\n" diff --git a/src/core/main_window.cpp b/src/core/main_window.cpp index 66771c3ab..653862664 100644 --- a/src/core/main_window.cpp +++ b/src/core/main_window.cpp @@ -3,7 +3,7 @@ /* * main_window.cpp - implementation of LMMS-main-window * - * Copyright (c) 2004-2006 Tobias Doerffel + * Copyright (c) 2004-2007 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -550,8 +550,18 @@ void mainWindow::finalize( void ) #else menuBar()->insertItem( tr( "&Help" ), help_menu ); #endif - help_menu->addAction( embed::getIconPixmap( "help" ), tr( "Help" ), + if( have_www_browser() ) + { + help_menu->addAction( embed::getIconPixmap( "help" ), + tr( "Online help" ), + this, SLOT( browseHelp() ) ); + } + else + { + help_menu->addAction( embed::getIconPixmap( "help" ), + tr( "Help" ), this, SLOT( help() ) ); + } help_menu->addAction( embed::getIconPixmap( "whatsthis" ), tr( "What's this?" ), this, SLOT( enterWhatsThisMode() ) ); @@ -1089,6 +1099,41 @@ void mainWindow::showTool( int _idx ) +bool mainWindow::have_www_browser( void ) +{ + int ret = system( "which x-www-browser > /dev/null" ); + return( WIFEXITED( ret ) && WEXITSTATUS( ret ) == EXIT_SUCCESS ); +} + + + + +void mainWindow::browseHelp( void ) +{ + pid_t pid = fork(); + if( pid == -1 ) + { + perror( "fork" ); + } + else if( pid == 0 ) + { + QString url = "http://wiki.mindrules.net/doku.php?id=" + + tr( "start", "doku.php id" ); + execlp( "x-www-browser", "x-www-browser", url. +#ifdef QT4 + toAscii().constData(), +#else + ascii(), +#endif + NULL ); + perror( "execlp" ); + exit( EXIT_FAILURE ); + } +} + + + + #ifndef QT4 #undef addSeparator #endif diff --git a/src/core/note_play_handle.cpp b/src/core/note_play_handle.cpp index c9bb0aee5..cce8817ce 100644 --- a/src/core/note_play_handle.cpp +++ b/src/core/note_play_handle.cpp @@ -58,10 +58,11 @@ notePlayHandle::notePlayHandle( instrumentTrack * _it, m_baseNote( TRUE ), m_arpNote( _arp_note ), m_muted( FALSE ), - m_bbTrack( NULL ) + m_bbTrack( NULL ), #if SINGERBOT_SUPPORT - , m_patternIndex( 0 ) + m_patternIndex( 0 ), #endif + m_orig_bpm( _it->eng()->getSongEditor()->getTempo() ) { setDetuning( _n.detuning() ); if( detuning() ) @@ -320,6 +321,7 @@ void notePlayHandle::setFrames( const f_cnt_t _frames ) { m_frames = m_instrumentTrack->beatLen( this ); } + m_orig_frames = m_frames; } @@ -437,6 +439,23 @@ void notePlayHandle::processMidiTime( const midiTime & _time ) +void notePlayHandle::resize( const bpm_t _new_bpm ) +{ + double completed = m_totalFramesPlayed / (double)m_frames; + double new_frames = m_orig_frames * m_orig_bpm / (double)_new_bpm; + m_frames = (f_cnt_t)new_frames; + m_totalFramesPlayed = (f_cnt_t)( completed * new_frames ); + + for( notePlayHandleVector::iterator it = m_subNotes.begin(); + it != m_subNotes.end(); ++it ) + { + ( *it )->resize( _new_bpm ); + } +} + + + + #include "note_play_handle.moc" diff --git a/src/core/song_editor.cpp b/src/core/song_editor.cpp index b3913d6ec..2523f1d29 100644 --- a/src/core/song_editor.cpp +++ b/src/core/song_editor.cpp @@ -3,7 +3,7 @@ /* * song_editor.cpp - basic window for editing song * - * Copyright (c) 2004-2006 Tobias Doerffel + * Copyright (c) 2004-2007 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -79,6 +79,7 @@ #include "instrument_track.h" #include "mmp.h" #include "midi_client.h" +#include "note_play_handle.h" #include "timeline.h" #include "pattern.h" #include "piano_roll.h" @@ -755,6 +756,17 @@ void songEditor::zoomingChanged( const QString & _zfac ) void songEditor::setTempo( int _new_bpm ) { + playHandleVector & phv = eng()->getMixer()->playHandles(); + for( playHandleVector::iterator it = phv.begin(); it != phv.end(); + ++it ) + { + notePlayHandle * nph = dynamic_cast( *it ); + if( nph && !nph->released() ) + { + nph->resize( _new_bpm ); + } + } + m_bpmSpinBox->setInitValue( _new_bpm ); eng()->updateFramesPerTact64th(); emit tempoChanged( _new_bpm ); diff --git a/src/widgets/knob.cpp b/src/widgets/knob.cpp index 88dfd7b38..fe16a0500 100644 --- a/src/widgets/knob.cpp +++ b/src/widgets/knob.cpp @@ -6,7 +6,7 @@ * This file is partly based on the knob-widget of the Qwt Widget Library by * Josef Wilgen. * - * Copyright (c) 2004-2006 Tobias Doerffel + * Copyright (c) 2004-2007 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -95,12 +95,12 @@ knob::knob( int _knob_num, QWidget * _parent, const QString & _name, autoObj( _engine, _track ), m_mouseOffset( 0.0f ), m_buttonPressed( FALSE ), - m_angle( 0.0f ), - m_knobNum( _knob_num ), m_hintTextBeforeValue( "" ), m_hintTextAfterValue( "" ), - m_label( "" ), - m_initValue( 0.0f ) + m_initValue( 0.0f ), + m_angle( 0.0f ), + m_knobNum( _knob_num ), + m_label( "" ) { if( s_textFloat == NULL ) {