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 3d1360b87..99a9c5c34 100755 Binary files a/data/locale/de.qm and b/data/locale/de.qm differ 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 ) ); }