Skip to content

Commit

Permalink
implement row marker (i.e. "bookmark") from 0.5.0 beta
Browse files Browse the repository at this point in the history
  • Loading branch information
HertzDevil committed Jun 6, 2016
1 parent 0577dda commit 25a50d9
Show file tree
Hide file tree
Showing 11 changed files with 118 additions and 16 deletions.
13 changes: 9 additions & 4 deletions 0CC-FamiTracker.rc
Expand Up @@ -273,16 +273,19 @@ BEGIN
MENUITEM "Play P&attern", ID_TRACKER_PLAYPATTERN
MENUITEM "Play &from Start", ID_TRACKER_PLAY_START
MENUITEM "Play from C&ursor", ID_TRACKER_PLAY_CURSOR
MENUITEM "Play from &Marker", ID_TRACKER_PLAY_MARKER
MENUITEM "&Stop", ID_TRACKER_STOP
MENUITEM SEPARATOR
MENUITEM "Toggle &Edit Mode", ID_TRACKER_EDIT
MENUITEM "Set Ro&w Marker", ID_TRACKER_SET_MARKER
MENUITEM SEPARATOR
MENUITEM "&Toggle Channel", ID_TRACKER_TOGGLECHANNEL
MENUITEM "So&lo Channel", ID_TRACKER_SOLOCHANNEL
MENUITEM "S&olo Channel", ID_TRACKER_SOLOCHANNEL
MENUITEM "To&ggle Chip", ID_TRACKER_TOGGLECHIP
MENUITEM "Solo &Chip", ID_TRACKER_SOLOCHIP
MENUITEM "So&lo Chip", ID_TRACKER_SOLOCHIP
MENUITEM SEPARATOR
MENUITEM "Switch to Track &Instrument", ID_TRACKER_SWITCHTOTRACKINSTRUMENT
MENUITEM "&Record to Instrument", ID_TRACKER_RECORDTOINST
MENUITEM "Switch To Track &Instrument", ID_TRACKER_SWITCHTOTRACKINSTRUMENT
MENUITEM "&Record To Instrument", ID_TRACKER_RECORDTOINST
MENUITEM "Re&corder Settings...", ID_TRACKER_RECORDERSETTINGS
MENUITEM SEPARATOR
MENUITEM "&Kill Sound\tF12", ID_TRACKER_KILLSOUND
Expand Down Expand Up @@ -2686,6 +2689,8 @@ BEGIN
ID_EDIT_SPLITKEYBOARD "Open the split keyboard settings dialog\nSplit Keyboard"
ID_VIEW_AVERAGEBPM "Display average BPM value instead of instant BPM value\nDisplay Average BPM"
ID_VIEW_CHANNELSTATE "Display information about active effects\nDisplay Channel State"
ID_TRACKER_PLAY_MARKER "Play pattern from row marker\nPlay from Marker"
ID_TRACKER_SET_MARKER "Set a row marker for playback\nSet Row Marker"
END

#endif // English (United States) resources
Expand Down
2 changes: 2 additions & 0 deletions Source/Accelerator.cpp
Expand Up @@ -51,10 +51,12 @@ const stAccelEntry CAccelerator::DEFAULT_TABLE[] = {
{_T("Play"), MOD_NONE, 0, ID_TRACKER_PLAY},
{_T("Play from start"), MOD_NONE, VK_F5, ID_TRACKER_PLAY_START},
{_T("Play from cursor"), MOD_NONE, VK_F7, ID_TRACKER_PLAY_CURSOR},
{_T("Play from row marker"), MOD_CONTROL, VK_F7, ID_TRACKER_PLAY_MARKER}, // // // 050B
{_T("Play and loop pattern"), MOD_NONE, VK_F6, ID_TRACKER_PLAYPATTERN},
{_T("Play row"), MOD_CONTROL, VK_RETURN, ID_TRACKER_PLAYROW},
{_T("Stop"), MOD_NONE, VK_F8, ID_TRACKER_STOP},
{_T("Edit enable/disable"), MOD_NONE, VK_SPACE, ID_TRACKER_EDIT},
{_T("Set row marker"), MOD_CONTROL, 'B', ID_TRACKER_SET_MARKER}, // // // 050B
{_T("Paste and mix"), MOD_CONTROL, 'M', ID_EDIT_PASTEMIX},
{_T("Paste and overwrite"), MOD_NONE, 0, ID_EDIT_PASTEOVERWRITE}, // // //
{_T("Paste and insert"), MOD_NONE, 0, ID_EDIT_PASTEINSERT}, // // //
Expand Down
31 changes: 31 additions & 0 deletions Source/FamiTrackerView.cpp
Expand Up @@ -276,6 +276,8 @@ CFamiTrackerView::CFamiTrackerView() :
m_iSwitchToInstrument(-1),
m_bFollowMode(true),
m_bCompactMode(false), // // //
m_iMarkerFrame(-1), // // // 050B
m_iMarkerRow(-1), // // // 050B
m_iAutoArpNotes(), // // //
m_iAutoArpPtr(0),
m_iLastAutoArpPtr(0),
Expand Down Expand Up @@ -1555,6 +1557,32 @@ void CFamiTrackerView::OnUpdateDisableWhilePlaying(CCmdUI *pCmdUI)
pCmdUI->Enable(!theApp.IsPlaying());
}

void CFamiTrackerView::SetMarker(int Frame, int Row) // // // 050B
{
m_iMarkerFrame = Frame;
m_iMarkerRow = Row;
m_pPatternEditor->InvalidatePatternData();
RedrawPatternEditor();
GetFrameEditor()->InvalidateFrameData();
RedrawFrameEditor();
}

bool CFamiTrackerView::IsMarkerValid() const // // //
{
if (m_iMarkerFrame < 0 || m_iMarkerRow < 0)
return false;

CFamiTrackerDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

const int Track = static_cast<CMainFrame*>(GetParentFrame())->GetSelectedTrack();
if (m_iMarkerFrame >= static_cast<int>(pDoc->GetFrameCount(Track)))
return false;
if (m_iMarkerRow >= m_pPatternEditor->GetCurrentPatternLength(m_iMarkerFrame))
return false;
return true;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Tracker playing routines
////////////////////////////////////////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -1780,6 +1808,9 @@ void CFamiTrackerView::OnBookmarksToggle()
pDoc->SetModifiedFlag();
pDoc->SetExceededFlag();
m_pPatternEditor->InvalidatePatternData();
RedrawPatternEditor();
GetFrameEditor()->InvalidateFrameData();
RedrawFrameEditor();
}

void CFamiTrackerView::OnBookmarksNext()
Expand Down
10 changes: 10 additions & 0 deletions Source/FamiTrackerView.h
Expand Up @@ -90,6 +90,12 @@ class CFamiTrackerView : public CView
unsigned int GetStepping() const { return m_iInsertKeyStepping; };
paste_pos_t GetPastePos() const { return m_iPastePos; }; // // //

// // // 050B
int GetMarkerFrame() const { return m_iMarkerFrame; } // // // 050B
int GetMarkerRow() const { return m_iMarkerRow; } // // // 050B
void SetMarker(int Frame, int Row); // // // 050B
bool IsMarkerValid() const; // // //

// Player callback (TODO move to new interface)
void PlayerTick();
bool PlayerGetNote(int Track, int Frame, int Channel, int Row, stChanNote &NoteData);
Expand Down Expand Up @@ -279,6 +285,10 @@ class CFamiTrackerView : public CView
bool m_bMuteChannels[MAX_CHANNELS]; // Muted channels
int m_iSwitchToInstrument;

// // // 050B
int m_iMarkerFrame;
int m_iMarkerRow;

// Auto arpeggio
char m_iAutoArpNotes[128];
int m_iAutoArpPtr;
Expand Down
4 changes: 4 additions & 0 deletions Source/FrameEditor.cpp
Expand Up @@ -306,6 +306,10 @@ void CFrameEditor::DrawFrameEditor(CDC *pDC)
GradientBar(&m_dcBack, RowRect, theApp.GetSettings()->Appearance.iColBackgroundHilite, ColBackground);
break;
}

// // // 050B row marker
if (Frame == pView->GetMarkerFrame())
GradientBar(&m_dcBack, DPI::Rect(2, i * ROW_HEIGHT + 4, ROW_COLUMN_WIDTH - 5, ROW_HEIGHT - 1), ColCursor, DIM(ColCursor, 30));

// Play cursor
if (PlayFrame == Frame && !pView->GetFollowMode() && theApp.IsPlaying()) {
Expand Down
39 changes: 34 additions & 5 deletions Source/MainFrm.cpp
Expand Up @@ -331,8 +331,10 @@ BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_COMMAND(ID_MODULE_GROOVE, OnModuleGrooveSettings)
ON_COMMAND(ID_MODULE_BOOKMARK, OnModuleBookmarkSettings)
ON_COMMAND(ID_MODULE_ESTIMATESONGLENGTH, OnModuleEstimateSongLength)
ON_COMMAND(ID_VIEW_AVERAGEBPM, OnTrackerDisplayAverageBPM)
ON_COMMAND(ID_VIEW_CHANNELSTATE, OnTrackerDisplayChannelState)
ON_COMMAND(ID_TRACKER_PLAY_MARKER, OnTrackerPlayMarker) // // // 050B
ON_COMMAND(ID_TRACKER_SET_MARKER, OnTrackerSetMarker) // // // 050B
ON_COMMAND(ID_VIEW_AVERAGEBPM, OnTrackerDisplayAverageBPM) // // // 050B
ON_COMMAND(ID_VIEW_CHANNELSTATE, OnTrackerDisplayChannelState) // // // 050B
ON_COMMAND(ID_TOGGLE_MULTIPLEXER, OnToggleMultiplexer)
ON_UPDATE_COMMAND_UI(IDC_FOLLOW_TOGGLE, OnUpdateToggleFollow)
ON_UPDATE_COMMAND_UI(IDC_COMPACT_TOGGLE, OnUpdateToggleCompact)
Expand All @@ -348,8 +350,9 @@ BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_UPDATE_COMMAND_UI(ID_EDIT_REVERSE, OnUpdateSelectionEnabled)
ON_UPDATE_COMMAND_UI(ID_EDIT_REPLACEINSTRUMENT, OnUpdateSelectionEnabled)
ON_UPDATE_COMMAND_UI(ID_EDIT_STRETCHPATTERNS, OnUpdateSelectionEnabled)
ON_UPDATE_COMMAND_UI(ID_VIEW_AVERAGEBPM, OnUpdateDisplayAverageBPM)
ON_UPDATE_COMMAND_UI(ID_VIEW_CHANNELSTATE, OnUpdateDisplayChannelState)
ON_UPDATE_COMMAND_UI(ID_TRACKER_PLAY_MARKER, OnUpdateTrackerPlayMarker) // // // 050B
ON_UPDATE_COMMAND_UI(ID_VIEW_AVERAGEBPM, OnUpdateDisplayAverageBPM) // // // 050B
ON_UPDATE_COMMAND_UI(ID_VIEW_CHANNELSTATE, OnUpdateDisplayChannelState) // // // 050B
ON_UPDATE_COMMAND_UI(ID_TRACKER_DISPLAYREGISTERSTATE, OnUpdateDisplayRegisterState)
ON_COMMAND(ID_KRAID1, OnEasterEggKraid1) // Easter Egg
ON_COMMAND(ID_KRAID2, OnEasterEggKraid2)
Expand Down Expand Up @@ -1438,6 +1441,30 @@ void CMainFrame::OnTrackerPlayCursor()
theApp.StartPlayer(MODE_PLAY_CURSOR);
}

void CMainFrame::OnTrackerPlayMarker() // // // 050B
{
// Play from row marker
if (static_cast<CFamiTrackerView*>(GetActiveView())->IsMarkerValid())
theApp.StartPlayer(MODE_PLAY_MARKER);
}

void CMainFrame::OnUpdateTrackerPlayMarker(CCmdUI *pCmdUI) // // // 050B
{
pCmdUI->Enable(static_cast<CFamiTrackerView*>(GetActiveView())->IsMarkerValid() ? TRUE : FALSE);
}

void CMainFrame::OnTrackerSetMarker() // // // 050B
{
auto pView = static_cast<CFamiTrackerView*>(GetActiveView());
int Frame = pView->GetSelectedFrame();
int Row = pView->GetSelectedRow();

if (Frame == pView->GetMarkerFrame() && Row == pView->GetMarkerRow())
pView->SetMarker(-1, -1);
else
pView->SetMarker(Frame, Row);
}

void CMainFrame::OnTrackerTogglePlay()
{
// Toggle playback
Expand Down Expand Up @@ -1607,7 +1634,9 @@ void CMainFrame::OnUpdateSBTempo(CCmdUI *pCmdUI)
int EngineSpeed = pDoc->GetEngineSpeed();
if (EngineSpeed == 0)
EngineSpeed = (pDoc->GetMachine() == NTSC) ? CAPU::FRAME_RATE_NTSC : CAPU::FRAME_RATE_PAL;
float BPM = std::min(pSoundGen->GetTempo(), static_cast<float>(EngineSpeed * 15));
float BPM = std::min(pSoundGen->IsPlaying() && theApp.GetSettings()->Display.bAverageBPM ?
pSoundGen->GetAverageBPM() : pSoundGen->GetTempo(),
static_cast<float>(EngineSpeed * 15)); // // // 050B

CString String;
String.Format(_T("%.2f BPM"), BPM * 4.f / Highlight);
Expand Down
11 changes: 7 additions & 4 deletions Source/MainFrm.h
Expand Up @@ -399,8 +399,10 @@ class CMainFrame : public CFrameWnd
afx_msg void OnModuleGrooveSettings();
afx_msg void OnModuleBookmarkSettings();
afx_msg void OnModuleEstimateSongLength();
afx_msg void OnTrackerDisplayAverageBPM();
afx_msg void OnTrackerDisplayChannelState();
afx_msg void OnTrackerPlayMarker(); // // // 050B
afx_msg void OnTrackerSetMarker(); // // // 050B
afx_msg void OnTrackerDisplayAverageBPM(); // // // 050B
afx_msg void OnTrackerDisplayChannelState(); // // // 050B
afx_msg void OnToggleMultiplexer();
afx_msg void OnUpdateEditCopySpecial(CCmdUI *pCmdUI);
afx_msg void OnUpdateSelectMultiFrame(CCmdUI *pCmdUI);
Expand All @@ -409,8 +411,9 @@ class CMainFrame : public CFrameWnd
afx_msg void OnUpdateToggleFixTempo(CCmdUI *pCmdUI);
afx_msg void OnUpdateGrooveEdit(CCmdUI *pCmdUI);
afx_msg void OnUpdateEditFindToggle(CCmdUI *pCmdUI);
afx_msg void OnUpdateDisplayAverageBPM(CCmdUI *pCmdUI);
afx_msg void OnUpdateDisplayChannelState(CCmdUI *pCmdUI);
afx_msg void OnUpdateTrackerPlayMarker(CCmdUI *pCmdUI); // // // 050B
afx_msg void OnUpdateDisplayAverageBPM(CCmdUI *pCmdUI); // // // 050B
afx_msg void OnUpdateDisplayChannelState(CCmdUI *pCmdUI); // // // 050B
afx_msg void OnUpdateDisplayRegisterState(CCmdUI *pCmdUI);

afx_msg void OnEasterEggKraid1(); // Easter Egg
Expand Down
11 changes: 10 additions & 1 deletion Source/PatternEditor.cpp
Expand Up @@ -65,6 +65,10 @@ const int CPatternEditor::DEFAULT_HEADER_FONT_SIZE = 11;

void CopyNoteSection(stChanNote *Target, const stChanNote *Source, paste_mode_t Mode, column_t Begin, column_t End) // // //
{
if (Begin == COLUMN_NOTE && End == COLUMN_EFF4) {
*Target = *Source;
return;
}
static const char Offset[] = {
offsetof(stChanNote, Note),
offsetof(stChanNote, Instrument),
Expand All @@ -75,7 +79,7 @@ void CopyNoteSection(stChanNote *Target, const stChanNote *Source, paste_mode_t
offsetof(stChanNote, EffNumber) + 3,
};
bool Protected[sizeof(Offset)] = {};
for (size_t i = 0; i < sizeof(Offset); i++) {
for (size_t i = 0; i < sizeof(Offset); ++i) {
const unsigned char TByte = *(reinterpret_cast<unsigned char*>(Target) + Offset[i]); // skip octave byte
const unsigned char SByte = *(reinterpret_cast<const unsigned char*>(Source) + Offset[i]);
switch (Mode) {
Expand Down Expand Up @@ -1161,6 +1165,11 @@ void CPatternEditor::DrawRow(CDC *pDC, int Row, int Line, int Frame, bool bPrevi
TextColor = DIM(TextColor, 70);
}

// // // 050B
// Draw row marker
if (!((Frame - m_pView->GetMarkerFrame()) % GetFrameCount()) && Row == m_pView->GetMarkerRow())
GradientBar(pDC, 2, Line * m_iRowHeight, m_iRowColumnWidth - 5, m_iRowHeight, ColCursor, DIM(ColCursor, 30));

// Draw row number
pDC->SetTextAlign(TA_CENTER | TA_BASELINE); // // //

Expand Down
6 changes: 6 additions & 0 deletions Source/SoundGen.cpp
Expand Up @@ -1062,6 +1062,12 @@ void CSoundGen::BeginPlayer(play_mode_t Mode, int Track)
m_iPlayFrame = m_pTrackerView->GetSelectedFrame();
m_iPlayRow = m_pTrackerView->GetSelectedRow();
break;
// From row marker (bookmark)
case MODE_PLAY_MARKER: // // // 050B
m_bPlayLooping = false;
m_iPlayFrame = m_pTrackerView->GetMarkerFrame();
m_iPlayRow = m_pTrackerView->GetMarkerRow();
break;
}

m_bPlaying = true;
Expand Down
3 changes: 2 additions & 1 deletion Source/SoundGen.h
Expand Up @@ -57,7 +57,8 @@ enum play_mode_t {
MODE_PLAY_START, // Play from start of song
MODE_PLAY_REPEAT, // Play and repeat
MODE_PLAY_CURSOR, // Play from cursor
MODE_PLAY_FRAME // Play frame
MODE_PLAY_FRAME, // Play frame
MODE_PLAY_MARKER, // // // 050B (row marker, aka "bookmark")
};

enum render_end_t {
Expand Down
4 changes: 3 additions & 1 deletion resource.h
Expand Up @@ -746,6 +746,8 @@
#define ID_EDIT_SPLITKEYBOARD 33193
#define ID_VIEW_AVERAGEBPM 33194
#define ID_VIEW_CHANNELSTATE 33195
#define ID_TRACKER_PLAY_MARKER 33196
#define ID_TRACKER_SET_MARKER 33197
#define ID_INSTRUMENT_ADD_2A03 36864
#define ID_INSTRUMENT_ADD_FDS 36865
#define ID_INSTRUMENT_ADD_MMC5 36866
Expand All @@ -766,7 +768,7 @@
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 352
#define _APS_NEXT_COMMAND_VALUE 33196
#define _APS_NEXT_COMMAND_VALUE 33198
#define _APS_NEXT_CONTROL_VALUE 1455
#define _APS_NEXT_SYMED_VALUE 179
#endif
Expand Down

0 comments on commit 25a50d9

Please sign in to comment.