Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ Last updated: 2026-06-03
- MMC5 also now has proper nonlinear mixing.
- Port VRC6 to new CSoundChip and NSFPlay emulation core (@Gumball2415 @eulyderg #325 #417)
- VRC6 sawtooth volume meter reads the register value rather than the actual output, the only practical difference being that the meter now displays volume level 1 correctly.
- Add Volume column color fading feature (@eulyderg #284 @Nemo55aa #xxx)

### Bug fixes

Expand Down
13 changes: 7 additions & 6 deletions Dn-FamiTracker.rc
Original file line number Diff line number Diff line change
Expand Up @@ -1239,12 +1239,13 @@ BEGIN
GROUPBOX "Color schemes",IDC_STATIC,7,7,165,29
COMBOBOX IDC_SCHEME,14,17,151,126,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
GROUPBOX "Colors",IDC_STATIC,7,37,165,58
LTEXT "Item",IDC_STATIC,14,50,16,8
COMBOBOX IDC_COL_ITEM,31,48,134,172,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
CONTROL "",IDC_COL_PREVIEW,"Static",SS_OWNERDRAW,14,65,95,12
PUSHBUTTON "&Pick color",IDC_PICK_COL,112,64,54,15
CONTROL "Pattern colors",IDC_PATTERNCOLORS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,81,58,9
CONTROL "Display flats",IDC_DISPLAYFLATS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,83,81,58,9
LTEXT "Item",IDC_STATIC,14,47,16,8
COMBOBOX IDC_COL_ITEM,31,45,134,172,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
CONTROL "",IDC_COL_PREVIEW,"Static",SS_OWNERDRAW,14,60,95,11
PUSHBUTTON "&Pick color",IDC_PICK_COL,112,59,54,12
CONTROL "Pattern colors",IDC_PATTERNCOLORS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,73,58,9
CONTROL "Display flats",IDC_DISPLAYFLATS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,83,73,58,9
CONTROL "Fade volume color",IDC_FADEVOLCOL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,83,68,9
GROUPBOX "Font",IDC_STATIC,7,96,165,64
COMBOBOX IDC_FONT_PERCENT,132,115,27,12,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
LTEXT "%",IDC_STATIC,160,117,8,8
Expand Down
2 changes: 1 addition & 1 deletion Dn-help
6 changes: 6 additions & 0 deletions Source/ColorScheme.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ struct COLOR_SCHEME {
const COLORREF TEXT_HILITE2;
const COLORREF TEXT_INSTRUMENT;
const COLORREF TEXT_VOLUME;
const COLORREF TEXT_VOLUME2;
const COLORREF TEXT_EFFECT;
const COLORREF SELECTION;
const COLORREF CURSOR;
Expand Down Expand Up @@ -90,6 +91,7 @@ const COLOR_SCHEME DEFAULT_COLOR_SCHEME = {
0x0060FFFF, // Highlighted text color 2
0x0080FF80, // Instrument color
0x00FF8080, // Volume color
0x00AA3030, // Volume color to fade
0x008080FF, // Effect color
0x00F27D86, // Selection color
0x00808080, // Cursor color
Expand All @@ -116,6 +118,7 @@ const COLOR_SCHEME MONOCHROME_COLOR_SCHEME = {
0x00FFFFFF, // Highlighted text color 2
0x0080FF80, // Instrument color
0x00FF8080, // Volume color
0x00AA3030, // Volume color to fade
0x008080FF, // Effect color
0x00454550, // Selection color
0x00908080, // Cursor color
Expand All @@ -142,6 +145,7 @@ const COLOR_SCHEME RENOISE_COLOR_SCHEME = {
0x00FFF6C9, // Highlighted text color 2
0x0080FF80, // Instrument color
0x00FF8080, // Volume color
0x00CC5050, // Volume color to fade
0x008080FF, // Effect color
0x00FF8080, // Selection color
0x00707070, // Cursor color
Expand All @@ -168,6 +172,7 @@ const COLOR_SCHEME WHITE_COLOR_SCHEME = {
0x00FF2020, // Highlighted text color 2
0x00000000, // Instrument color
0x00000000, // Volume color
0x00AAAAAA, // Volume color to fade
0x00000000, // Effect color
0x00FF8080, // Selection color
0x00D0A0A0, // Cursor color
Expand All @@ -194,6 +199,7 @@ const COLOR_SCHEME SATURDAY_COLOR_SCHEME = {
0x00E0FFFF, // Highlighted text color 2
0x00F088C0, // Instrument color
0x00F0C0D8, // Volume color
0x00AA3030, // Volume color to fade
0x00F088C0, // Effect color
0x00602040, // Selection color
0x00508090, // Cursor color
Expand Down
83 changes: 76 additions & 7 deletions Source/ConfigAppearance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ const TCHAR *CConfigAppearance::COLOR_ITEMS[] = {
_T("Highlighted pattern text 2"),
_T("Instrument column"),
_T("Volume column"),
_T("Volume column 2"),
_T("Effect number column"),
_T("Selection"),
_T("Cursor"),
Expand Down Expand Up @@ -131,6 +132,8 @@ BEGIN_MESSAGE_MAP(CConfigAppearance, CPropertyPage)

ON_BN_CLICKED(IDC_DISPLAYFLATS, OnBnClickedDisplayFlats)

ON_BN_CLICKED(IDC_FADEVOLCOL, OnBnClickedFadeVolCol)

ON_CBN_SELCHANGE(IDC_FONT, OnCbnSelchangeFont)
ON_CBN_SELCHANGE(IDC_FONT_SIZE, OnCbnSelchangeFontSize)
ON_CBN_EDITCHANGE(IDC_FONT_SIZE, OnCbnEditchangeFontSize)
Expand Down Expand Up @@ -315,11 +318,31 @@ void CConfigAppearance::OnPaint()
#define BAR(x, y) dc.FillSolidRect((x) + 3, (y) + (iRowSize / 2) + 1, 10 - 7, 1, ShadedCol)

if (i == 0) {
dc.TextOut(OffsetLeft, OffsetTop - 2, _T("C"));
// Notes column
dc.SetTextColor(GetColor(COL_PATTERN_TEXT_HILITE));
dc.TextOut(OffsetLeft, OffsetTop - 2, _T("C"));
dc.TextOut(OffsetLeft + 12, OffsetTop - 2, _T("-"));
dc.TextOut(OffsetLeft + 24, OffsetTop - 2, _T("4"));

// Inst. column
dc.SetTextColor(GetColor(COL_PATTERN_INSTRUMENT));
dc.TextOut(OffsetLeft + 40, OffsetTop - 2, _T("0"));
dc.TextOut(OffsetLeft + 52, OffsetTop - 2, _T("0"));

// Volume column
dc.SetTextColor(GetColor(COL_PATTERN_VOLUME));
dc.TextOut(OffsetLeft + 68, OffsetTop - 2, _T("F"));

// Effect column
dc.SetTextColor(GetColor(COL_PATTERN_EFF_NUM));
dc.TextOut(OffsetLeft + 84, OffsetTop - 2, _T("4"));
dc.TextOut(OffsetLeft + 96, OffsetTop - 2, _T("6"));
dc.TextOut(OffsetLeft + 108, OffsetTop - 2, _T("1"));

dc.SetTextColor(GetColor(COL_PATTERN_TEXT_HILITE));
}
else {
// Notes column
BAR(OffsetLeft, OffsetTop - 2);
BAR(OffsetLeft + 12, OffsetTop - 2);
BAR(OffsetLeft + 24, OffsetTop - 2);
Expand All @@ -331,14 +354,44 @@ void CConfigAppearance::OnPaint()
else {
dc.SetTextColor(ShadedCol);
}
if(i != 0) {
// Inst. column
BAR(OffsetLeft + 40, OffsetTop - 2);
BAR(OffsetLeft + 52, OffsetTop - 2);

// Volume column
if((0xF / 2) >= i) {
CString tmpVolStr;
int iTmpblendLevel = 0xE - i * 2;
COLORREF tmpVolColBlended;
if(m_bFadeVolCol) {
tmpVolColBlended = \
BLEND(
GetColor(COL_PATTERN_VOLUME),
GetColor(COL_PATTERN_VOLUME2),
(int)(((double)iTmpblendLevel / 15.0) * 100.0)
);
} else {
tmpVolColBlended = GetColor(COL_PATTERN_VOLUME);
}
dc.SetTextColor(tmpVolColBlended);

tmpVolStr.Format("%X", 0xE - i * 2);
dc.TextOut(OffsetLeft + 68, OffsetTop - 2, tmpVolStr);

dc.SetTextColor(GetColor(COL_PATTERN_TEXT_HILITE));
} else {
BAR(OffsetLeft + 68, OffsetTop - 2);
}

BAR(OffsetLeft + 40, OffsetTop - 2);
BAR(OffsetLeft + 52, OffsetTop - 2);
BAR(OffsetLeft + 68, OffsetTop - 2);
BAR(OffsetLeft + 84, OffsetTop - 2);
BAR(OffsetLeft + 96, OffsetTop - 2);
// Effect column
BAR(OffsetLeft + 84, OffsetTop - 2);
BAR(OffsetLeft + 96, OffsetTop - 2);
BAR(OffsetLeft + 108, OffsetTop - 2);
// Removed call to BAR() because it overflows available space.
}
}
#undef BAR

dc.SelectObject(OldFont);
}
Expand Down Expand Up @@ -392,6 +445,7 @@ BOOL CConfigAppearance::OnInitDialog()
m_iColors[COL_PATTERN_TEXT_HILITE2] = pSettings->Appearance.iColPatternTextHilite2;
m_iColors[COL_PATTERN_INSTRUMENT] = pSettings->Appearance.iColPatternInstrument;
m_iColors[COL_PATTERN_VOLUME] = pSettings->Appearance.iColPatternVolume;
m_iColors[COL_PATTERN_VOLUME2] = pSettings->Appearance.iColPatternVolume2;
m_iColors[COL_PATTERN_EFF_NUM] = pSettings->Appearance.iColPatternEffect;
m_iColors[COL_SELECTION] = pSettings->Appearance.iColSelection;
m_iColors[COL_CURSOR] = pSettings->Appearance.iColCursor;
Expand All @@ -409,8 +463,8 @@ BOOL CConfigAppearance::OnInitDialog()

m_bPatternColors = pSettings->Appearance.bPatternColor; // // //
m_bDisplayFlats = pSettings->Appearance.bDisplayFlats; // // //
m_bFadeVolCol = pSettings->Appearance.bFadeVolumeColor;


// Load color schemes
pItemsBox = static_cast<CComboBox*>(GetDlgItem(IDC_SCHEME));

Expand Down Expand Up @@ -477,6 +531,7 @@ BOOL CConfigAppearance::OnApply()

pSettings->Appearance.bPatternColor = m_bPatternColors; // // //
pSettings->Appearance.bDisplayFlats = m_bDisplayFlats; // // //
pSettings->Appearance.bFadeVolumeColor = m_bFadeVolCol;

pSettings->Appearance.iColBackground = m_iColors[COL_BACKGROUND];
pSettings->Appearance.iColBackgroundHilite = m_iColors[COL_BACKGROUND_HILITE];
Expand All @@ -486,6 +541,7 @@ BOOL CConfigAppearance::OnApply()
pSettings->Appearance.iColPatternTextHilite2 = m_iColors[COL_PATTERN_TEXT_HILITE2];
pSettings->Appearance.iColPatternInstrument = m_iColors[COL_PATTERN_INSTRUMENT];
pSettings->Appearance.iColPatternVolume = m_iColors[COL_PATTERN_VOLUME];
pSettings->Appearance.iColPatternVolume2 = m_iColors[COL_PATTERN_VOLUME2];
pSettings->Appearance.iColPatternEffect = m_iColors[COL_PATTERN_EFF_NUM];
pSettings->Appearance.iColSelection = m_iColors[COL_SELECTION];
pSettings->Appearance.iColCursor = m_iColors[COL_CURSOR];
Expand Down Expand Up @@ -522,6 +578,7 @@ BOOL CConfigAppearance::OnSetActive()
{
CheckDlgButton(IDC_PATTERNCOLORS, m_bPatternColors);
CheckDlgButton(IDC_DISPLAYFLATS, m_bDisplayFlats);
CheckDlgButton(IDC_FADEVOLCOL, m_bFadeVolCol);
return CPropertyPage::OnSetActive();
}

Expand Down Expand Up @@ -573,6 +630,7 @@ void CConfigAppearance::SelectColorScheme(const COLOR_SCHEME *pColorScheme)
SetColor(COL_PATTERN_INSTRUMENT, pColorScheme->TEXT_INSTRUMENT);
SetColor(COL_PATTERN_VOLUME, pColorScheme->TEXT_VOLUME);
SetColor(COL_PATTERN_EFF_NUM, pColorScheme->TEXT_EFFECT);
SetColor(COL_PATTERN_VOLUME2, pColorScheme->TEXT_VOLUME2);
SetColor(COL_SELECTION, pColorScheme->SELECTION);
SetColor(COL_CURSOR, pColorScheme->CURSOR);
SetColor(COL_CURRENT_ROW_NORMAL, pColorScheme->ROW_NORMAL); // // //
Expand Down Expand Up @@ -688,6 +746,13 @@ void CConfigAppearance::OnBnClickedDisplayFlats()
SetModified();
}

void CConfigAppearance::OnBnClickedFadeVolCol()
{
m_bFadeVolCol = IsDlgButtonChecked(IDC_FADEVOLCOL) != 0;
RedrawWindow();
SetModified();
}

const auto TXT = _T(".txt");
void CConfigAppearance::OnBnClickedButtonAppearanceSave() // // // 050B
{
Expand Down Expand Up @@ -722,6 +787,7 @@ void CConfigAppearance::ExportSettings(const char *Path) const // // // 050B
file << COLOR_ITEMS[i] << SETTING_SEPARATOR << HEX_PREFIX << conv::from_uint_hex(m_iColors[i], 6) << std::endl;
file << "Pattern colors" << SETTING_SEPARATOR << m_bPatternColors << std::endl;
file << "Flags" << SETTING_SEPARATOR << m_bDisplayFlats << std::endl;
file << "Fade volume color" << SETTING_SEPARATOR << m_bFadeVolCol << std::endl;
file << "Font" << SETTING_SEPARATOR << m_strFont << std::endl;
file << "Font size" << SETTING_SEPARATOR << m_rowHeight << std::endl;
file << "Font percent" << SETTING_SEPARATOR << this->fontPercent << std::endl;
Expand Down Expand Up @@ -800,6 +866,9 @@ void CConfigAppearance::ImportSettings(const char *Path) // // // 050B
} else if (is_match(key, "Flags")) {
if (auto x = conv::to_uint(value))
m_bDisplayFlats = (bool)*x;
} else if (is_match(key, "Fade volume color")) {
if (auto x = conv::to_uint(value))
m_bFadeVolCol = (bool)*x;
} else if (is_match(key, "Font size")) {
if (auto x = conv::to_uint(value))
m_rowHeight = *x;
Expand Down
3 changes: 3 additions & 0 deletions Source/ConfigAppearance.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ enum color_items_t {
COL_PATTERN_TEXT_HILITE2,
COL_PATTERN_INSTRUMENT,
COL_PATTERN_VOLUME,
COL_PATTERN_VOLUME2,
COL_PATTERN_EFF_NUM,
COL_SELECTION,
COL_CURSOR,
Expand Down Expand Up @@ -94,6 +95,7 @@ class CConfigAppearance : public CPropertyPage
int m_iSelectedItem;
bool m_bPatternColors;
bool m_bDisplayFlats;
bool m_bFadeVolCol;

int m_iColors[COLOR_ITEM_COUNT];

Expand All @@ -110,6 +112,7 @@ class CConfigAppearance : public CPropertyPage
afx_msg void OnCbnSelchangeFontSize();
afx_msg void OnBnClickedPatterncolors();
afx_msg void OnBnClickedDisplayFlats();
afx_msg void OnBnClickedFadeVolCol();
afx_msg void OnCbnEditchangeFontSize();

afx_msg void OnCbnSelchangeFontHeader();
Expand Down
49 changes: 36 additions & 13 deletions Source/PatternEditor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1246,21 +1246,27 @@ void CPatternEditor::DrawRow(CDC *pDC, int Row, int Line, int Frame, bool bPrevi
colorInfo.Compact = BLEND(TextColor, colorInfo.Back, SHADE_LEVEL.PREVIEW); // // //

if (!pSettings->Appearance.bPatternColor) { // // //
colorInfo.Instrument = colorInfo.Volume = colorInfo.Effect = colorInfo.Note;
colorInfo.Instrument = \
colorInfo.Volume = \
colorInfo.Volume2Fade = \
colorInfo.Effect = \
colorInfo.Note;
}
else {
colorInfo.Instrument = pSettings->Appearance.iColPatternInstrument;
colorInfo.Volume = pSettings->Appearance.iColPatternVolume;
colorInfo.Effect = pSettings->Appearance.iColPatternEffect;
colorInfo.Instrument = pSettings->Appearance.iColPatternInstrument;
colorInfo.Volume = pSettings->Appearance.iColPatternVolume;
colorInfo.Volume2Fade = pSettings->Appearance.iColPatternVolume2;
colorInfo.Effect = pSettings->Appearance.iColPatternEffect;
}

if (bPreview) {
colorInfo.Shaded = BLEND(colorInfo.Shaded, colorInfo.Back, SHADE_LEVEL.PREVIEW);
colorInfo.Note = BLEND(colorInfo.Note, colorInfo.Back, SHADE_LEVEL.PREVIEW);
colorInfo.Instrument = BLEND(colorInfo.Instrument, colorInfo.Back, SHADE_LEVEL.PREVIEW);
colorInfo.Volume = BLEND(colorInfo.Volume, colorInfo.Back, SHADE_LEVEL.PREVIEW);
colorInfo.Effect = BLEND(colorInfo.Effect, colorInfo.Back, SHADE_LEVEL.PREVIEW);
colorInfo.Compact = BLEND(colorInfo.Compact, colorInfo.Back, SHADE_LEVEL.PREVIEW); // // //
colorInfo.Shaded = BLEND(colorInfo.Shaded, colorInfo.Back, SHADE_LEVEL.PREVIEW);
colorInfo.Note = BLEND(colorInfo.Note, colorInfo.Back, SHADE_LEVEL.PREVIEW);
colorInfo.Instrument = BLEND(colorInfo.Instrument, colorInfo.Back, SHADE_LEVEL.PREVIEW);
colorInfo.Volume = BLEND(colorInfo.Volume, colorInfo.Back, SHADE_LEVEL.PREVIEW);
colorInfo.Volume2Fade= BLEND(colorInfo.Volume2Fade, colorInfo.Back, SHADE_LEVEL.PREVIEW);
colorInfo.Effect = BLEND(colorInfo.Effect, colorInfo.Back, SHADE_LEVEL.PREVIEW);
colorInfo.Compact = BLEND(colorInfo.Compact, colorInfo.Back, SHADE_LEVEL.PREVIEW); // // //
}

// Draw channels
Expand Down Expand Up @@ -1353,6 +1359,7 @@ void CPatternEditor::DrawCell(CDC *pDC, int PosX, cursor_column_t Column, int Ch
static const char HEX[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

const bool m_bDisplayFlat = theApp.GetSettings()->Appearance.bDisplayFlats; // // //
const bool m_bFadeVolumeColor = theApp.GetSettings()->Appearance.bFadeVolumeColor;

const char *NOTES_A = m_bDisplayFlat ? NOTES_A_FLAT : NOTES_A_SHARP;
const char *NOTES_B = m_bDisplayFlat ? NOTES_B_FLAT : NOTES_B_SHARP;
Expand Down Expand Up @@ -1580,10 +1587,26 @@ void CPatternEditor::DrawCell(CDC *pDC, int PosX, cursor_column_t Column, int Ch
break;
case C_VOLUME:
// Volume
if (pNoteData->Vol == MAX_VOLUME || pTrackerChannel->GetID() == CHANID_DPCM)
if (pNoteData->Vol == MAX_VOLUME || pTrackerChannel->GetID() == CHANID_DPCM) {
BAR(PosX);
else
DrawChar(pDC, PosX + m_iCharWidth / 2, PosY, HEX[pNoteData->Vol & 0x0F], pColorInfo->Volume); // // //
} else {
// prepare fading color for volume
int iTmpblendLevel;
COLORREF tmpVolColToFade;
if(m_bFadeVolumeColor) {
iTmpblendLevel = (int)((double)(pNoteData->Vol & 0x0F) / 15.0 * 100.0);
tmpVolColToFade = \
BLEND(
pColorInfo->Volume,
pColorInfo->Volume2Fade,
iTmpblendLevel
);
} else {
tmpVolColToFade = pColorInfo->Volume;
}

DrawChar(pDC, PosX + m_iCharWidth / 2, PosY, HEX[pNoteData->Vol & 0x0F], tmpVolColToFade); // // //
}
break;
case C_EFF1_NUM: case C_EFF2_NUM: case C_EFF3_NUM: case C_EFF4_NUM:
// Effect type
Expand Down
1 change: 1 addition & 0 deletions Source/PatternEditor.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ struct RowColorInfo_t {
COLORREF Note;
COLORREF Instrument;
COLORREF Volume;
COLORREF Volume2Fade;
COLORREF Effect;
COLORREF Back;
COLORREF Shaded;
Expand Down
3 changes: 3 additions & 0 deletions Source/Settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ void CSettings::SetupSettings()
SETTING_INT("Appearance", "Pattern instrument", DEFAULT_COLOR_SCHEME.TEXT_INSTRUMENT, &Appearance.iColPatternInstrument);
SETTING_INT("Appearance", "Pattern volume", DEFAULT_COLOR_SCHEME.TEXT_VOLUME, &Appearance.iColPatternVolume);
SETTING_INT("Appearance", "Pattern effect", DEFAULT_COLOR_SCHEME.TEXT_EFFECT, &Appearance.iColPatternEffect);
SETTING_INT("Appearance", "Pattern volume 2", DEFAULT_COLOR_SCHEME.TEXT_VOLUME2, &Appearance.iColPatternVolume2);
SETTING_INT("Appearance", "Selection", DEFAULT_COLOR_SCHEME.SELECTION, &Appearance.iColSelection);
SETTING_INT("Appearance", "Cursor", DEFAULT_COLOR_SCHEME.CURSOR, &Appearance.iColCursor);

Expand All @@ -197,6 +198,8 @@ void CSettings::SetupSettings()
->UpdateDefault("Appearance", "Pattern colors");
SETTING_BOOL("Appearance", "Display flats", false, &Appearance.bDisplayFlats)
->UpdateDefault("Appearance", "Display flats");
SETTING_BOOL("Appearance", "Fade volume color", false, &Appearance.bFadeVolumeColor)
->UpdateDefault("Appearance", "Fade volume color");

SETTING_STRING("Appearance", "Header font", HEADER_FONT, &Appearance.strFontHeader)
->UpdateDefault("General", "Header font");
Expand Down
Loading