root/branches/new_fx_rack_and_sample_fun/gui/src/SampleEditor/SampleEditor.cpp @ 711

Revision 711, 21.0 KB (checked in by wolke, 4 years ago)

small change

Line 
1/*
2 * Hydrogen
3 * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net]
4 *
5 * http://www.hydrogen-music.org
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY, without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20 *
21 */
22
23#include "SampleEditor.h"
24#include "../HydrogenApp.h"
25#include "InstrumentEditor/InstrumentEditor.h"
26#include "InstrumentEditor/InstrumentEditorPanel.h"
27#include "../widgets/Button.h"
28
29#include "MainSampleWaveDisplay.h"
30#include "DetailWaveDisplay.h"
31#include "TargetWaveDisplay.h"
32
33#include <hydrogen/data_path.h>
34#include <hydrogen/h2_exception.h>
35#include <hydrogen/Preferences.h>
36#include <hydrogen/sample.h>
37#include <hydrogen/audio_engine.h>
38#include <hydrogen/hydrogen.h>
39
40#include <QModelIndex>
41#include <QTreeWidget>
42#include <QMessageBox>
43#include <algorithm>
44
45using namespace H2Core;
46using namespace std;
47
48SampleEditor::SampleEditor ( QWidget* pParent, int nSelectedLayer, QString mSamplefilename )
49                : QDialog ( pParent )
50                , Object ( "SampleEditor" )
51                , m_pSampleEditorStatus( true )
52                , m_pSamplefromFile ( NULL )
53                , m_pSelectedLayer ( nSelectedLayer )
54                , m_samplename ( mSamplefilename )
55                , m_pzoomfactor ( 1 )
56                , m_pdetailframe ( 0 )
57                , m_plineColor ( "default" )
58                , m_ponewayStart ( false )
59                , m_ponewayLoop ( false )
60                , m_ponewayEnd ( false )
61                , m_pslframes ( 0 )
62                , m_pPositionsRulerPath ( NULL )
63                , m_pPlayButton ( false )
64{
65        setupUi ( this );
66        INFOLOG ( "INIT" );
67
68        m_pTimer = new QTimer(this);
69        connect(m_pTimer, SIGNAL(timeout()), this, SLOT(updateMainsamplePostionRuler()));
70
71        QString newfilename = mSamplefilename.section( '/', -1 );
72
73        setWindowTitle ( QString( "SampleEditor " + newfilename) );
74        setFixedSize ( width(), height() );
75        installEventFilter( this );
76
77//this new sample give us the not changed real samplelength
78        m_pSamplefromFile = Sample::load( mSamplefilename );
79        if (!m_pSamplefromFile) reject();
80
81        unsigned slframes = m_pSamplefromFile->get_n_frames();
82
83        LoopCountSpinBox->setRange(0, 20000 );
84        StartFrameSpinBox->setRange(0, slframes );
85        LoopFrameSpinBox->setRange(0, slframes );
86        EndFrameSpinBox->setRange(0, slframes );
87        EndFrameSpinBox->setValue( slframes );
88
89        intDisplays();
90        getAllFrameInfos();
91
92//      connect( StartFrameSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( valueChangedStartFrameSpinBox(int) ) );
93//      connect( LoopFrameSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( valueChangedLoopFrameSpinBox(int) ) );
94//      connect( EndFrameSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( valueChangedEndFrameSpinBox(int) ) );
95
96}
97
98
99
100SampleEditor::~SampleEditor()
101{
102        delete m_pMainSampleWaveDisplay;
103        delete m_pSampleAdjustView;
104        delete m_pTargetSampleView;
105        delete m_pSamplefromFile;
106        INFOLOG ( "DESTROY" );
107}
108
109
110void SampleEditor::closeEvent(QCloseEvent *event)
111{
112        if ( !m_pSampleEditorStatus ){
113                int err = QMessageBox::information( this, "Hydrogen", tr( "Unsaved changes left. This changes will be lost. \nAre you sure?"), tr("&Ok"), tr("&Cancel"), 0, 1 );
114                if ( err == 0 ){
115                        m_pSampleEditorStatus = true;
116                        HydrogenApp::getInstance()->closeSampleEditor();;       
117                }else
118                {
119                        return;
120                }
121        }else
122        {
123                HydrogenApp::getInstance()->closeSampleEditor();
124        }
125}
126
127
128void SampleEditor::getAllFrameInfos()
129{
130        Hydrogen *pEngine = Hydrogen::get_instance();
131        H2Core::Instrument *m_pInstrument = NULL;
132        Sample* pSample = NULL;
133        Song *pSong = Hydrogen::get_instance()->getSong();
134        if (pSong != NULL) {
135                InstrumentList *pInstrList = pSong->get_instrument_list();
136                int nInstr = Hydrogen::get_instance()->getSelectedInstrumentNumber();
137                if ( nInstr >= static_cast<int>(pInstrList->get_size()) ) {
138                        nInstr = -1;
139                }
140
141                if (nInstr == -1) {
142                        m_pInstrument = NULL;
143                }
144                else {
145                        m_pInstrument = pInstrList->get( nInstr );
146                        //INFOLOG( "new instr: " + m_pInstrument->m_sName );
147                }
148        }
149        H2Core::InstrumentLayer *pLayer = m_pInstrument->get_layer( m_pSelectedLayer );
150        if ( pLayer ) {
151                pSample = pLayer->get_sample();
152        }
153
154//this values are needed if we restore a sample from from disk if a new song with sample changes will load
155        m_sample_is_modified = pSample->get_sample_is_modified();
156        m_sample_mode = pSample->get_sample_mode();
157        m_start_frame = pSample->get_start_frame();
158        m_loop_frame = pSample->get_loop_frame();
159        m_repeats = pSample->get_repeats();
160        m_end_frame = m_pSamplefromFile->get_end_frame();
161
162        Hydrogen::HVeloVector velovector;
163        //velovector
164        if ( pSample->__velo_pan.m_Samplevolumen[0].m_SampleVeloframe == -1 ){
165                pEngine->m_volumen.clear();
166                velovector.m_hxframe = 0;
167                velovector.m_hyvalue = 0;
168                pEngine->m_volumen.push_back( velovector );
169                velovector.m_hxframe = 841;
170                velovector.m_hyvalue = 0;
171                pEngine->m_volumen.push_back( velovector );
172        }else
173        {
174                pEngine->m_volumen.clear();
175                for( int i = 0 ; i < static_cast<int>(pSample->__velo_pan.m_Samplevolumen.size()); i++){
176                        velovector.m_hxframe = pSample->__velo_pan.m_Samplevolumen[i].m_SampleVeloframe;
177                        velovector.m_hyvalue = pSample->__velo_pan.m_Samplevolumen[i].m_SampleVelovalue;
178                        pEngine->m_volumen.push_back( velovector );     
179                }
180        }
181
182        Hydrogen::HPanVector panvector;
183        if ( pSample->__velo_pan.m_SamplePan[0].m_SamplePanframe == -1 ){
184                pEngine->m_pan.clear();
185                panvector.m_hxframe = 0;
186                panvector.m_hyvalue = 45;
187                pEngine->m_pan.push_back( panvector );
188                panvector.m_hxframe = 841;
189                panvector.m_hyvalue = 45;
190                pEngine->m_pan.push_back( panvector );
191        }else
192        {
193                pEngine->m_pan.clear();
194                for( int i = 0 ; i < static_cast<int>(pSample->__velo_pan.m_SamplePan.size()); i++){
195                        panvector.m_hxframe = pSample->__velo_pan.m_SamplePan[i].m_SamplePanframe;
196                        panvector.m_hyvalue = pSample->__velo_pan.m_SamplePan[i].m_SamplePanvalue;
197                        pEngine->m_pan.push_back( panvector );
198                }
199        }
200
201        if (m_sample_is_modified) {
202                m_end_frame = pSample->get_end_frame();
203
204                if ( m_sample_mode == "forward" )
205                        ProcessingTypeComboBox->setCurrentIndex ( 0 );
206                if ( m_sample_mode == "reverse" )
207                        ProcessingTypeComboBox->setCurrentIndex ( 1 );
208                if ( m_sample_mode == "pingpong" )
209                        ProcessingTypeComboBox->setCurrentIndex ( 2 );
210
211                StartFrameSpinBox->setValue( m_start_frame );
212                LoopFrameSpinBox->setValue( m_loop_frame );
213                EndFrameSpinBox->setValue( m_end_frame );
214                LoopCountSpinBox->setValue( m_repeats );
215
216                m_pMainSampleWaveDisplay->m_pStartFramePosition = m_start_frame / m_divider + 25 ;
217                m_pMainSampleWaveDisplay->updateDisplayPointer();
218                m_pMainSampleWaveDisplay->m_pLoopFramePosition =  m_loop_frame / m_divider + 25 ;
219                m_pMainSampleWaveDisplay->updateDisplayPointer();
220                m_pMainSampleWaveDisplay->m_pEndFramePosition =  m_end_frame / m_divider + 25 ;
221                m_pMainSampleWaveDisplay->updateDisplayPointer();
222
223        }
224        m_pTargetSampleView->updateDisplay( pLayer );
225
226        connect( StartFrameSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( valueChangedStartFrameSpinBox(int) ) );
227        connect( LoopFrameSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( valueChangedLoopFrameSpinBox(int) ) );
228        connect( EndFrameSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( valueChangedEndFrameSpinBox(int) ) );
229        connect( LoopCountSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( valueChangedLoopCountSpinBox( int ) ) );
230        connect( ProcessingTypeComboBox, SIGNAL( currentIndexChanged ( const QString )  ), this, SLOT( valueChangedProcessingTypeComboBox( const QString ) ) );
231}
232
233
234void SampleEditor::getAllLocalFrameInfos()
235{
236        m_start_frame = StartFrameSpinBox->value();
237        m_loop_frame = LoopFrameSpinBox->value();
238        m_repeats = LoopCountSpinBox->value();
239        m_end_frame = EndFrameSpinBox->value();
240}
241
242
243
244void SampleEditor::intDisplays()
245{
246        H2Core::Instrument *m_pInstrument = NULL;
247        Song *pSong = Hydrogen::get_instance()->getSong();
248        if (pSong != NULL) {
249                InstrumentList *pInstrList = pSong->get_instrument_list();
250                int nInstr = Hydrogen::get_instance()->getSelectedInstrumentNumber();
251                if ( nInstr >= static_cast<int>(pInstrList->get_size()) ) {
252                        nInstr = -1;
253                }
254
255                if (nInstr == -1) {
256                        m_pInstrument = NULL;
257                }
258                else {
259                        m_pInstrument = pInstrList->get( nInstr );
260                        //INFOLOG( "new instr: " + m_pInstrument->m_sName );
261                }
262        }
263
264
265        QApplication::setOverrideCursor(Qt::WaitCursor);
266
267// wavedisplays
268//      AudioEngine::get_instance()->get_sampler()->stop_playing_notes();
269        m_divider = m_pSamplefromFile->get_n_frames() / 574.0F;
270        m_pMainSampleWaveDisplay = new MainSampleWaveDisplay( mainSampleview );
271        m_pMainSampleWaveDisplay->updateDisplay( m_samplename );
272        m_pMainSampleWaveDisplay->move( 1, 1 );
273
274        m_pSampleAdjustView = new DetailWaveDisplay( mainSampleAdjustView );
275        m_pSampleAdjustView->updateDisplay( m_samplename );
276        m_pSampleAdjustView->move( 1, 1 );
277
278        m_pTargetSampleView = new TargetWaveDisplay( targetSampleView );
279//      m_pTargetSampleView->updateDisplay( pLayer );
280        m_pTargetSampleView->move( 1, 1 );
281
282        QApplication::restoreOverrideCursor();
283
284}
285
286
287
288void SampleEditor::on_ClosePushButton_clicked()
289{
290        if ( !m_pSampleEditorStatus ){
291                int err = QMessageBox::information( this, "Hydrogen", tr( "Unsaved changes left. This changes will be lost. \nAre you sure?"), tr("&Ok"), tr("&Cancel"), 0, 1 );
292                if ( err == 0 ){
293                        m_pSampleEditorStatus = true;
294                        HydrogenApp::getInstance()->closeSampleEditor();       
295                }else
296                {
297                        return;
298                }
299        }else
300        {
301                HydrogenApp::getInstance()->closeSampleEditor();
302//              accept();
303        }
304}
305
306
307
308void SampleEditor::on_PrevChangesPushButton_clicked()
309{
310        getAllLocalFrameInfos();       
311        createNewLayer();
312        m_pSampleEditorStatus = true;
313       
314}
315
316
317
318bool SampleEditor::getCloseQuestion()
319{
320        bool close = false;
321        int err = QMessageBox::information( this, "Hydrogen", tr( "Close dialog! maybe there is some unsaved work on sample.\nAre you sure?"), tr("&Ok"), tr("&Cancel"), 0, 1 );
322        if ( err == 0 ) close = true;
323       
324        return close;
325}
326
327
328
329void SampleEditor::createNewLayer()
330{
331
332        if ( !m_pSampleEditorStatus ){
333
334                Sample *editSample = Sample::load_edit_wave( m_samplename,
335                                                            m_start_frame,
336                                                            m_loop_frame,
337                                                            m_end_frame,
338                                                            m_repeats,
339                                                            m_sample_mode);
340
341                AudioEngine::get_instance()->lock( "SampeEditor::insert new sample" );
342
343                H2Core::Instrument *m_pInstrument = NULL;
344                Song *pSong = Hydrogen::get_instance()->getSong();
345                if (pSong != NULL) {
346                        InstrumentList *pInstrList = pSong->get_instrument_list();
347                        int nInstr = Hydrogen::get_instance()->getSelectedInstrumentNumber();
348                        if ( nInstr >= static_cast<int>(pInstrList->get_size()) ) {
349                                nInstr = -1;
350                        }
351       
352                        if (nInstr == -1) {
353                                m_pInstrument = NULL;
354                        }
355                        else {
356                                m_pInstrument = pInstrList->get( nInstr );
357                                //INFOLOG( "new instr: " + m_pInstrument->m_sName );
358                        }
359                }
360       
361                H2Core::InstrumentLayer *pLayer = m_pInstrument->get_layer( m_pSelectedLayer );
362
363                Sample *oldSample = pLayer->get_sample();
364                delete oldSample;
365       
366                // insert new sample from newInstrument
367                pLayer->set_sample( editSample );
368
369                AudioEngine::get_instance()->unlock();
370                m_pTargetSampleView->updateDisplay( pLayer );
371                }
372               
373}
374
375
376
377void SampleEditor::mouseReleaseEvent(QMouseEvent *ev)
378{
379
380}
381
382
383
384void SampleEditor::returnAllMainWaveDisplayValues()
385{
386        testpTimer();
387//      QMessageBox::information ( this, "Hydrogen", trUtf8 ( "jep %1" ).arg(m_pSample->get_n_frames()));
388        m_sample_is_modified = true;
389        m_start_frame = m_pMainSampleWaveDisplay->m_pStartFramePosition * m_divider - 25 * m_divider;
390        m_loop_frame = m_pMainSampleWaveDisplay->m_pLoopFramePosition  * m_divider - 25 * m_divider;
391        m_end_frame = m_pMainSampleWaveDisplay->m_pEndFramePosition  * m_divider - 25 * m_divider ;
392
393        StartFrameSpinBox->setValue( m_start_frame );
394        LoopFrameSpinBox->setValue( m_loop_frame );
395        EndFrameSpinBox->setValue( m_end_frame );
396        m_ponewayStart = true; 
397        m_ponewayLoop = true;
398        m_ponewayEnd = true;
399        setSamplelengthFrames();
400}
401
402
403void SampleEditor::returnAllTargetDisplayValues()
404{
405        setSamplelengthFrames();
406        m_sample_is_modified = true;
407
408}
409
410
411
412void SampleEditor::setTrue()
413{
414        m_pSampleEditorStatus = false;
415}
416
417
418
419void SampleEditor::valueChangedStartFrameSpinBox( int )
420{
421        testpTimer();
422        m_pdetailframe = StartFrameSpinBox->value();
423        m_plineColor = "Start";
424        if ( !m_ponewayStart ){
425                m_pMainSampleWaveDisplay->m_pStartFramePosition = StartFrameSpinBox->value() / m_divider + 25 ;
426                m_pMainSampleWaveDisplay->updateDisplayPointer();
427                m_pSampleAdjustView->setDetailSamplePosition( m_pdetailframe, m_pzoomfactor , m_plineColor);
428                m_start_frame = StartFrameSpinBox->value();
429//              m_pMainSampleWaveDisplay->testPositionFromSampleeditor();
430                               
431        }else
432        {
433                m_pSampleAdjustView->setDetailSamplePosition( m_pdetailframe, m_pzoomfactor , m_plineColor);
434                m_ponewayStart = false;
435        }
436        testPositionsSpinBoxes();
437        m_pSampleEditorStatus = false;
438        //QMessageBox::information ( this, "Hydrogen", trUtf8 ( "jep %1" ).arg(StartFrameSpinBox->value() / m_divider + 25 ));
439        setSamplelengthFrames();
440}
441
442
443
444void SampleEditor::valueChangedLoopFrameSpinBox( int )
445{
446        testpTimer();   
447        m_pdetailframe = LoopFrameSpinBox->value();
448        m_plineColor = "Loop";
449        if ( !m_ponewayLoop ){
450                m_pMainSampleWaveDisplay->m_pLoopFramePosition = LoopFrameSpinBox->value() / m_divider + 25 ;
451                m_pMainSampleWaveDisplay->updateDisplayPointer();
452                m_pSampleAdjustView->setDetailSamplePosition( m_pdetailframe, m_pzoomfactor , m_plineColor);
453                m_loop_frame = LoopFrameSpinBox->value();
454        }else
455        {
456                m_pSampleAdjustView->setDetailSamplePosition( m_pdetailframe, m_pzoomfactor , m_plineColor);
457                m_ponewayLoop = false;
458        }
459        testPositionsSpinBoxes();
460        m_pSampleEditorStatus = false;
461        setSamplelengthFrames();
462}
463
464
465
466void SampleEditor::valueChangedEndFrameSpinBox( int )
467{
468        testpTimer();
469        m_pdetailframe = EndFrameSpinBox->value();
470        m_plineColor = "End";
471        if ( !m_ponewayEnd ){
472                m_pMainSampleWaveDisplay->m_pEndFramePosition = EndFrameSpinBox->value() / m_divider + 25 ;
473                m_pMainSampleWaveDisplay->updateDisplayPointer();
474                m_pSampleAdjustView->setDetailSamplePosition( m_pdetailframe, m_pzoomfactor , m_plineColor);
475                m_end_frame = EndFrameSpinBox->value();
476        }else
477        {
478                m_ponewayEnd = false;
479                m_pSampleAdjustView->setDetailSamplePosition( m_pdetailframe, m_pzoomfactor , m_plineColor);
480        }
481        testPositionsSpinBoxes();
482        m_pSampleEditorStatus = false;
483        setSamplelengthFrames();
484}
485
486
487
488void SampleEditor::on_PlayPushButton_clicked()
489{
490
491        const int selectedlayer = InstrumentEditorPanel::getInstance()->getselectedLayer();
492        const float pan_L = 0.5f;
493        const float pan_R = 0.5f;
494        const int nLength = -1;
495        const float fPitch = 0.0f;
496        Song *pSong = Hydrogen::get_instance()->getSong();
497       
498        Instrument *pInstr = pSong->get_instrument_list()->get( Hydrogen::get_instance()->getSelectedInstrumentNumber() );
499       
500        Note *pNote = new Note( pInstr, 0, pInstr->get_layer( selectedlayer )->get_end_velocity() - 0.01, pan_L, pan_R, nLength, fPitch);
501        AudioEngine::get_instance()->get_sampler()->note_on(pNote);
502
503        setSamplelengthFrames();
504        createPositionsRulerPath();
505        m_pPlayButton = true;
506        m_pMainSampleWaveDisplay->paintLocatorEvent( StartFrameSpinBox->value() / m_divider + 24 , true);
507        m_pSampleAdjustView->setDetailSamplePosition( m_start_frame, m_pzoomfactor , 0);
508        m_pTimer->start(40);    // update ruler at 25 fps       
509        m_prealtimeframeend = Hydrogen::get_instance()->getRealtimeFrames() + m_pslframes;
510       
511}
512
513
514
515void SampleEditor::on_PlayOrigPushButton_clicked()
516{
517        Sample *pNewSample = Sample::load( m_samplename );
518        if ( pNewSample ){
519                int length = ( ( pNewSample->get_n_frames() / pNewSample->get_sample_rate() + 1) * 100 );
520                AudioEngine::get_instance()->get_sampler()->preview_sample( pNewSample, length );
521        }
522
523        m_pslframes = pNewSample->get_n_frames();
524        m_pMainSampleWaveDisplay->paintLocatorEvent( StartFrameSpinBox->value() / m_divider + 24 , true);
525        m_pSampleAdjustView->setDetailSamplePosition( m_start_frame, m_pzoomfactor , 0);
526        m_pTimer->start(40);    // update ruler at 25 fps       
527        m_prealtimeframeend = Hydrogen::get_instance()->getRealtimeFrames() + m_pslframes;
528}
529
530
531
532void SampleEditor::updateMainsamplePostionRuler()
533{
534        unsigned long realpos = Hydrogen::get_instance()->getRealtimeFrames();
535        if ( realpos < m_prealtimeframeend ){
536                unsigned frame = m_pslframes - ( m_prealtimeframeend  - realpos );
537                if ( m_pPlayButton == true ){
538                        m_pMainSampleWaveDisplay->paintLocatorEvent( m_pPositionsRulerPath[frame] / m_divider + 25 , true);
539                        m_pSampleAdjustView->setDetailSamplePosition( m_pPositionsRulerPath[frame], m_pzoomfactor , 0);
540                }else{
541                        m_pMainSampleWaveDisplay->paintLocatorEvent( frame / m_divider + 25 , true);
542                        m_pSampleAdjustView->setDetailSamplePosition( frame, m_pzoomfactor , 0);
543                }
544//              ERRORLOG( QString("sampleval: %1").arg(frame) );
545        }else
546        {
547                m_pMainSampleWaveDisplay->paintLocatorEvent( -1 , false);
548                m_pTimer->stop();
549                m_pPlayButton = false;
550        }
551}
552
553
554
555void SampleEditor::createPositionsRulerPath()
556{
557        setSamplelengthFrames();
558
559        unsigned onesamplelength =  m_end_frame - m_start_frame;
560        unsigned looplength =  m_end_frame - m_loop_frame;
561        unsigned repeatslength = looplength * m_repeats;
562        unsigned newlength = 0;
563        if (onesamplelength == looplength){     
564                newlength = onesamplelength + onesamplelength * m_repeats ;
565        }else
566        {
567                newlength =onesamplelength + repeatslength;
568        }
569
570        unsigned  normallength = m_pSamplefromFile->get_n_frames();
571
572        unsigned *normalframes = new unsigned[ normallength ];
573
574
575        for ( unsigned i = 0; i < normallength; i++ ) {
576                normalframes[i] = i;
577        }
578
579        unsigned *tempframes = new unsigned[ newlength ];
580        unsigned *loopframes = new unsigned[ looplength ];
581
582        QString loopmode = m_sample_mode;
583        long int z = m_loop_frame;
584        long int y = m_start_frame;
585
586        for ( unsigned i = 0; i < newlength; i++){ //first vector
587                tempframes[i] = 0;
588        }
589
590        for ( unsigned i = 0; i < onesamplelength; i++, y++){ //first vector
591
592                tempframes[i] = normalframes[y];
593        }
594
595        for ( unsigned i = 0; i < looplength; i++, z++){ //loop vector
596
597                loopframes[i] = normalframes[z];
598        }
599       
600        if ( loopmode == "reverse" ){
601                reverse(loopframes, loopframes + looplength);
602        }
603
604        if ( loopmode == "reverse" && m_repeats > 0 && m_start_frame == m_loop_frame ){
605                reverse( tempframes, tempframes + onesamplelength );           
606                }
607
608        if ( loopmode == "pingpong" &&  m_start_frame == m_loop_frame){
609                reverse(loopframes, loopframes + looplength);
610        }
611       
612        for ( int i = 0; i< m_repeats ;i++){                   
613                unsigned tempdataend = onesamplelength + ( looplength * i );
614                copy( loopframes, loopframes+looplength ,tempframes+ tempdataend );
615                if ( loopmode == "pingpong" && m_repeats > 1){
616                        reverse(loopframes, loopframes + looplength);
617                }
618
619        }
620
621       
622        if ( m_repeats == 0 && loopmode == "reverse" ){
623                reverse( tempframes + m_loop_frame, tempframes + newlength);           
624                }
625
626        m_pPositionsRulerPath = tempframes;
627}
628
629
630
631void SampleEditor::setSamplelengthFrames()
632{
633        getAllLocalFrameInfos();
634//      getAllFrameInfos();
635
636        //create new  sample length
637        unsigned onesamplelength =  m_end_frame - m_start_frame;
638        unsigned looplength =  m_end_frame - m_loop_frame ;
639        unsigned repeatslength = looplength * m_repeats;
640        unsigned newlength = 0;
641        if (onesamplelength == looplength){     
642                newlength = onesamplelength + onesamplelength * m_repeats ;
643        }else
644        {
645                newlength =onesamplelength + repeatslength;
646        }
647        m_pslframes = newlength;
648        newlengthLabel->setText(QString("new sample length: %1 frames").arg(newlength));
649}
650
651
652
653void SampleEditor::valueChangedLoopCountSpinBox( int )
654{
655        testpTimer();
656        if ( m_pslframes > Hydrogen::get_instance()->getAudioOutput()->getSampleRate() * 60 ){
657                AudioEngine::get_instance()->get_sampler()->stop_playing_notes();
658                m_pMainSampleWaveDisplay->paintLocatorEvent( -1 , false);
659                m_pTimer->stop();
660                m_pPlayButton = false;
661        }
662        m_repeats = LoopCountSpinBox->value() ;
663        m_pSampleEditorStatus = false;
664        setSamplelengthFrames();
665        if ( m_pslframes > Hydrogen::get_instance()->getAudioOutput()->getSampleRate() * 60 * 30){ // >30 min
666                LoopCountSpinBox->setMaximum(LoopCountSpinBox->value() -1);     
667        }
668       
669}
670
671
672
673void SampleEditor::valueChangedProcessingTypeComboBox( const QString unused )
674{
675        switch ( ProcessingTypeComboBox->currentIndex() ){
676                case 0 ://
677                        m_sample_mode = "forward";
678                        break;
679                case 1 ://
680                        m_sample_mode = "reverse";
681                        break;
682                case 2 ://
683                        m_sample_mode = "pingpong";
684                        break;
685                default:
686                        m_sample_mode = "forward";
687        }
688        m_pSampleEditorStatus = false;
689}
690
691
692
693void SampleEditor::on_verticalzoomSlider_valueChanged( int value )
694{
695        m_pzoomfactor = value / 10 +1;
696        m_pSampleAdjustView->setDetailSamplePosition( m_pdetailframe, m_pzoomfactor, m_plineColor );
697}
698
699
700
701void SampleEditor::testPositionsSpinBoxes()
702{
703        if (  m_start_frame > m_loop_frame ) m_loop_frame = m_start_frame;
704        if (  m_start_frame > m_end_frame ) m_end_frame = m_start_frame;
705        if (  m_loop_frame > m_end_frame ) m_end_frame = m_loop_frame;
706        if (  m_end_frame < m_loop_frame ) m_loop_frame = m_end_frame;
707        if (  m_end_frame < m_start_frame ) m_start_frame = m_end_frame;
708        StartFrameSpinBox->setValue( m_start_frame );
709        LoopFrameSpinBox->setValue( m_loop_frame );
710        EndFrameSpinBox->setValue( m_end_frame );
711}
712
713
714
715void SampleEditor::testpTimer()
716{
717        if ( m_pTimer->isActive() ){
718                m_pMainSampleWaveDisplay->paintLocatorEvent( -1 , false);
719                m_pTimer->stop();
720                AudioEngine::get_instance()->get_sampler()->stop_playing_notes();
721                m_pPlayButton = false;
722        }
723}
Note: See TracBrowser for help on using the browser.