Changeset 1286

Show
Ignore:
Timestamp:
10/16/07 02:45:58 (11 months ago)
Author:
calvin
Message:

pattern editor redraw when recording notes and column changes, factored sample editor tick markers and labeling, wavetable status bar also shows wave selection in current unit mode

Location:
trunk/src/buzelib
Files:
5 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/buzelib/PatternView.cpp

    r1285 r1286  
    221221        mainFrame->addTimerHandler(this); 
    222222 
     223        machine->addEventHandler(this); 
    223224        return 0; 
    224225} 
     
    232233 
    233234LRESULT CPatternView::OnClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) { 
     235        machine->removeEventHandler(this); 
     236 
    234237        setPattern(0,0); // in case pattern is deleted and window updated before window is fully destroyed 
     238 
    235239 
    236240        CMessageLoop* pLoop = _Module.GetMessageLoop(); 
     
    18211825        return 0; 
    18221826} 
     1827 
     1828bool CPatternView::invoke(zzub_event_data_t& data) { 
     1829        if (!pattern) return false; 
     1830        if (data.type == zzub::event_type_parameter_changed && document->player->recordParameters) { 
     1831                // TODO: restrict updating to around currently playing row(s) only 
     1832                for (int i = 0; i < pattern->getRows(); i++) { 
     1833                        zzub::patterntrack* track = pattern->getPatternTrack(data.change_parameter.group, data.change_parameter.track); 
     1834                        patternEditor.SetValue(data.change_parameter.group, data.change_parameter.track, data.change_parameter.param, i, track->getValue(i, data.change_parameter.param)); 
     1835                } 
     1836                return true; 
     1837        } 
     1838        return false; 
     1839} 
  • trunk/src/buzelib/PatternView.h

    r1281 r1286  
    5151        , public CMessageFilter 
    5252        , public CTimerHandler 
     53        , zzub::event_handler 
    5354{ 
    5455        friend class CPatternEditor; 
     
    318319    void OnUpdate(CView* pSender, LPARAM lHint, LPVOID pHint); 
    319320        virtual void updateTimer(); 
     321        bool invoke(zzub_event_data_t& data); 
    320322 
    321323    void bindPatternEditor(); 
  • trunk/src/buzelib/WaveEditorCtrl.cpp

    r1285 r1286  
    187187        dc.Draw3dRect(&tlrc, GetSysColor(COLOR_BTNHIGHLIGHT), GetSysColor(COLOR_BTNSHADOW));//0, height, width, height+20); 
    188188 
    189         float unit, firstTickValue; 
    190         float num_samples = wave->get_sample_count(currentLevel); 
    191         float samplesPerWord = num_samples / 65536; 
    192  
    193         switch (gridType) { 
    194                 case WaveEditorSamples: 
    195                         unit=getDisplaySamplesPerPixel(); 
    196                         firstTickValue=beginDisplaySample; 
    197                         break; 
    198                 case WaveEditorTicks: 
    199                         unit=getDisplaySamplesPerTick(); 
    200                         firstTickValue=(float)beginDisplaySample / view->mainFrame->player->masterInfo.samples_per_tick; 
    201                         break; 
    202                 case WaveEditorSeconds: 
    203                         unit=getDisplaySamplesPerSec(); 
    204                         firstTickValue=(float)beginDisplaySample / getWave()->get_samples_per_sec(getWaveLevel()); 
    205                         break; 
    206                 case WaveEditorWord:                                     
    207                         unit=getDisplaySamplesPerWord();         
    208                         firstTickValue=beginDisplaySample / samplesPerWord; 
    209                         break; 
    210                 default: 
    211                         return 0; 
    212         } 
    213          
     189        float samplesPerUnit = getSamplesPerUnit(gridType); 
     190        float unit = getDisplaySamplesPerUnit(samplesPerUnit); 
     191        float firstTickValue = beginDisplaySample / samplesPerUnit; 
    214192 
    215193        // assume min 30px per major tick 
    216         float majorScale=unit*30.0f; 
     194        float majorScale = unit*30.0f; 
    217195         
    218196        // round majorunit up to nearest 10, 100, 1000, 10000 etc if scale is in samples, or 1,2,4,8,16,etc for ticks or, ms,sec,min for time 
    219         if (majorScale<10) 
    220                 majorScale=ceil(majorScale); else 
    221         if (majorScale<100) 
    222                 majorScale=ceil(majorScale/10)*10; else 
    223         if (majorScale<1000) 
    224                 majorScale=ceil(majorScale/100)*100; else 
    225         if (majorScale<10000) 
    226                 majorScale=ceil(majorScale/1000)*1000; else 
    227         if (majorScale<100000) 
    228                 majorScale=ceil(majorScale/10000)*10000; else 
    229                 majorScale=ceil(majorScale/100000)*100000; 
    230  
    231         float roundAdjust=fmod(firstTickValue, majorScale); 
    232  
    233         float firstTick=firstTickValue - roundAdjust; 
    234  
    235         float tickX=-roundAdjust/unit; 
     197        if (majorScale < 10) 
     198                majorScale = ceil(majorScale); else 
     199        if (majorScale < 100) 
     200                majorScale = ceil(majorScale/10)*10; else 
     201        if (majorScale < 1000) 
     202                majorScale = ceil(majorScale/100)*100; else 
     203        if (majorScale < 10000) 
     204                majorScale = ceil(majorScale/1000)*1000; else 
     205        if (majorScale < 100000) 
     206                majorScale = ceil(majorScale/10000)*10000; else 
     207                majorScale = ceil(majorScale/100000)*100000; 
     208 
     209        float roundAdjust = fmod(firstTickValue, majorScale); 
     210 
     211        float firstTick = firstTickValue - roundAdjust; 
     212 
     213        float tickX = -roundAdjust/unit; 
    236214        CPen tickPen; 
    237215        tickPen.CreatePen(PS_SOLID, 1, (COLORREF)0x0); 
     
    242220 
    243221        dc.SelectFont(tickFont); 
    244         int prevBkMode=dc.SetBkMode(TRANSPARENT); 
    245         while (tickX<width) { 
     222        int prevBkMode = dc.SetBkMode(TRANSPARENT); 
     223        while (tickX < width) { 
    246224                dc.MoveTo(tickX, fullHeight+2); 
    247225                dc.LineTo(tickX, fullHeight+8); 
    248226 
    249                 char pc[16]; 
    250  
    251                 if (gridType==WaveEditorWord) 
    252                         sprintf(pc, "%04X", (int)firstTick); else  
    253                         sprintf(pc, "%i", (int)firstTick); 
    254  
    255                 dc.TextOut(tickX, fullHeight+8, pc, strlen(pc)); 
    256                 tickX+=majorScale/unit; 
    257                 firstTick+=majorScale; 
     227                std::string marker_str = formatSampleUnit(firstTick, gridType); 
     228                dc.TextOut(tickX, fullHeight+8, marker_str.c_str(), marker_str.length()); 
     229                tickX += majorScale / unit; 
     230                firstTick += majorScale; 
    258231        } 
    259232 
     
    284257 
    285258        return DefWindowProc(); 
     259} 
     260 
     261std::string CWaveEditorCtrl::formatSampleUnit(float units, WaveEditorGridMode mode) { 
     262        std::stringstream marker_strm; 
     263        if (mode == WaveEditorWord) 
     264                marker_strm << std::uppercase << std::setw(4) << std::hex << (unsigned int)units; else 
     265        if (mode == WaveEditorSeconds) 
     266                marker_strm << std::setprecision(2) << std::fixed << units / 1000.0f; else 
     267                marker_strm << (unsigned int)units; 
     268        return marker_strm.str(); 
    286269} 
    287270 
     
    458441 
    459442LRESULT CWaveEditorCtrl::OnKeyDown( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { 
    460 /*      switch (wParam) { 
    461                 case 'S': 
    462                 if (view->isShiftDown()) { 
    463                                 zoomShowSelection(); 
    464                         } 
    465                         break; 
    466                 case 'A': 
    467                 if (view->isShiftDown()) { 
    468                                 zoomShowAll(); 
    469                         } 
    470                         break; 
    471                 case VK_DOWN: 
    472                         if (view->isShiftDown()) { 
    473                                 zoomOut(); 
    474                         } 
    475                         break; 
    476                 case VK_UP: 
    477                         if (view->isShiftDown()) { 
    478                                 zoomIn(); 
    479                         } 
    480                         break; 
    481                 case VK_RIGHT: 
    482                         MessageBox("scroll right"); 
    483                         if (view->isShiftDown()) { 
    484                                 MessageBox("move selection"); 
    485                         } 
    486                         break; 
    487                 case VK_LEFT: 
    488                         MessageBox("scroll left"); 
    489                         if (view->isShiftDown()) { 
    490                                 MessageBox("move selection"); 
    491                         } 
    492                         break; 
    493                 default: 
    494                         //MessageBox("WaveEditorCtrl keydown"); 
    495                         break; 
    496         } 
    497 */ 
    498443        return 0; 
    499444} 
     
    521466} 
    522467 
    523 float CWaveEditorCtrl::getDisplaySamplesPerPixel() { 
    524         // returns number of samples in a pixel 
     468float CWaveEditorCtrl::getSamplesPerUnit(WaveEditorGridMode mode) { 
     469        if (mode == WaveEditorSamples) { 
     470                return 1.0f; 
     471        } else 
     472        if (mode == WaveEditorTicks) { 
     473                return view->mainFrame->player->masterInfo.samples_per_tick; 
     474        } else 
     475        if (mode == WaveEditorSeconds) { 
     476                wave_info_ex* wave = getWave(); 
     477                if (wave == 0) return 0.0f; 
     478                return (float)wave->get_samples_per_sec(currentLevel) / 1000.0f; 
     479        } else 
     480        if (mode == WaveEditorWord) { 
     481                wave_info_ex* wave = getWave(); 
     482                if (wave == 0) return 0.0f; 
     483                float num_samples = wave->get_sample_count(currentLevel); 
     484                return num_samples / 65536; 
     485        } 
     486         
     487        return 1.0f; 
     488} 
     489 
     490float CWaveEditorCtrl::getDisplaySamplesPerUnit(float samplesPerUnit) { 
    525491        RECT rc; 
    526492        GetClientRect(&rc); 
    527         float unit= (float)(endDisplaySample-beginDisplaySample) / rc.right; 
    528         return unit; 
    529 } 
    530  
    531 float CWaveEditorCtrl::getDisplaySamplesPerTick() { 
    532         // returns number of samples in a pixel 
    533         RECT rc; 
    534         GetClientRect(&rc); 
    535         float samplesPerTick=view->mainFrame->player->masterInfo.samples_per_tick_frac+view->mainFrame->player->masterInfo.samples_per_tick; 
    536         float unit= (float)(endDisplaySample-beginDisplaySample) / samplesPerTick / rc.right; 
    537         return unit; 
    538 } 
    539  
    540 float CWaveEditorCtrl::getDisplaySamplesPerSec() { 
    541         // returns number of samples in a pixel 
    542         RECT rc; 
    543         GetClientRect(&rc); 
    544         float unit= (float)(endDisplaySample-beginDisplaySample) / getWave()->get_samples_per_sec(getWaveLevel()) / rc.right; 
    545         return unit; 
    546 } 
    547  
    548 float CWaveEditorCtrl::getDisplaySamplesPerWord(){ 
    549         // returns number of samples per "hexcent" 
    550         RECT rc; 
    551         GetClientRect(&rc); 
    552   
    553         wave_info_ex* waveInfo=getWave(); 
    554         if (waveInfo==0) return 0; 
    555   
    556         float num_samples = waveInfo->get_sample_count(currentLevel); 
    557         float samplesPerWord = num_samples / 65536; 
    558   
    559         float unit= (float)(endDisplaySample-beginDisplaySample) / samplesPerWord / rc.right; 
    560         return unit; 
    561 } 
    562  
     493        return (float)(endDisplaySample-beginDisplaySample) / samplesPerUnit / rc.right; 
     494} 
    563495 
    564496LRESULT CWaveEditorCtrl::OnHScroll(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) { 
     
    566498        WORD req=LOWORD(wParam); 
    567499        // how many samples are 1 pixel? 
    568         float unit=getDisplaySamplesPerPixel(); 
     500        float unit = getDisplaySamplesPerUnit(1); 
     501 
     502        //float unit = getDisplaySamplesPerPixel(); 
    569503        if (unit<1.0f) unit=1.0f; 
    570504 
  • trunk/src/buzelib/WaveEditorCtrl.h

    r1285 r1286  
    107107        int getWaveLevel(); 
    108108 
    109         float getDisplaySamplesPerPixel(); 
    110         float getDisplaySamplesPerTick(); 
    111         float getDisplaySamplesPerSec(); 
    112         float getDisplaySamplesPerWord(); 
     109        float getSamplesPerUnit(WaveEditorGridMode mode); 
     110        float getDisplaySamplesPerUnit(float samplesPerUnit); 
     111        std::string formatSampleUnit(float units, WaveEditorGridMode mode); 
    113112 
    114113        void zoomShowSelection(); 
  • trunk/src/buzelib/WaveTableView.cpp

    r1285 r1286  
    1212#include "Utils/Keymaps.h" 
    1313 
     14#ifdef min 
     15        #undef min 
     16#endif 
     17 
     18#ifdef max 
     19        #undef max 
     20#endif 
     21 
     22 
    1423using namespace std; 
    1524using namespace zzub; 
     
    92101        waveMachineDropDown.InsertString(-1, "<select machine>"); 
    93102        for (size_t i=0; i<view->mainFrame->player->getMachines(); i++) { 
    94                 metaplugin* machine=view->mainFrame->player->getMachine(i); 
    95                 if (!machine->loader) continue; 
    96  
    97                 const zzub::info* info=machine->loader->plugin_info; 
    98  
    99                 if (info->flags&plugin_flag_plays_waves) { 
    100                         waveMachineDropDown.InsertString(-1, machine->getName().c_str()); 
    101                 } 
     103                metaplugin* machine = view->mainFrame->player->getMachine(i); 
     104                if (machine->nonSongPlugin) continue; 
     105                if ((machine->loader->plugin_info->flags&plugin_flag_plays_waves) == 0) continue; 
     106 
     107                waveMachineDropDown.InsertString(-1, machine->getName().c_str()); 
    102108        } 
    103109        waveMachineDropDown.SetCurSel(0); 
     
    336342                SendMessage(hWndEditToolBar, TB_PRESSBUTTON, ID_WAVE_ZOOM_WORD, TRUE); 
    337343                        break; 
    338  
    339344        } 
    340345} 
     
    617622        int waveIndex = waveEditorCtrl.getWaveIndex(); 
    618623        waveEditorCtrl.setEditWave(waveIndex, level); 
     624        bindStatus(); 
    619625 
    620626        return 0; 
     
    625631        waveEditorCtrl.endSelectSample=waveEditorCtrl.getWave()->get_sample_count(waveEditorCtrl.getWaveLevel())-1; 
    626632        waveEditorCtrl.Invalidate(); 
     633        bindStatus(); 
    627634 
    628635        return 0; 
     
    653660        updateToolbar(); 
    654661        waveEditorCtrl.Invalidate(FALSE); 
     662        bindStatus(); 
    655663        return 0; 
    656664} 
     
    660668        updateToolbar(); 
    661669        waveEditorCtrl.Invalidate(FALSE); 
     670        bindStatus(); 
    662671        return 0; 
    663672} 
     
    667676        updateToolbar(); 
    668677        waveEditorCtrl.Invalidate(FALSE); 
    669         return 0; 
    670 } 
    671  
    672 // test 014 
     678        bindStatus(); 
     679        return 0; 
     680} 
     681 
    673682LRESULT CWaveTableView::OnZoomWord(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& bHandled) { 
    674683        waveEditorCtrl.gridType=WaveEditorWord; 
    675684        updateToolbar(); 
    676685        waveEditorCtrl.Invalidate(FALSE); 
    677         return 0; 
    678 } 
    679  
    680  
     686        bindStatus(); 
     687        return 0; 
     688} 
    681689 
    682690LRESULT CWaveTableView::OnZoomIn(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& bHandled) { 
     
    713721                case UpdateSelectedWave: 
    714722                        updateFromWaveTable(); 
     723                        bindStatus(); 
    715724                        break; 
    716725                case UpdateSelectedWaveEntry: 
    717726                        bindWaveLevels(); 
    718727                        waveEditorCtrl.Invalidate(FALSE); 
     728                        bindStatus(); 
    719729                        break; 
    720730                case UpdateMachines: 
     
    743753void CWaveTableView::bindStatus() {                      
    744754         
    745         wave_info_ex* test=waveEditorCtrl.getWave(); //test = currently selected wave entry 
    746         if (test==0) return; 
    747  
    748         float num_samples = waveEditorCtrl.getWave()->get_sample_count(waveEditorCtrl.getWaveLevel()); 
    749         long hexfrompixel = ((waveEditorCtrl.currentCursorSamplePosition/num_samples)*65536); 
    750          
    751         std::stringstream valueStrm;    //current mode 
    752          
    753         if (waveEditorCtrl.gridType==WaveEditorSamples) 
    754                 valueStrm << "Samples";         else 
    755         if (waveEditorCtrl.gridType==WaveEditorTicks) 
    756                 valueStrm << "Ticks";           else 
    757         if (waveEditorCtrl.gridType==WaveEditorSeconds) 
    758                 valueStrm << "Seconds";         else 
    759         if (waveEditorCtrl.gridType==WaveEditorWord) 
    760                 valueStrm << std::hex << hexfrompixel; 
    761  
    762  
    763  
    764         statusBar.SetText(1, valueStrm.str().c_str()); 
    765 } 
     755        wave_info_ex* wave = waveEditorCtrl.getWave(); //test = currently selected wave entry 
     756 
     757        float num_samples = 0; 
     758         
     759        if (wave != 0) 
     760                num_samples = wave->get_sample_count(waveEditorCtrl.getWaveLevel()); 
     761 
     762        WaveEditorGridMode gridType = waveEditorCtrl.gridType; 
     763        float samples_per_unit = waveEditorCtrl.getSamplesPerUnit(gridType); 
     764 
     765        std::stringstream pos_strm; 
     766        std::stringstream select_strm; 
     767         
     768        std::string unit_name; 
     769        switch (gridType) { 
     770                case WaveEditorSamples: 
     771                        unit_name = "samples"; 
     772                        break; 
     773                case WaveEditorSeconds: 
     774                        unit_name = "sec"; 
     775                        break; 
     776                case WaveEditorTicks: 
     777                        unit_name = "ticks"; 
     778                        break; 
     779                case WaveEditorWord: 
     780                        unit_name = "hex"; 
     781                        break; 
     782                default: 
     783                        unit_name = "??"; 
     784                        break; 
     785        } 
     786 
     787        if (waveEditorCtrl.beginSelectSample != -1) { 
     788                float min_select = std::min(waveEditorCtrl.beginSelectSample, waveEditorCtrl.endSelectSample); 
     789                float max_select = std::max(waveEditorCtrl.beginSelectSample, waveEditorCtrl.endSelectSample); 
     790 
     791                float select_start_unit = min_select / samples_per_unit; 
     792                float select_end_unit = max_select / samples_per_unit; 
     793 
     794                std::stringstream selectStrm; 
     795                select_strm << "Select " << waveEditorCtrl.formatSampleUnit(select_start_unit, gridType) << " to " << waveEditorCtrl.formatSampleUnit(select_end_unit, gridType) << " (" << unit_name << ")"; 
     796        } 
     797         
     798        if (num_samples != 0) { 
     799                int sample_unit = (float)waveEditorCtrl.currentCursorSamplePosition / samples_per_unit; 
     800                std::string sample_unit_string = waveEditorCtrl.formatSampleUnit(sample_unit, gridType); 
     801 
     802                pos_strm << "Pos: " << sample_unit_string << " (" << unit_name << ")"; 
     803        } 
     804 
     805        statusBar.SetText(0, pos_strm.str().c_str()); 
     806        statusBar.SetText(1, select_strm.str().c_str()); 
     807}