From 5e7073b223320c1a55241f60819ab463bbdaaf57 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Wed, 1 Mar 2006 11:19:33 +0000 Subject: [PATCH] bugfixes and some small improvements git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@95 0778d3d1-df1d-0410-868b-ea421aaaa00d --- AUTHORS | 2 +- ChangeLog | 25 +++++++++ configure.in | 4 +- data/locale/de.qm | Bin 77412 -> 78936 bytes data/locale/de.ts | 113 ++++++++++++++++++++++++++++++++++++--- include/midi_time.h | 9 ++++ include/pattern.h | 6 ++- include/track.h | 2 + src/core/main_window.cpp | 4 +- src/core/piano_roll.cpp | 2 +- src/core/song_editor.cpp | 3 +- src/core/timeline.cpp | 6 +-- src/core/track.cpp | 60 ++++++++++++++++----- src/tracks/pattern.cpp | 12 +++-- 14 files changed, 210 insertions(+), 38 deletions(-) diff --git a/AUTHORS b/AUTHORS index c68988ef9..d1b7ee4e4 100644 --- a/AUTHORS +++ b/AUTHORS @@ -8,7 +8,7 @@ Danny McRae Zolo - dark-expert-theme + theme "Blue Scene" Sebastian Tilsch diff --git a/ChangeLog b/ChangeLog index 24cedbc4a..46e9d6458 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,28 @@ +2006-02-28 Tobias Doerffel + + * data/locale/de.ts: + updated German translation + + * src/core/timeline.cpp: + use note::toNearestTact() in timeLine::mouseMoveEvent() instead of own + calculations + + * src/core/track.cpp: + per default make TCO-ops (create, move, resize) aligned on tact- + boundaries, free positioning/resizing can be achieved by pressing + after pressing mouse-button + + * include/midi_time.h: + added note::toNearestTact()-method + + * include/pattern.h: + * src/core/piano_roll.cpp: + * src/track/pattern.cpp: + do not quantize note-position while moving selection of notes + + * src/core/song_editor.cpp: + some layout-fixes for looking good with "Blue Scene" as well + 2006-02-27 Zolo * data/themes/blue_scene/: diff --git a/configure.in b/configure.in index 64b1021f1..d30033e63 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.1.4-cvs20060227, tobydox/at/users/dot/sourceforge/dot/net) -AM_INIT_AUTOMAKE(lmms, 0.1.4-cvs20060227) +AC_INIT(lmms, 0.1.4-cvs20060228, tobydox/at/users/dot/sourceforge/dot/net) +AM_INIT_AUTOMAKE(lmms, 0.1.4-cvs20060228) AM_CONFIG_HEADER(config.h) diff --git a/data/locale/de.qm b/data/locale/de.qm index 3d1360b87d8081804e611e501842b75f10d6cdca..99a9c5c34d8f197248de69b563c8791b6602ca8a 100755 GIT binary patch delta 6623 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 &nN6x!X>Auf5F-a@?az&edD?+* zD&Yg|(6tuCXy7^;2V?>aooernG6cadR#`^A!Byp<(m zc--|X&Jb!-sxj0$rYRH(jebn>P<{8@&ib91$CFcxFtMl&b` zZtP6bZQr`^ zwUQaGNR3o8^9#MdU@H04OeNFD7!RI@|HfmSjmFv)ee`xo4jUISu7!8Zm=kj0Weeu4 zRQRwP_tq!u>k z#!);{SoZj&e*XUH^LO^=@20O^pUEd|b6CDjdH?fW`rmZLe^b|*Q@7xKs-ySDV`F0( q?756t^V$D_v0{3Dz6K9;#`)h9j2mNY#=oD`OgkpFuy-G(yW&4NN{1By diff --git a/data/locale/de.ts b/data/locale/de.ts index 467740305..70871b3b0 100755 --- a/data/locale/de.ts +++ b/data/locale/de.ts @@ -671,7 +671,11 @@ http://lmms.sourceforge.net Beat+Bassline Editor - Beat+Bassline Editor + Beat+Bassline Editor + + + Beat+Baseline Editor + Beat+Baseline Editor @@ -690,14 +694,22 @@ http://lmms.sourceforge.net Open in Beat+Bassline-Editor - Im Beat+Bassline-Editor öffnen + Im Beat+Bassline-Editor öffnen + + + Open in Beat+Baseline-Editor + Im Beat+Baseline-Editor öffnen bbTrack Beat/Bassline %1 - Beat/Bassline %1 + Beat/Bassline %1 + + + Beat/Baseline %1 + Beat/Baseline %1 @@ -740,7 +752,7 @@ http://lmms.sourceforge.net Draw your own waveform hereby dragging your mouse onto this graph - + Zeichnen Sie eigene Wellenformen, indem Sie die Maus über den Graph ziehen @@ -1649,11 +1661,11 @@ Bitte besuchen Sie http://wiki.mindrules.net für Dokumentationen über LMMS. Show/hide Beat+Bassline Editor - Zeige/verstecke Beat+Bassline Editor + Zeige/verstecke Beat+Bassline Editor By pressing this button, you can show or hide the Beat+Bassline Editor. The Beat+Bassline Editor is needed for setting beats, opening, adding and removing channels, cutting, copying and pasting beat- and bassline-patterns and other things like that. - Durch das Drücken dieses Knopfes wird der Beat+Bassline Editor ein- oder ausgeblendet. Der Beat+Bassline Editor ist nötig, um Beats zu setzen, um Kanale zu öffnen, hinzuzufügen und zu entfernen, um Bassline-Patterns auszuschneiden, zu kopieren und einzufügen usw. + Durch das Drücken dieses Knopfes wird der Beat+Bassline Editor ein- oder ausgeblendet. Der Beat+Bassline Editor ist nötig, um Beats zu setzen, um Kanale zu öffnen, hinzuzufügen und zu entfernen, um Bassline-Patterns auszuschneiden, zu kopieren und einzufügen usw. Show/hide Piano-Roll @@ -1773,6 +1785,18 @@ Bitte besuchen Sie http://wiki.mindrules.net für Dokumentationen über LMMS.Setting up main-window and workspace... Initialisiere Hauptfenster und Arbeitsbereich... + + Show/hide Beat+Baseline Editor + Zeige/verstecke Beat+Baseline Editor + + + By pressing this button, you can show or hide the Beat+Baseline Editor. The Beat+Baesline Editor is needed for setting beats, opening, adding and removing channels, cutting, copying and pasting beat- and baseline-patterns and other things like that. + Durch das Drücken dieses Knopfes wird der Beat+Baseline Editor ein- oder ausgeblendet. Der Beat+Bassline Editor ist nötig, um Beats zu setzen, um Kanale zu öffnen, hinzuzufügen und zu entfernen, um Bassline-Patterns auszuschneiden, zu kopieren und einzufügen usw. + + + By pressing this button, you can show or hide the Beat+Baseline Editor. The Beat+Baseline Editor is needed for creating beats, opening, adding and removing channels, cutting, copying and pasting beat- and baseline-patterns and other things like that. + Durch das Drücken dieses Knopfes wird der Beat+Baseline Editor ein- oder ausgeblendet. Der Beat+Baseline Editor ist nötig, um Beats zu erstellen, Kanale zu öffnen, hinzuzufügen und zu entfernen sowie um Baseline-Patterns auszuschneiden, zu kopieren und einzufügen usw. + midiClient @@ -1853,6 +1877,49 @@ Bitte besuchen Sie http://wiki.mindrules.net für Dokumentationen über LMMS.Alle Bilder (*.png *.jpg *.jpeg *.gif *.bmp) + + organicInstrument + + Osc %1 waveform + Oszillator %1 Wellenform + + + Osc %1 waveform: + Oszillator %1 Wellenform: + + + Osc %1 volume + Oszillator %1 Lautstärke + + + Osc %1 volume: + Oszillator %1 Lautstärke: + + + Osc %1 panning + Oszillator %1 Balance + + + Osc %1 panning: + Oszillator %1 Balance: + + + Osc %1 fine detuning left + Oszillator %1 Fein-Verstimmung links + + + Osc %1 fine detuning left: + Oszillator %1 Fein-Verstimmung links: + + + cents + Cent + + + FX1 + FX1 + + pattern @@ -2039,6 +2106,10 @@ Lautstärke eines Steps kann mit Mausrad geändert werden All selected notes were copied to the clipboard. Alle gewählten Noten wurden in die Zwischenablage kopiert. + + Last note + Letzte Note + pluckedStringSynth @@ -2071,7 +2142,7 @@ Lautstärke eines Steps kann mit Mausrad geändert werden You can drag an instrument-plugin into either the Song-Editor, the Beat+Bassline Editor or just into a channel-window or on the corresponding channel-button. - Sie können ein Instrument-Plugin entweder in den Song-Editor, den Beat+Bassline-Editor oder einfach in ein Kanal-Fenster oder auf den zugehörigen Kanal-Button ziehen. + Sie können ein Instrument-Plugin entweder in den Song-Editor, den Beat+Bassline-Editor oder einfach in ein Kanal-Fenster oder auf den zugehörigen Kanal-Button ziehen. cheap synthesis of guitar/harp-like sounds @@ -2101,6 +2172,14 @@ Lautstärke eines Steps kann mit Mausrad geändert werden Rough & Dirty Wavetable Synthesizer. + + You can drag an instrument-plugin into either the Song-Editor, the Beat+Baseline Editor or just into a channel-window or on the corresponding channel-button. + Sie können ein Instrument-Plugin entweder in den Song-Editor, den Beat+Baseline-Editor oder einfach in ein Kanal-Fenster oder auf den zugehörigen Kanal-Button ziehen. + + + Additive Synthesizer for organ-like sounds + Additiver Synthesizer für orgelähnliche Klänge + projectNotes @@ -2419,6 +2498,14 @@ Latency: %2 ms Frames: %1 Latenz: %2 ms + + Artwork directory + Artwork-Verzeichnis + + + Choose artwork-theme directory + Artwork-Verzeichnis wählen + setupWidget @@ -2845,6 +2932,18 @@ Bitte stellen Sie sicher, dass Sie Schreibrechte auf diese Datei und das Verzeic %1:%2 (%3:%4 to %5:%6) %1:%2 (%3:%4 bis %5:%6) + + Hint + Tipp + + + Press <Ctrl> for free positioning. + Drücken Sie <Strg> für freie Positionierung. + + + Press <Ctrl> for free resizing. + Drücken Sie <Strg> für freie Größenänderung. + trackOperationsWidget diff --git a/include/midi_time.h b/include/midi_time.h index a282889be..4b58fb828 100644 --- a/include/midi_time.h +++ b/include/midi_time.h @@ -50,6 +50,15 @@ public: *this = _t; } + inline midiTime toNearestTact( void ) const + { + if( m_tact64th >= 32 ) + { + return( m_tact * 64 + 64 ); + } + return( m_tact * 64 ); + } + inline midiTime & operator=( const midiTime & _t ) { m_tact = _t.m_tact; diff --git a/include/pattern.h b/include/pattern.h index 45361a3cf..375f5e621 100644 --- a/include/pattern.h +++ b/include/pattern.h @@ -87,11 +87,13 @@ public: virtual midiTime length( void ) const; - note * FASTCALL addNote( const note & _new_note ); + note * FASTCALL addNote( const note & _new_note, + const bool _quant_pos = TRUE ); void FASTCALL removeNote( const note * _note_to_del ); - note * FASTCALL rearrangeNote( const note * _note_to_proc ); + note * FASTCALL rearrangeNote( const note * _note_to_proc, + const bool _quant_pos = TRUE ); void clearNotes( void ); diff --git a/include/track.h b/include/track.h index 87dd59631..d83bbcb9d 100644 --- a/include/track.h +++ b/include/track.h @@ -151,6 +151,8 @@ private: bool m_autoResize; Sint16 m_initialMouseX; + textFloat * m_hint; + } ; diff --git a/src/core/main_window.cpp b/src/core/main_window.cpp index f92fdda52..25139f17c 100644 --- a/src/core/main_window.cpp +++ b/src/core/main_window.cpp @@ -328,8 +328,8 @@ void mainWindow::finalize( void ) QWhatsThis::add( bb_editor_window, #endif tr( "By pressing this button, you can show or hide the " - "Beat+Baseline Editor. The Beat+Baesline Editor is " - "needed for setting beats, opening, adding and " + "Beat+Baseline Editor. The Beat+Baseline Editor is " + "needed for creating beats, opening, adding and " "removing channels, cutting, copying and pasting " "beat- and baseline-patterns and other things like " "that." ) ); diff --git a/src/core/piano_roll.cpp b/src/core/piano_roll.cpp index 5b230ed76..22f6de0c3 100644 --- a/src/core/piano_roll.cpp +++ b/src/core/piano_roll.cpp @@ -1779,7 +1779,7 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) note_tact_64th ); ( *it )->setPos( new_note_pos ); ( *it )->setKey( ( *it )->key() + key_diff ); - *it = m_pattern->rearrangeNote( *it ); + *it = m_pattern->rearrangeNote( *it, FALSE ); } m_moveStartTact64th = pos_tact_64th; diff --git a/src/core/song_editor.cpp b/src/core/song_editor.cpp index 9db51057e..b0a75f770 100644 --- a/src/core/song_editor.cpp +++ b/src/core/song_editor.cpp @@ -224,6 +224,7 @@ songEditor::songEditor( engine * _engine ) : QLabel * master_pitch_lbl = new QLabel( tb ); master_pitch_lbl->setPixmap( embed::getIconPixmap( "master_pitch" ) ); + master_pitch_lbl->setFixedHeight( 64 ); #ifdef QT4 m_masterPitchSlider = new QSlider( Qt::Vertical, tb ); @@ -262,7 +263,7 @@ songEditor::songEditor( engine * _engine ) : vcw_layout->setMargin( 0 ); vcw_layout->setSpacing( 0 ); - vcw_layout->addStretch(); + //vcw_layout->addStretch(); vcw_layout->addWidget( new visualizationWidget( embed::getIconPixmap( "output_graph" ), vc_w, eng() ) ); diff --git a/src/core/timeline.cpp b/src/core/timeline.cpp index 7773a8bc7..cf1530d7a 100644 --- a/src/core/timeline.cpp +++ b/src/core/timeline.cpp @@ -373,11 +373,7 @@ void timeLine::mouseMoveEvent( QMouseEvent * _me ) } else { - m_loopPos[i] = t.getTact() * 64; - if( t.getTact64th() >= 32 ) - { - m_loopPos[i] += 64; - } + m_loopPos[i] = t.toNearestTact(); } update(); break; diff --git a/src/core/track.cpp b/src/core/track.cpp index 8d587fd73..dc720214e 100644 --- a/src/core/track.cpp +++ b/src/core/track.cpp @@ -93,7 +93,8 @@ trackContentObject::trackContentObject( track * _track ) : m_length(), m_action( NONE ), m_autoResize( FALSE ), - m_initialMouseX( 0 ) + m_initialMouseX( 0 ), + m_hint( NULL ) { if( s_textFloat == NULL ) { @@ -122,6 +123,7 @@ trackContentObject::trackContentObject( track * _track ) : trackContentObject::~trackContentObject() { + delete m_hint; } @@ -278,7 +280,7 @@ void trackContentObject::mousePressEvent( QMouseEvent * _me ) m_track->eng() ); } else if( _me->button() == Qt::LeftButton && - /* eng()->getMainWindow()->isShiftPressed() == FALSE &&*/ + /* eng()->getMainWindow()->isShiftPressed() == FALSE &&*/ fixedTCOs() == FALSE ) { m_initialMouseX = _me->x(); @@ -289,6 +291,11 @@ void trackContentObject::mousePressEvent( QMouseEvent * _me ) QCursor c( Qt::SizeAllCursor ); QApplication::setOverrideCursor( c ); s_textFloat->setTitle( tr( "Current position" ) ); + delete m_hint; + m_hint = textFloat::displayMessage( tr( "Hint" ), + tr( "Press for free " + "positioning." ), + embed::getIconPixmap( "hint" ), 0 ); } else if( m_autoResize == FALSE ) { @@ -296,15 +303,21 @@ void trackContentObject::mousePressEvent( QMouseEvent * _me ) QCursor c( Qt::SizeHorCursor ); QApplication::setOverrideCursor( c ); s_textFloat->setTitle( tr( "Current length" ) ); + delete m_hint; + m_hint = textFloat::displayMessage( tr( "Hint" ), + tr( "Press for free " + "resizing." ), + embed::getIconPixmap( "hint" ), 0 ); } s_textFloat->reparent( this ); // setup text-float as if TCO was already moved/resized mouseMoveEvent( _me ); s_textFloat->show(); + } else if( ( _me->button() == Qt::MidButton/* || ( _me->button() == Qt::LeftButton && - eng()->getMainWindow()->isShiftPressed() == TRUE )*/ ) && + eng()->getMainWindow()->isShiftPressed() == TRUE )*/ ) && fixedTCOs() == FALSE ) { close(); @@ -316,13 +329,25 @@ void trackContentObject::mousePressEvent( QMouseEvent * _me ) void trackContentObject::mouseMoveEvent( QMouseEvent * _me ) { + if( getTrack()->eng()->getMainWindow()->isCtrlPressed() == TRUE ) + { + delete m_hint; + m_hint = NULL; + } + const float ppt = m_track->getTrackContainer()->pixelsPerTact(); if( m_action == MOVE ) { const int x = mapToParent( _me->pos() ).x() - m_initialMouseX; - movePosition( tMax( 0, (Sint32) m_track->getTrackContainer()-> + midiTime t = tMax( 0, (Sint32) m_track->getTrackContainer()-> currentPosition() + - static_cast( x * 64 / ppt ) ) ); + static_cast( x * 64 / ppt ) ); + if( getTrack()->eng()->getMainWindow()->isCtrlPressed() == + FALSE && _me->button() == Qt::NoButton ) + { + t = t.toNearestTact(); + } + movePosition( t ); m_track->getTrackWidget()->changePosition(); s_textFloat->setText( QString( "%1:%2" ). arg( m_startPosition.getTact() + 1 ). @@ -363,8 +388,14 @@ void trackContentObject::mouseMoveEvent( QMouseEvent * _me ) } else if( m_action == RESIZE ) { - changeLength( tMax( 64, - static_cast( _me->x() * 64 / ppt ) ) ); + midiTime t = tMax( 64, + static_cast( _me->x() * 64 / ppt ) ); + if( getTrack()->eng()->getMainWindow()->isCtrlPressed() == + FALSE && _me->button() == Qt::NoButton ) + { + t = t.toNearestTact(); + } + changeLength( t ); s_textFloat->setText( tr( "%1:%2 (%3:%4 to %5:%6)" ). arg( length().getTact() ). arg( length().getTact64th() ). @@ -404,6 +435,8 @@ void trackContentObject::mouseMoveEvent( QMouseEvent * _me ) void trackContentObject::mouseReleaseEvent( QMouseEvent * _me ) { m_action = NONE; + delete m_hint; + m_hint = NULL; s_textFloat->hide(); leaveEvent( NULL ); selectableObject::mouseReleaseEvent( _me ); @@ -691,16 +724,17 @@ void trackContentWidget::dropEvent( QDropEvent * _de ) if( type == ( "tco_" + QString::number( getTrack()->type() ) ) && getTrack()->getTrackContainer()->fixedTCOs() == FALSE ) { - const midiTime position = getPosition( _de->pos().x() ); + const midiTime pos = getPosition( _de->pos().x() + ).toNearestTact(); trackContentObject * tco = addTCO( getTrack()->createTCO( - position ) ); + pos ) ); // value contains our XML-data so simply create a // multimediaProject which does the rest for us... multimediaProject mmp( value, FALSE ); // at least save position before getting moved to somewhere // the user doesn't expect... tco->loadSettings( mmp.content().firstChild().toElement() ); - tco->movePosition( position ); + tco->movePosition( pos ); _de->accept(); } } @@ -723,10 +757,10 @@ void trackContentWidget::mousePressEvent( QMouseEvent * _me ) else if( _me->button() == Qt::LeftButton && getTrack()->getTrackContainer()->fixedTCOs() == FALSE ) { - const midiTime position = getPosition( _me->x() ); + const midiTime pos = getPosition( _me->x() ).toNearestTact(); trackContentObject * tco = addTCO( getTrack()->createTCO( - position ) ); - tco->movePosition( position ); + pos ) ); + tco->movePosition( pos ); } } diff --git a/src/tracks/pattern.cpp b/src/tracks/pattern.cpp index 3820620a2..ab4c95252 100644 --- a/src/tracks/pattern.cpp +++ b/src/tracks/pattern.cpp @@ -237,10 +237,13 @@ midiTime pattern::length( void ) const -note * pattern::addNote( const note & _new_note ) +note * pattern::addNote( const note & _new_note, const bool _quant_pos ) { note * new_note = new note( _new_note ); - new_note->quantizePos( eng()->getPianoRoll()->quantization() ); + if( _quant_pos ) + { + new_note->quantizePos( eng()->getPianoRoll()->quantization() ); + } if( m_notes.size() == 0 || m_notes.back()->pos() <= new_note->pos() ) { @@ -301,14 +304,15 @@ void pattern::removeNote( const note * _note_to_del ) -note * pattern::rearrangeNote( const note * _note_to_proc ) +note * pattern::rearrangeNote( const note * _note_to_proc, + const bool _quant_pos ) { // just rearrange the position of the note by removing it and adding // a copy of it -> addNote inserts it at the correct position note copy_of_note( *_note_to_proc ); removeNote( _note_to_proc ); - return( addNote( copy_of_note ) ); + return( addNote( copy_of_note, _quant_pos ) ); }