From e07a25a5c9ccb1dffa2c8046ff287ddb92cf6da8 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 22 May 2006 12:33:18 +0000 Subject: [PATCH] added mute-attribute to TCOs and fixed other small things git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@134 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 24 ++++- TODO | 8 +- data/locale/de.qm | Bin 88956 -> 89056 bytes data/locale/de.ts | 107 +++++++++++++++++-- data/presets/TripleOscillator/SawReso.cs.xml | 17 +++ data/presets/Vibed/Harpsichord.cs.xml | 17 +++ data/presets/Vibed/SadPad.cs.xml | 17 +++ data/themes/default/muted.png | Bin 0 -> 1396 bytes include/track.h | 8 ++ src/core/bb_editor.cpp | 10 +- src/core/mixer.cpp | 24 +++-- src/core/track.cpp | 39 +++++-- src/tracks/bb_track.cpp | 19 +++- src/tracks/instrument_track.cpp | 3 +- src/tracks/pattern.cpp | 41 ++++--- src/tracks/sample_track.cpp | 18 +++- 16 files changed, 289 insertions(+), 63 deletions(-) create mode 100644 data/presets/TripleOscillator/SawReso.cs.xml create mode 100644 data/presets/Vibed/Harpsichord.cs.xml create mode 100644 data/presets/Vibed/SadPad.cs.xml create mode 100644 data/themes/default/muted.png diff --git a/ChangeLog b/ChangeLog index 7f557794e6..8c4cb98af3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +2006-05-20 Tobias Doerffel + + * data/locale/de.ts: + updated German translation + + * src/core/bb_editor.cpp: + added button in bb-editor for adding new beat/bassline + + * include/track.h: + * src/core/track.cpp: + * src/tracks/bb_track.cpp: + * src/tracks/instrument_track.cpp: + * src/tracks/pattern.cpp: + * src/tracks/sample_track.cpp: + added "muted"-property to track-content-objects for being able to mute + single patterns, samples etc. either via context-menu or using + and middle mousebutton + 2006-05-19 Tobias Doerffel * src/core/track_container.cpp: @@ -1901,7 +1919,7 @@ 2005-12-08 Tobias Doerffel * src/core/midi_tab_widget.cpp: - - always un-check items in port-menus when disabling receceiving or + - always un-check items in port-menus when disabling receiving or sending MIDI-events - small GUI improvements @@ -2087,8 +2105,8 @@ added so called audio-ports which are important for transporting sound from it's origin through the mixer and the effect-board (the latter one isn't existing yet but coming quite soon) - another important - point is ability of having output-ports for each channel/sample-track - with JACK + point is the ability of having output-ports for each channel/sample- + track with JACK * src/tracks/channel_track.cpp: translate default-channel-name "Default" diff --git a/TODO b/TODO index 57f6bfb536..b902f37aae 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,5 @@ +- add/remove-steps button in bb-editor for adding/removing according number of steps to/from all patterns of visible beat/baseline - replace rest of wizard by simple directory-selection-dialog for working-dir when running the first time -- do REAL release in envelopes (can't be precalculated as it depends on key-press-duration/rest of envelope) - correctly load steps/dots from FLP-files - convert FL-Plucked!-parameters to Vibed-parameters - in flp-import-filter: merge play-list-items if possible @@ -11,11 +11,10 @@ - undo/redo-support in note/track etc. - save tco-settings in trackContentWidget::saveSettings() etc. instead of track::... - restore stacking-order of windows when loading project -- bristol-bindings +- bristol-bindings? - resample sample-track-tcos when using hq-mode - add support for panes-interface (like blender) (instead of MDI etc.) - message to user when importing unsupported MIDI-file (track-count = 0) -- volume-knobs for each sample-track - AMS/OMS-bindings - remove binary-embed-system - recording-functionality @@ -38,8 +37,6 @@ - speed up painting of sampleTCO - solve problems with different keyboard-layouts when playing channel-track with pc-keyboard -> use tr() - panning env+lfo -- plucked-string-synth: knob for metallic -> use noise as wave-shape -- finish qt4-port and make LMMS usable when compiling with Qt4 - rewrite export-project-dialog using layout-mechanism - dynamic pitch-change - make piano-roll use the global clipboard?? @@ -53,7 +50,6 @@ - effect-board -> live-fx from input - chord-editor? - WAVE/OGG/MP3-Import -> FFT-analysis -> write notes -- FLP-Import - classical note-edit-window -> also ability of printing and maybe later scanning & recognition of notes - add FLAC as export-format? diff --git a/data/locale/de.qm b/data/locale/de.qm index b0cfe5c1a8325db69dbd004d095f0adc53e7f923..bc034e8e092516ec18999afd2522f54ffa1bcb5c 100755 GIT binary patch delta 6936 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 delta 7158 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 Beat+Baseline Editor Beat+Baseline Editor + + Add beat/bassline + Beat/Bassline hinzufügen + bbTCO @@ -842,28 +846,28 @@ Bitte wählen Sie ein Verzeichnis: For using the ready presets and samples of LMMS and enjoying the demo-songs the according files have to be copied or linked into your LMMS-working-directory. When copying files, you can modify them, but they need additional space in your working-directory. If you link files, you cannot modify them, but they need no extra space. So it's recommended to copy presets and demo-projects and link samples, which are bigger in size. - Damit Sie die fertigen Presets und Samples von LMMS nutzen können und mit den Demo-Songs herumspielen können, müssen die entsprechenden Dateien in Ihr LMMS-Arbeitsverzeichnis kopiert oder verknüpft werden. + Damit Sie die fertigen Presets und Samples von LMMS nutzen können und mit den Demo-Songs herumspielen können, müssen die entsprechenden Dateien in Ihr LMMS-Arbeitsverzeichnis kopiert oder verknüpft werden. Kopierte Dateien können Sie ändern, aber gleichzeitig belegen diese auch zusätzlichen Speicherplatz in Ihrem Arbeitsverzeichnis. Wenn Sie Dateien verknüpfen, können Sie diese nicht verändern, brauchen dafür aber auch keinen extra Speicherplatz. Deshalb wird empfohlen, Presets und Demo-Projekte zu kopieren und die Samples zu verknüpfen, da letztere doch eine gewisse Größe haben. samples: - Samples: + Samples: copy - Kopieren + Kopieren link - Verknüpfen + Verknüpfen presets: - Presets: + Presets: demo projects: - Demo Projekte: + Demo Projekte: Welcome to LMMS @@ -875,7 +879,7 @@ Kopierte Dateien können Sie ändern, aber gleichzeitig belegen diese auch zusä Copy or link files - Dateien kopieren oder verknüpfen + Dateien kopieren oder verknüpfen Directory not existing @@ -1533,6 +1537,10 @@ Stellen Sie sicher, dass Sie Schreibzugriff auf die gewählte Datei/Gerät haben Please wait, loading sample for preview... Bitte warten, Sample wird für Vorschau geladen.... + + --- Factory files --- + + mainWindow @@ -1763,6 +1771,14 @@ Bitte besuchen Sie http://wiki.mindrules.net für Dokumentationen über LMMS.Send MIDI-events MIDI-Ereignisse senden + + Default velocity for all input-events + Standardlautstärke für alle einkommenden Ereignisse + + + Default velocity for all output-events + Standardlautstärke für alle ausgehende Ereignisse + mixer @@ -1884,11 +1900,11 @@ Bitte besuchen Sie http://wiki.mindrules.net für Dokumentationen über LMMS. Channel muted - Kanal stumm geschalten + Kanal stumm geschalten The channel this pattern belongs to is currently muted therefore freezing makes no sense! Do you still want to continue? - Der Kanal, zu dem dieser Pattern gehört, ist derzeit stumm geschaltet, weshalb das Einfrieren keinen Sinn ergibt! Wollen Sie trotzdem fortfahren? + Der Kanal, zu dem dieser Pattern gehört, ist derzeit stumm geschaltet, weshalb das Einfrieren keinen Sinn ergibt! Wollen Sie trotzdem fortfahren? Add steps @@ -1912,6 +1928,14 @@ use mouse wheel to set volume of a step Doppelklick, um diesen Pattern im Piano-Roll zu öffnen Lautstärke eines Steps kann mit Mausrad geändert werden + + Pattern muted + Pattern stummgeschaltet + + + The track this pattern belongs to or the pattern itself is currently muted therefore freezing makes no sense! Do you still want to continue? + Die Spur, zu der dieser Pattern gehört oder dieser Pattern selbst sind derzeit stummgeschaltet, weshalb das Einfrieren keinen Sinn ergibt. Wollen Sie trotzdem fortfahren? + patternFreezeStatusDialog @@ -2104,6 +2128,10 @@ Lautstärke eines Steps kann mit Mausrad geändert werden simple sampler with various settings for using samples (e.g. drums) in an instrument-track Einfacher Sampler mit verschiedenen Einstellungen zur Nutzung von Samples (z.B. Drums) in einer Instrument-Spur + + Filter for importing FL Studio projects into LMMS + Filter für Import von FL Studio Projekten in LMMS + projectNotes @@ -2283,6 +2311,22 @@ Lautstärke eines Steps kann mit Mausrad geändert werden Sample track Sample-Spur + + Channel volume + Kanal Lautstärke + + + Channel volume: + Kanal Lautstärke: + + + VOL + LAUT + + + With this knob you can set the volume of the opened channel. + Mit diesem Knopf können Sie die Lautstärke des geöffneten Kanals ändern. + setupDialog @@ -2420,6 +2464,18 @@ Latenz: %2 ms Choose artwork-theme directory Artwork-Verzeichnis wählen + + Display volume as dbV + Lautstärke als in dbV anzeigen + + + FL Studio installation directory + FL Studio Installationsverzeichnis + + + Choose FL Studio installation directory + FL Studio Installationsverzeichnis wählen + setupWidget @@ -2558,7 +2614,7 @@ Wollen Sie diese überschreiben? MIDI-files (*.mid) - MIDI-Dateien (*.mid) + MIDI-Dateien (*.mid) TEMPO/BPM @@ -2620,6 +2676,10 @@ Bitte stellen Sie sicher, dass Sie Schreibrechte auf diese Datei besitzen und ve Edit mode (select and move) Editier-Modus (auswählen und verschieben) + + Auto limiter + Autolimiter + surroundArea @@ -2794,7 +2854,7 @@ Bitte stellen Sie sicher, dass Sie Schreibrechte auf diese Datei und das Verzeic Couldn't find a filter for importing file %1. You should convert this file into a format supported by LMMS using another software. - Konnte keinen Filter finden, um die Datei %1 zu importieren. + Konnte keinen Filter finden, um die Datei %1 zu importieren. Sie sollten diese Datei mit Hilfe einer anderen Software in ein Format konvertieren, das von LMMS unterstützt wird. @@ -2807,6 +2867,16 @@ Please make sure you have read-permission to the file and the directory containi Konnte Datei %1 nicht zum Lesen öffnen. Bitte stellen Sie sicher, dass Sie Lese-Rechte auf diese Datei sowie das Verzeichnis besitzen und probieren es erneut! + + Couldn't find a filter for importing file %1. +You should convert this file into a format supported by LMMS using another software. + Es konnte kein Filter gefunden werden, um die Datei %1 zu importieren. +Sie sollten diese Datei mit Hilfe anderer Software in ein von LMMS unterstützes Format umwandeln. + + + Importing FLP-file... + Importiere FLP-Datei... + trackContentObject @@ -2850,6 +2920,10 @@ Bitte stellen Sie sicher, dass Sie Lese-Rechte auf diese Datei sowie das Verzeic Press <Ctrl> for free resizing. Drücken Sie <Strg> für freie Größenänderung. + + Mute/unmute (<Ctrl> + middle click) + Stumm/Laut schalten (<Strg> + Mittelklick) + trackOperationsWidget @@ -3274,4 +3348,15 @@ Die LED rechts unterhalb der Wellenform gibt an, ob die Saite aktiviert ist.klicken, um Visualisierung des Masterausgangs an-/auszuschalten + + volumeKnob + + Please enter a new value between -96.0 dbV and 6.0 dbV: + Bitte geben Sie einen Wert zwischen -96.0 dbV und 6.0 dbV ein: + + + Please enter a new value between %1 and %2: + Bitte geben Sie einen neuen Wert zwischen %1 und %2 ein: + + diff --git a/data/presets/TripleOscillator/SawReso.cs.xml b/data/presets/TripleOscillator/SawReso.cs.xml new file mode 100644 index 0000000000..b3c9570fe4 --- /dev/null +++ b/data/presets/TripleOscillator/SawReso.cs.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/data/presets/Vibed/Harpsichord.cs.xml b/data/presets/Vibed/Harpsichord.cs.xml new file mode 100644 index 0000000000..f9834baacb --- /dev/null +++ b/data/presets/Vibed/Harpsichord.cs.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/data/presets/Vibed/SadPad.cs.xml b/data/presets/Vibed/SadPad.cs.xml new file mode 100644 index 0000000000..43d64ace93 --- /dev/null +++ b/data/presets/Vibed/SadPad.cs.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/data/themes/default/muted.png b/data/themes/default/muted.png new file mode 100644 index 0000000000000000000000000000000000000000..99449ac4da19d8e75134251defeaf6cccfb688e2 GIT binary patch literal 1396 zcmV-)1&jKLP)me3FwV zdCrsH$$9?gIS2lyB|OF_K4gzt+C%n4umFfBPMmmKlBBH;hodGhFVA8y80MUUKsX!@ z`2GIjSSrZ@OGAYakGytE&sY-%lVAKoA6qii)VJ zs>1Dd<8rweA0MCY?(Y6}_wLKOV36a-kK^%p&@>8B6iFl! z02qx%R8_@jG*Vev$&MX6C@n4J>eZ|Ljg5`l0Ut00Xa+z$ckW#0%9ShEx3{-*>eMO5 z#>UVz3PG5QD@hWPB%$j%f*_!(DzR9Mfq?S`oOVs>^GS(fM2(=_7oIK{=qxZUo8 zsi`Tsr>CbMn38NZ+q=cZ#hg5O5?$BH&CLa%qN0LbyLRDnxe!G$3mO|6;+_49JRj?rW$5T4-X?@_GQUHJX}9KZ%BlBQ`%RaIrT+X{fHs;H`p z*XzaW^&*NQ+H8z<=J}M2TxT>TW81Wy!l#xJxN?O^%VE~25&Ay<5Uuew3YZ5Nq(~$( zwqU`6isj3f6OBf*r8PJ>$nfwmx~@|fi?TqTAXUGOr<RN+q;QDezB|I=@gM1m zr_vAV*syx_>cwScWou+vrl_b0Ns=%cjg*&{Bg-<;Xq1NNIM_>A`rap5=(Nwv%`f*c z?ekLG@Eo2Sy=Zs(6K6s*SAbjMo;`c^cXxMBXqtx2W}~dE42Q#k-EL>?+O=${ts!@6 z6x%C1v(U-@J}x)C%ET|1usiLz-ui&T&COKJ1WcJLx&(v|95}E&9*?)KTD2-~;lhQO z&1NPiCrPK%=td(m-XSWNtpFg}+fDE07qBEIv2NLk`_r!gC|tIj$Xr$C00sk)9vvNx z^!4@iSS*&+p-?Da5Crn`^C>AQAw3%-(sCGVOeQ@BgMpEe5jr|LxLdal&F3SW zOp>T?ru2({LN7FJ#hQ-uLyQ4n42T;3)wmPDbX!|nhsk7`S6Eo+bUK~J(sj=Y{=pH7 zNHJr!5DA8v2?X$+JB#no=a}yf@{uRhcU|K$a22>C{Kw=l0~Np$pepm5jP)Yb8w&E4 zKC`IQrQ}%%1q11ew?~7m(d58wogUx{a0<95JZ3Bz0Sk~1C>gaCzz(>8;>_7>CjCD$ z_9rkaJYgn^fFUywgbZjtV9o4OMxQAloax0WK>rIFBo_AJ_DM1T0000getSongEditor(), SLOT( addBBTrack() ), + m_toolBar ); + #ifdef QT4 m_playButton->setWhatsThis( @@ -144,6 +150,8 @@ bbEditor::bbEditor( engine * _engine ) : tb_layout->addWidget( m_stopButton ); tb_layout->addSpacing( 20 ); tb_layout->addWidget( m_bbComboBox ); + tb_layout->addSpacing( 10 ); + tb_layout->addWidget( add_bb_track ); tb_layout->addStretch(); tb_layout->addWidget( l ); tb_layout->addSpacing( 15 ); @@ -198,7 +206,7 @@ void bbEditor::setCurrentBB( int _bb ) tact bbEditor::lengthOfBB( csize _bb ) { midiTime max_length; - + trackVector tv = tracks(); for( trackVector::iterator it = tv.begin(); it != tv.end(); ++it ) { diff --git a/src/core/mixer.cpp b/src/core/mixer.cpp index 4d8e9604fc..83936e4180 100644 --- a/src/core/mixer.cpp +++ b/src/core/mixer.cpp @@ -154,16 +154,16 @@ bool mixer::criticalXRuns( void ) const void mixer::setClipScaling( bool _state ) { m_mixMutex.lock(); - + m_scaleClip = _state; - + if( _state ) { m_poolDepth = 3; m_readBuffer = 0; m_analBuffer = m_readBuffer + 1; m_writeBuffer = m_poolDepth - 1; - + for( ch_cnt_t chnl=0; chnl < m_audioDev->channels(); ++chnl ) { m_clipped[chnl] = FALSE; @@ -172,6 +172,9 @@ void mixer::setClipScaling( bool _state ) m_previousSample[chnl] = 0.0; m_newBuffer[chnl] = FALSE; } + // FIXME: why assign buffer-ptr to m_readBuf just for calling + // another method? + // clearAudioBuffer(m_bufferPool[i],...) would do as well for( Uint8 i = 0; i < 3; i++ ) { m_readBuf = m_bufferPool[i]; @@ -185,7 +188,7 @@ void mixer::setClipScaling( bool _state ) m_writeBuffer = 1; m_analBuffer = 1; } - + m_mixMutex.unlock(); } @@ -239,16 +242,16 @@ const surroundSampleFrame * mixer::renderNextBuffer( void ) // qSwap( m_curBuf, m_nextBuf ); m_writeBuffer++; m_writeBuffer %= m_poolDepth; - + m_readBuffer++; m_readBuffer %= m_poolDepth; - + m_analBuffer++; m_analBuffer %= m_poolDepth; - + m_writeBuf = m_bufferPool[m_writeBuffer]; m_readBuf = m_bufferPool[m_readBuffer]; - + // clear last audio-buffer clearAudioBuffer( m_writeBuf, m_framesPerAudioBuffer ); @@ -280,9 +283,8 @@ const surroundSampleFrame * mixer::renderNextBuffer( void ) { if( ( *it )->m_bufferUsage != audioPort::NONE ) { - processBuffer( - ( *it )->firstBuffer(), - ( *it )->nextFxChannel() ); + processBuffer( ( *it )->firstBuffer(), + ( *it )->nextFxChannel() ); ( *it )->nextPeriod(); } } diff --git a/src/core/track.cpp b/src/core/track.cpp index 60a7bbdf5e..04bf574de1 100644 --- a/src/core/track.cpp +++ b/src/core/track.cpp @@ -95,6 +95,7 @@ trackContentObject::trackContentObject( track * _track ) : m_action( NONE ), m_autoResize( FALSE ), m_initialMouseX( 0 ), + m_muted( FALSE ), m_hint( NULL ) { if( s_textFloat == NULL ) @@ -225,6 +226,7 @@ void trackContentObject::mousePressEvent( QMouseEvent * _me ) if( m_track->getTrackContainer()->allowRubberband() == TRUE && _me->button() == Qt::LeftButton ) { + // if rubberband is active, we can be selected if( m_track->getTrackContainer()->rubberBandActive() == FALSE ) { if( @@ -246,11 +248,13 @@ void trackContentObject::mousePressEvent( QMouseEvent * _me ) } else if( getTrack()->eng()->getMainWindow()->isShiftPressed() == TRUE ) { + // add/remove object to/from selection selectableObject::mousePressEvent( _me ); } else if( _me->button() == Qt::LeftButton && getTrack()->eng()->getMainWindow()->isCtrlPressed() == TRUE ) { + // start drag-action multimediaProject mmp( multimediaProject::DRAG_N_DROP_DATA ); saveState( mmp, mmp.content() ); #ifdef QT4 @@ -272,6 +276,7 @@ void trackContentObject::mousePressEvent( QMouseEvent * _me ) /* eng()->getMainWindow()->isShiftPressed() == FALSE &&*/ fixedTCOs() == FALSE ) { + // move or resize setJournalling( FALSE ); m_initialMouseX = _me->x(); @@ -307,12 +312,17 @@ void trackContentObject::mousePressEvent( QMouseEvent * _me ) mouseMoveEvent( _me ); s_textFloat->show(); } - else if( ( _me->button() == Qt::MidButton/* || - ( _me->button() == Qt::LeftButton && - eng()->getMainWindow()->isShiftPressed() == TRUE )*/ ) && - fixedTCOs() == FALSE ) + else if( _me->button() == Qt::MidButton ) { - close(); + if( getTrack()->eng()->getMainWindow()->isCtrlPressed() ) + { + toggleMute(); + } + else if( fixedTCOs() == FALSE ) + { + // delete ourself + close(); + } } } @@ -464,9 +474,10 @@ void trackContentObject::contextMenuEvent( QContextMenuEvent * _cme ) tr( "Copy" ), this, SLOT( copy() ) ); contextMenu.addAction( embed::getIconPixmap( "edit_paste" ), tr( "Paste" ), this, SLOT( paste() ) ); - //contextMenu.insertSeparator(); - //contextMenu.insertItem( tr( "&Help" ), this, SLOT( displayHelp() ) ); - + contextMenu.insertSeparator(); + contextMenu.addAction( embed::getIconPixmap( "muted" ), + tr( "Mute/unmute ( + middle click)" ), + this, SLOT( toggleMute() ) ); constructContextMenu( &contextMenu ); contextMenu.exec( QCursor::pos() ); @@ -559,6 +570,15 @@ void trackContentObject::paste( void ) +void trackContentObject::toggleMute( void ) +{ + m_muted = !m_muted; + update(); +} + + + + void trackContentObject::setAutoResizeEnabled( bool _e ) { m_autoResize = _e; @@ -1215,8 +1235,7 @@ void trackWidget::changePosition( const midiTime & _new_pos ) for( csize i = 0; i < tcos; ++i ) { - trackContentObject * tco = - m_trackContentWidget.getTCO( i ); + trackContentObject * tco = m_trackContentWidget.getTCO( i ); tco->changeLength( tco->length() ); Sint32 ts = tco->startPosition(); Sint32 te = tco->endPosition(); diff --git a/src/tracks/bb_track.cpp b/src/tracks/bb_track.cpp index 8242e3389f..3f228392b1 100644 --- a/src/tracks/bb_track.cpp +++ b/src/tracks/bb_track.cpp @@ -135,7 +135,7 @@ void bbTCO::mouseDoubleClickEvent( QMouseEvent * ) void bbTCO::paintEvent( QPaintEvent * ) { QColor col = m_color; - if( getTrack()->muted() ) + if( getTrack()->muted() || muted() ) { col = QColor( 160, 160, 160 ); } @@ -189,7 +189,13 @@ void bbTCO::paintEvent( QPaintEvent * ) p.setFont( pointSize<7>( p.font() ) ); p.setPen( QColor( 0, 0, 0 ) ); - p.drawText( 2, QFontMetrics( p.font() ).height() - 1, m_name ); + p.drawText( 2, p.fontMetrics().height() - 1, m_name ); + + if( muted() ) + { + p.drawPixmap( 3, p.fontMetrics().height() + 1, + embed::getIconPixmap( "muted", 16, 16 ) ); + } #ifndef QT4 bitBlt( this, rect().topLeft(), &pm ); @@ -211,6 +217,7 @@ void bbTCO::saveSettings( QDomDocument & _doc, QDomElement & _this ) _this.setAttribute( "pos", startPosition() ); } _this.setAttribute( "len", length() ); + _this.setAttribute( "muted", muted() ); _this.setAttribute( "color", m_color.rgb() ); } @@ -225,6 +232,11 @@ void bbTCO::loadSettings( const QDomElement & _this ) movePosition( _this.attribute( "pos" ).toInt() ); } changeLength( _this.attribute( "len" ).toInt() ); + if( _this.attribute( "muted" ).toInt() != muted() ) + { + toggleMute(); + } + if( _this.attribute( "color" ).toUInt() != 0 ) { m_color.setRgb( _this.attribute( "color" ).toUInt() ); @@ -384,7 +396,8 @@ bool FASTCALL bbTrack::play( const midiTime & _start, for( vlist::iterator it = tcos.begin(); it != tcos.end(); ++it ) { - if( ( *it )->startPosition() >= lastPosition ) + if( !( *it )->muted() && + ( *it )->startPosition() >= lastPosition ) { lastPosition = ( *it )->startPosition(); lastLen = ( *it )->length(); diff --git a/src/tracks/instrument_track.cpp b/src/tracks/instrument_track.cpp index 8a0fed3c59..6bcb2086a5 100644 --- a/src/tracks/instrument_track.cpp +++ b/src/tracks/instrument_track.cpp @@ -891,7 +891,8 @@ bool FASTCALL instrumentTrack::play( const midiTime & _start, it != tcos.end(); ++it ) { pattern * p = dynamic_cast( *it ); - if( p == NULL ) + // everything which is not a pattern or muted won't be played + if( p == NULL || ( *it )->muted() ) { continue; } diff --git a/src/tracks/pattern.cpp b/src/tracks/pattern.cpp index 604e3eea53..a3cd1214ee 100644 --- a/src/tracks/pattern.cpp +++ b/src/tracks/pattern.cpp @@ -132,7 +132,7 @@ pattern::~pattern() // us before if( eng()->getSongEditor()->playing() && eng()->getSongEditor()->playMode() == - songEditor::PLAY_PATTERN ) + songEditor::PLAY_PATTERN ) { eng()->getSongEditor()->playPattern( NULL ); } @@ -427,6 +427,7 @@ void pattern::saveSettings( QDomDocument & _doc, QDomElement & _this ) _this.setAttribute( "pos", startPosition() ); } _this.setAttribute( "len", length() ); + _this.setAttribute( "muted", muted() ); _this.setAttribute( "steps", m_steps ); _this.setAttribute( "frozen", m_frozenPattern != NULL ); @@ -456,6 +457,10 @@ void pattern::loadSettings( const QDomElement & _this ) movePosition( _this.attribute( "pos" ).toInt() ); } changeLength( midiTime( _this.attribute( "len" ).toInt() ) ); + if( _this.attribute( "muted" ).toInt() != muted() ) + { + toggleMute(); + } clearNotes(); @@ -556,7 +561,7 @@ void pattern::freeze( void ) QMessageBox::Ok ); return; } - if( m_instrumentTrack->muted() ) + if( m_instrumentTrack->muted() || muted() ) { if( QMessageBox:: #if QT_VERSION >= 0x030200 @@ -565,9 +570,10 @@ void pattern::freeze( void ) information #endif - ( 0, tr( "Channel muted" ), - tr( "The channel this pattern " - "belongs to is " + ( 0, tr( "Pattern muted" ), + tr( "The track this pattern " + "belongs to or the " + "pattern itself is " "currently muted " "therefore " "freezing makes no " @@ -786,11 +792,6 @@ void pattern::mouseDoubleClickEvent( QMouseEvent * _me ) void pattern::mousePressEvent( QMouseEvent * _me ) { -/* if( _me->button() != Qt::LeftButton ) - { - return; -}*/ - if( _me->button() == Qt::LeftButton && m_patternType == pattern::BEAT_PATTERN && ( pixelsPerTact() >= 192 || @@ -1001,7 +1002,7 @@ void pattern::paintEvent( QPaintEvent * ) height() - 2 * TCO_BORDER_WIDTH ); } - if( getTrack()->muted() ) + if( getTrack()->muted() || muted() ) { p.setPen( QColor( 160, 160, 160 ) ); } @@ -1110,9 +1111,21 @@ void pattern::paintEvent( QPaintEvent * ) } p.setFont( pointSize<7>( p.font() ) ); - p.setPen( QColor( 32, 240, 32 ) ); - p.drawText( 2, 9, m_name ); - if( m_frozenPattern != NULL ) + if( muted() || getTrack()->muted() ) + { + p.setPen( QColor( 192, 192, 192 ) ); + } + else + { + p.setPen( QColor( 32, 240, 32 ) ); + } + p.drawText( 2, p.fontMetrics().height() - 1, m_name ); + if( muted() ) + { + p.drawPixmap( 3, p.fontMetrics().height() + 1, + embed::getIconPixmap( "muted", 16, 16 ) ); + } + else if( m_frozenPattern != NULL ) { p.setPen( QColor( 0, 224, 255 ) ); p.drawRect( 0, 0, width(), height() - 1 ); diff --git a/src/tracks/sample_track.cpp b/src/tracks/sample_track.cpp index 81f839a105..a83c37b566 100644 --- a/src/tracks/sample_track.cpp +++ b/src/tracks/sample_track.cpp @@ -192,7 +192,7 @@ void sampleTCO::paintEvent( QPaintEvent * _pe ) { #ifdef QT4 QPainter p( this ); - // TODO: set according brush/pen for gradient! +#warning TODO: set according brush for gradient! p.fillRect( _pe->rect(), QColor( 64, 64, 64 ) ); #else // create pixmap for our widget @@ -218,7 +218,7 @@ void sampleTCO::paintEvent( QPaintEvent * _pe ) p.setPen( QColor( 0, 0, 0 ) ); p.drawRect( 0, 0, width(), height() ); - if( getTrack()->muted() ) + if( getTrack()->muted() || muted() ) { p.setPen( QColor( 128, 128, 128 ) ); } @@ -236,6 +236,13 @@ void sampleTCO::paintEvent( QPaintEvent * _pe ) p.drawLine( r.x() + r.width(), r.y() + r.height() / 2, width() - 2, r.y() + r.height() / 2 ); } + + p.translate( 0, 0 ); + if( muted() ) + { + p.drawPixmap( 3, 8, embed::getIconPixmap( "muted", 16, 16 ) ); + } + #ifndef QT4 bitBlt( this, _pe->rect().topLeft(), &pm ); #endif @@ -266,6 +273,7 @@ void FASTCALL sampleTCO::saveSettings( QDomDocument & _doc, _this.setAttribute( "pos", startPosition() ); } _this.setAttribute( "len", length() ); + _this.setAttribute( "muted", muted() ); _this.setAttribute( "src", sampleFile() ); if( sampleFile() == "" ) { @@ -290,6 +298,10 @@ void FASTCALL sampleTCO::loadSettings( const QDomElement & _this ) m_sampleBuffer.loadFromBase64( _this.attribute( "data" ) ); } changeLength( _this.attribute( "len" ).toInt() ); + if( _this.attribute( "muted" ).toInt() != muted() ) + { + toggleMute(); + } } @@ -451,7 +463,7 @@ bool FASTCALL sampleTrack::play( const midiTime & _start, it != tcos.end(); ++it ) { sampleTCO * st = dynamic_cast( *it ); - if( st != NULL ) + if( st != NULL && !st->muted() ) { st->play( buf, _start_frame + static_cast( _start.getTact() *