2023-07-16 11:48:36 +04:00
|
|
|
|
/**
|
|
|
|
|
|
* Furnace Tracker - multi-system chiptune tracker
|
2025-01-28 18:49:19 -05:00
|
|
|
|
* Copyright (C) 2021-2025 tildearrow and contributors
|
2023-07-16 11:48:36 +04:00
|
|
|
|
*
|
|
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
|
|
* (at your option) any later version.
|
|
|
|
|
|
*
|
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
|
*
|
|
|
|
|
|
* You should have received a copy of the GNU General Public License along
|
|
|
|
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#include "gui.h"
|
2024-03-22 15:20:24 +04:00
|
|
|
|
#include "guiConst.h"
|
|
|
|
|
|
#include "misc/cpp/imgui_stdlib.h"
|
|
|
|
|
|
#include <fmt/printf.h>
|
2025-09-15 21:02:19 -05:00
|
|
|
|
#include <imgui.h>
|
2023-07-16 11:48:36 +04:00
|
|
|
|
|
2023-07-18 22:30:22 +04:00
|
|
|
|
const char* FurnaceGUI::getSystemPartNumber(DivSystem sys, DivConfig& flags) {
|
2023-07-16 11:48:36 +04:00
|
|
|
|
switch (sys) {
|
|
|
|
|
|
case DIV_SYSTEM_YMU759:
|
|
|
|
|
|
return "YMU759";
|
|
|
|
|
|
break;
|
2023-07-18 22:30:22 +04:00
|
|
|
|
case DIV_SYSTEM_SMS:{
|
|
|
|
|
|
int chipType=flags.getInt("chipType",0);
|
|
|
|
|
|
if (chipType==4) {
|
|
|
|
|
|
return "SN76489A";
|
|
|
|
|
|
} else if (chipType==5) {
|
|
|
|
|
|
return "SN76496";
|
|
|
|
|
|
} else if (chipType==6) {
|
|
|
|
|
|
return "8496";
|
|
|
|
|
|
} else if (chipType==7) {
|
|
|
|
|
|
return "PSSJ";//not part number
|
|
|
|
|
|
} else if (chipType==8) {
|
|
|
|
|
|
return "SN94624";
|
|
|
|
|
|
} else if (chipType==9) {
|
|
|
|
|
|
return "SN76494";
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return "SN76489";
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
case DIV_SYSTEM_PCE:{
|
|
|
|
|
|
int chipType=flags.getInt("chipType",0);
|
|
|
|
|
|
if (chipType==1) {
|
|
|
|
|
|
return "HuC6280A";
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return "HuC6280";
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-07-16 11:48:36 +04:00
|
|
|
|
case DIV_SYSTEM_NES:
|
|
|
|
|
|
return "2A03";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_C64_6581:
|
2023-08-31 12:15:29 +04:00
|
|
|
|
return "6581";
|
2023-07-16 11:48:36 +04:00
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_C64_8580:
|
2023-08-31 12:15:29 +04:00
|
|
|
|
return "8580";
|
2023-07-16 11:48:36 +04:00
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_Y8950:
|
|
|
|
|
|
case DIV_SYSTEM_Y8950_DRUMS:
|
|
|
|
|
|
return "Y8950";
|
|
|
|
|
|
break;
|
2023-07-18 22:30:22 +04:00
|
|
|
|
case DIV_SYSTEM_AY8910:{
|
|
|
|
|
|
int chipType=flags.getInt("chipType",0);
|
|
|
|
|
|
if (chipType==1) {
|
|
|
|
|
|
return "YM2149(F)";
|
|
|
|
|
|
} else if (chipType==2) {
|
|
|
|
|
|
return "5B";
|
|
|
|
|
|
} else if (chipType==3) {
|
|
|
|
|
|
return "AY-3-8914";
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return "AY-3-8910";
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2023-07-16 11:48:36 +04:00
|
|
|
|
case DIV_SYSTEM_YM2151:
|
|
|
|
|
|
return "YM2151";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_YM2612:
|
|
|
|
|
|
case DIV_SYSTEM_YM2612_CSM:
|
|
|
|
|
|
case DIV_SYSTEM_YM2612_DUALPCM:
|
|
|
|
|
|
case DIV_SYSTEM_YM2612_DUALPCM_EXT:
|
2023-07-18 22:30:22 +04:00
|
|
|
|
case DIV_SYSTEM_YM2612_EXT:{
|
|
|
|
|
|
int chipType=0;
|
|
|
|
|
|
if (flags.has("chipType")) {
|
|
|
|
|
|
chipType=flags.getInt("chipType",0);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
chipType=flags.getBool("ladderEffect",0)?1:0;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (chipType==0) {
|
|
|
|
|
|
return "YM3438";
|
|
|
|
|
|
} else if (chipType==2) {
|
|
|
|
|
|
return "YMF276";
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return "YM2612";
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2023-07-16 11:48:36 +04:00
|
|
|
|
case DIV_SYSTEM_TIA:
|
|
|
|
|
|
return "TIA";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_SAA1099:
|
|
|
|
|
|
return "SAA1099";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_AY8930:
|
|
|
|
|
|
return "AY8930";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_VIC20:
|
|
|
|
|
|
return "VIC";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_PET:
|
|
|
|
|
|
return "PET";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_VRC6:
|
|
|
|
|
|
return "VRC6";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_FDS:
|
|
|
|
|
|
return "FDS";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_MMC5:
|
|
|
|
|
|
return "MMC5";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_N163:
|
|
|
|
|
|
return "N163";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_YM2203:
|
|
|
|
|
|
case DIV_SYSTEM_YM2203_EXT:
|
|
|
|
|
|
case DIV_SYSTEM_YM2203_CSM:
|
|
|
|
|
|
return "YM2203";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_YM2608:
|
|
|
|
|
|
case DIV_SYSTEM_YM2608_CSM:
|
|
|
|
|
|
case DIV_SYSTEM_YM2608_EXT:
|
|
|
|
|
|
return "YM2608";
|
|
|
|
|
|
break;
|
2023-08-31 12:15:29 +04:00
|
|
|
|
case DIV_SYSTEM_OPLL:
|
|
|
|
|
|
case DIV_SYSTEM_OPLL_DRUMS:{
|
2023-07-18 22:30:22 +04:00
|
|
|
|
int patchSet=flags.getInt("patchSet",0);
|
|
|
|
|
|
if (patchSet==1) {
|
|
|
|
|
|
return "YMF281";
|
|
|
|
|
|
} else if (patchSet==2) {
|
|
|
|
|
|
return "YM2423";
|
|
|
|
|
|
} else if (patchSet==3) {
|
|
|
|
|
|
return "VRC7";
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return "YM2413";
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2023-07-16 11:48:36 +04:00
|
|
|
|
case DIV_SYSTEM_OPL2:
|
|
|
|
|
|
case DIV_SYSTEM_OPL2_DRUMS:
|
|
|
|
|
|
return "YM3812";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_OPL3:
|
2023-07-22 10:43:21 +09:00
|
|
|
|
case DIV_SYSTEM_OPL3_DRUMS:{
|
|
|
|
|
|
int chipType=flags.getInt("chipType",0);
|
|
|
|
|
|
if (chipType==1) {
|
|
|
|
|
|
return "YMF289B";
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return "YMF262";
|
|
|
|
|
|
}
|
2023-07-16 11:48:36 +04:00
|
|
|
|
break;
|
2023-07-22 10:43:21 +09:00
|
|
|
|
}
|
2023-07-16 11:48:36 +04:00
|
|
|
|
case DIV_SYSTEM_OPL4:
|
|
|
|
|
|
case DIV_SYSTEM_OPL4_DRUMS:
|
2023-07-22 18:58:24 +04:00
|
|
|
|
return "YMF278";
|
2023-07-16 11:48:36 +04:00
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_MULTIPCM:
|
2023-07-22 18:58:24 +04:00
|
|
|
|
return "YMW258-F";
|
2023-07-16 11:48:36 +04:00
|
|
|
|
break;
|
2023-07-18 22:30:22 +04:00
|
|
|
|
case DIV_SYSTEM_RF5C68:{
|
|
|
|
|
|
int chipType=flags.getInt("chipType",0);
|
|
|
|
|
|
if (chipType==1) {
|
|
|
|
|
|
return "RF5C164";
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return "RF5C68";
|
|
|
|
|
|
}
|
2023-07-16 11:48:36 +04:00
|
|
|
|
break;
|
2023-07-18 22:30:22 +04:00
|
|
|
|
}
|
2023-07-16 11:48:36 +04:00
|
|
|
|
case DIV_SYSTEM_OPZ:
|
|
|
|
|
|
return "YM2414";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_SEGAPCM:
|
|
|
|
|
|
return "SegaPCM";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_VRC7:
|
|
|
|
|
|
return "VRC7";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_YM2610B:
|
|
|
|
|
|
case DIV_SYSTEM_YM2610B_CSM:
|
|
|
|
|
|
case DIV_SYSTEM_YM2610B_EXT:
|
|
|
|
|
|
return "YM2610B";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_SFX_BEEPER:
|
|
|
|
|
|
case DIV_SYSTEM_SFX_BEEPER_QUADTONE:
|
|
|
|
|
|
return "ZXS Beeper";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_SCC:
|
|
|
|
|
|
return "SCC";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_YM2610_CSM:
|
|
|
|
|
|
case DIV_SYSTEM_YM2610_FULL:
|
|
|
|
|
|
case DIV_SYSTEM_YM2610_FULL_EXT:
|
|
|
|
|
|
return "YM2610";
|
|
|
|
|
|
break;
|
2023-08-31 12:15:29 +04:00
|
|
|
|
case DIV_SYSTEM_OPL:
|
|
|
|
|
|
case DIV_SYSTEM_OPL_DRUMS:
|
|
|
|
|
|
return "YM3526";
|
2023-07-16 11:48:36 +04:00
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_QSOUND:
|
|
|
|
|
|
return "QSound";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_X1_010:
|
|
|
|
|
|
return "X1-010";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_BUBSYS_WSG:
|
|
|
|
|
|
return "Konami WSG";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_ES5506:
|
|
|
|
|
|
return "ES5506";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_SCC_PLUS:
|
|
|
|
|
|
return "SCC+";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_SOUND_UNIT:
|
|
|
|
|
|
return "TSU";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_MSM6295:
|
|
|
|
|
|
return "MSM6295";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_MSM6258:
|
|
|
|
|
|
return "MSM6258";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_YMZ280B:
|
|
|
|
|
|
return "YMZ280B";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_NAMCO_15XX:
|
|
|
|
|
|
return "C15";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_NAMCO_CUS30:
|
|
|
|
|
|
return "C30";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_MSM5232:
|
|
|
|
|
|
return "MSM5232";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_K007232:
|
|
|
|
|
|
return "K007232";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_GA20:
|
|
|
|
|
|
return "GA20";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_PCM_DAC:
|
|
|
|
|
|
return "DAC";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_SM8521:
|
|
|
|
|
|
return "SM8521";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_PV1000:
|
|
|
|
|
|
return "PV-1000";
|
|
|
|
|
|
break;
|
2023-07-19 23:20:28 +04:00
|
|
|
|
case DIV_SYSTEM_K053260:
|
|
|
|
|
|
return "K053260";
|
|
|
|
|
|
break;
|
2023-07-23 16:57:54 +04:00
|
|
|
|
case DIV_SYSTEM_TED:
|
|
|
|
|
|
return "TED";
|
|
|
|
|
|
break;
|
2023-08-09 20:30:00 +09:00
|
|
|
|
case DIV_SYSTEM_C140:
|
|
|
|
|
|
return "C140";
|
|
|
|
|
|
break;
|
2023-08-31 12:15:29 +04:00
|
|
|
|
case DIV_SYSTEM_C219:
|
|
|
|
|
|
return "C219";
|
|
|
|
|
|
break;
|
2023-10-16 16:57:04 -03:00
|
|
|
|
case DIV_SYSTEM_ESFM:
|
|
|
|
|
|
return "ES1xxx";
|
2025-03-10 04:05:12 -05:00
|
|
|
|
break;
|
2024-08-08 22:58:01 +03:00
|
|
|
|
case DIV_SYSTEM_SUPERVISION:
|
|
|
|
|
|
return "Watara Supervision";
|
2024-08-11 09:22:49 +03:00
|
|
|
|
break;
|
|
|
|
|
|
case DIV_SYSTEM_UPD1771C:
|
2025-01-29 01:58:31 -05:00
|
|
|
|
return "μPD1771C-017";
|
2024-08-11 09:22:49 +03:00
|
|
|
|
break;
|
2023-07-16 11:48:36 +04:00
|
|
|
|
default:
|
|
|
|
|
|
return FurnaceGUI::getSystemName(sys);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2024-03-22 15:20:24 +04:00
|
|
|
|
|
2025-11-13 01:39:21 -05:00
|
|
|
|
float FurnaceGUI::drawSystemChannelInfo(const DivSysDef* whichDef, int keyHitOffset, float tooltipWidth, int chanCount) {
|
|
|
|
|
|
if (whichDef==NULL) return 0;
|
|
|
|
|
|
if (chanCount<1) chanCount=whichDef->channels;
|
|
|
|
|
|
|
2024-03-22 16:28:29 +04:00
|
|
|
|
ImDrawList* dl=ImGui::GetWindowDrawList();
|
|
|
|
|
|
const ImVec2 p=ImGui::GetCursorScreenPos();
|
2025-09-16 06:27:34 -05:00
|
|
|
|
if (tooltipWidth<=0.0f) tooltipWidth=ImGui::GetContentRegionAvail().x;
|
2025-09-15 21:02:19 -05:00
|
|
|
|
ImVec2 sep=ImGui::GetStyle().ItemSpacing;
|
2025-09-16 16:41:55 -05:00
|
|
|
|
sep.x*=0.5f;
|
2025-09-15 21:02:19 -05:00
|
|
|
|
ImVec2 ledSize=ImVec2(
|
2025-11-13 01:39:21 -05:00
|
|
|
|
(tooltipWidth-sep.x*(chanCount-1))/(float)chanCount,
|
2025-09-16 16:41:55 -05:00
|
|
|
|
settings.iconSize*dpiScale
|
2025-09-15 21:02:19 -05:00
|
|
|
|
);
|
2025-09-16 06:27:34 -05:00
|
|
|
|
if (ledSize.x<8.0f*dpiScale) ledSize.x=8.0f*dpiScale;
|
2024-10-13 18:31:46 +04:00
|
|
|
|
float x=p.x, y=p.y;
|
2025-11-13 01:39:21 -05:00
|
|
|
|
for (int i=0; i<chanCount; i++) {
|
2025-11-17 19:38:45 -05:00
|
|
|
|
DivChanDef chanDef=whichDef->getChanDef(i);
|
|
|
|
|
|
|
2025-09-16 06:27:34 -05:00
|
|
|
|
if (x+ledSize.x-0.125>tooltipWidth+p.x) {
|
2024-10-13 18:31:46 +04:00
|
|
|
|
x=p.x;
|
2025-09-15 21:02:19 -05:00
|
|
|
|
y+=ledSize.y+sep.y;
|
2024-10-13 18:31:46 +04:00
|
|
|
|
}
|
2025-11-13 01:39:21 -05:00
|
|
|
|
ImVec4 color=uiColors[GUI_COLOR_CHANNEL_BG];
|
2025-11-17 21:09:43 -05:00
|
|
|
|
if (i<whichDef->maxChans) color=uiColors[chanDef.type+GUI_COLOR_CHANNEL_FM];
|
2025-09-15 21:02:19 -05:00
|
|
|
|
if (keyHitOffset>=0) {
|
2025-11-21 23:17:33 +04:00
|
|
|
|
if (e->curSubSong->chanColor[keyHitOffset+i])
|
|
|
|
|
|
color=ImGui::ColorConvertU32ToFloat4(e->curSubSong->chanColor[keyHitOffset+i]);
|
2025-09-16 04:48:02 -05:00
|
|
|
|
if (e->isChannelMuted(keyHitOffset+i)) {
|
|
|
|
|
|
color=uiColors[GUI_COLOR_CHANNEL_MUTED];
|
|
|
|
|
|
color.x*=MIN(1.0f,0.125f+keyHit1[keyHitOffset+i]*0.875f);
|
|
|
|
|
|
color.y*=MIN(1.0f,0.125f+keyHit1[keyHitOffset+i]*0.875f);
|
|
|
|
|
|
color.z*=MIN(1.0f,0.125f+keyHit1[keyHitOffset+i]*0.875f);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
color.x*=MIN(1.0f,0.125f+keyHit1[keyHitOffset+i]*0.875f);
|
|
|
|
|
|
color.y*=MIN(1.0f,0.125f+keyHit1[keyHitOffset+i]*0.875f);
|
|
|
|
|
|
color.z*=MIN(1.0f,0.125f+keyHit1[keyHitOffset+i]*0.875f);
|
|
|
|
|
|
}
|
2025-09-15 21:02:19 -05:00
|
|
|
|
}
|
|
|
|
|
|
dl->AddRectFilled(ImVec2(x,y),ImVec2(x+ledSize.x,y+ledSize.y),ImGui::GetColorU32(color),ledSize.y);
|
|
|
|
|
|
x+=ledSize.x+sep.x;
|
2024-03-22 15:20:24 +04:00
|
|
|
|
}
|
2025-09-16 06:27:34 -05:00
|
|
|
|
ImGui::Dummy(ImVec2(tooltipWidth,(y-p.y)+ledSize.y));
|
2025-09-16 16:41:55 -05:00
|
|
|
|
return (y-p.y)+ledSize.y;
|
2024-03-22 15:20:24 +04:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void FurnaceGUI::drawSystemChannelInfoText(const DivSysDef* whichDef) {
|
|
|
|
|
|
String info="";
|
2024-03-22 22:02:48 +04:00
|
|
|
|
// same order as chanNames
|
2024-10-02 14:57:02 +04:00
|
|
|
|
// helper: FM|PU|NO|WA|SA | SQ|TR|SW|OP|DR|SL|WV|CH
|
2024-08-18 23:01:24 +04:00
|
|
|
|
unsigned char chanCount[CHANNEL_TYPE_MAX];
|
|
|
|
|
|
memset(chanCount,0,CHANNEL_TYPE_MAX);
|
|
|
|
|
|
// count channel types
|
2024-03-22 15:20:24 +04:00
|
|
|
|
for (int i=0; i<whichDef->channels; i++) {
|
2025-11-17 19:38:45 -05:00
|
|
|
|
DivChanDef chanDef=whichDef->getChanDef(i);
|
|
|
|
|
|
switch (chanDef.insType[0]) {
|
2024-03-22 15:20:24 +04:00
|
|
|
|
case DIV_INS_STD: // square
|
2024-03-23 23:14:31 +04:00
|
|
|
|
case DIV_INS_BEEPER:
|
|
|
|
|
|
case DIV_INS_TED:
|
|
|
|
|
|
case DIV_INS_VIC:
|
2024-03-23 23:24:59 +04:00
|
|
|
|
case DIV_INS_T6W28:
|
2024-08-18 23:01:24 +04:00
|
|
|
|
case DIV_INS_PV1000:
|
2024-03-22 22:02:48 +04:00
|
|
|
|
if (whichDef->id==0xfd) { // dummy
|
2024-08-18 23:01:24 +04:00
|
|
|
|
chanCount[CHANNEL_TYPE_OTHER]++;
|
2024-03-22 22:02:48 +04:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
2024-03-23 23:14:31 +04:00
|
|
|
|
if (whichDef->id==0x9f) { // zx sfx
|
2024-08-18 23:01:24 +04:00
|
|
|
|
chanCount[CHANNEL_TYPE_PULSE]++;
|
2024-03-23 23:14:31 +04:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
2025-11-17 19:38:45 -05:00
|
|
|
|
if (chanDef.type==DIV_CH_NOISE) { // sn/t6w noise
|
2024-08-18 23:01:24 +04:00
|
|
|
|
chanCount[CHANNEL_TYPE_NOISE]++;
|
2024-03-23 23:14:31 +04:00
|
|
|
|
} else { // DIV_CH_PULSE, any sqr chan
|
2024-08-18 23:01:24 +04:00
|
|
|
|
chanCount[CHANNEL_TYPE_SQUARE]++;
|
2024-03-22 15:20:24 +04:00
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_INS_NES:
|
2025-11-17 19:38:45 -05:00
|
|
|
|
if (chanDef.type==DIV_CH_WAVE) {
|
2024-08-18 23:01:24 +04:00
|
|
|
|
chanCount[whichDef->id==0xf1?CHANNEL_TYPE_WAVE:CHANNEL_TYPE_TRIANGLE]++; // triangle, wave for 5E01
|
2024-03-22 22:02:48 +04:00
|
|
|
|
} else {
|
2025-11-17 19:38:45 -05:00
|
|
|
|
chanCount[chanDef.type]++;
|
2024-03-22 22:02:48 +04:00
|
|
|
|
}
|
|
|
|
|
|
break;
|
2024-10-10 23:17:52 +04:00
|
|
|
|
case DIV_INS_AY:
|
|
|
|
|
|
case DIV_INS_AY8930:
|
|
|
|
|
|
chanCount[CHANNEL_TYPE_PSG]++;
|
|
|
|
|
|
break;
|
2024-03-22 22:02:48 +04:00
|
|
|
|
case DIV_INS_OPL_DRUMS:
|
|
|
|
|
|
case DIV_INS_OPL:
|
|
|
|
|
|
case DIV_INS_OPLL:
|
2025-11-17 19:38:45 -05:00
|
|
|
|
if (chanDef.type==DIV_CH_OP) {
|
2024-08-18 23:01:24 +04:00
|
|
|
|
chanCount[CHANNEL_TYPE_FM]++; // opl3 4op
|
2024-03-22 22:02:48 +04:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
2025-11-17 19:38:45 -05:00
|
|
|
|
if (chanDef.type==DIV_CH_NOISE) {
|
2024-08-18 23:01:24 +04:00
|
|
|
|
chanCount[CHANNEL_TYPE_DRUMS]++; // drums
|
2024-03-22 22:02:48 +04:00
|
|
|
|
} else {
|
2025-11-17 19:38:45 -05:00
|
|
|
|
chanCount[chanDef.type]++;
|
2024-03-22 22:02:48 +04:00
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_INS_FM:
|
2025-11-17 19:38:45 -05:00
|
|
|
|
if (chanDef.type==DIV_CH_OP) {
|
2024-08-18 23:01:24 +04:00
|
|
|
|
chanCount[CHANNEL_TYPE_OPERATOR]++; // ext. ops
|
2025-11-17 19:38:45 -05:00
|
|
|
|
} else if (chanDef.type==DIV_CH_NOISE) {
|
2024-03-22 22:02:48 +04:00
|
|
|
|
break; // csm timer
|
2024-03-22 15:20:24 +04:00
|
|
|
|
} else {
|
2025-11-17 19:38:45 -05:00
|
|
|
|
chanCount[chanDef.type]++;
|
2024-03-22 15:20:24 +04:00
|
|
|
|
}
|
|
|
|
|
|
break;
|
2024-08-18 23:01:24 +04:00
|
|
|
|
case DIV_INS_ADPCMA:
|
|
|
|
|
|
case DIV_INS_ADPCMB:
|
|
|
|
|
|
chanCount[CHANNEL_TYPE_SAMPLE]++;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_INS_VRC6_SAW:
|
|
|
|
|
|
chanCount[CHANNEL_TYPE_SAW]++;
|
|
|
|
|
|
break;
|
2024-03-23 23:14:31 +04:00
|
|
|
|
case DIV_INS_POWERNOISE_SLOPE:
|
2024-08-18 23:01:24 +04:00
|
|
|
|
chanCount[CHANNEL_TYPE_SLOPE]++;
|
2024-03-23 23:14:31 +04:00
|
|
|
|
break;
|
|
|
|
|
|
case DIV_INS_QSOUND:
|
2024-08-18 23:01:24 +04:00
|
|
|
|
chanCount[CHANNEL_TYPE_SAMPLE]++;
|
2024-03-23 23:14:31 +04:00
|
|
|
|
break;
|
|
|
|
|
|
case DIV_INS_NDS:
|
2025-11-17 19:38:45 -05:00
|
|
|
|
if (chanDef.type!=DIV_CH_PCM) { // the psg chans can also play samples??
|
2024-08-18 23:01:24 +04:00
|
|
|
|
chanCount[CHANNEL_TYPE_SAMPLE]++;
|
2024-03-23 23:14:31 +04:00
|
|
|
|
}
|
2025-11-17 19:38:45 -05:00
|
|
|
|
chanCount[chanDef.type]++;
|
2024-03-23 23:14:31 +04:00
|
|
|
|
break;
|
|
|
|
|
|
case DIV_INS_VERA:
|
2025-11-17 19:38:45 -05:00
|
|
|
|
if (chanDef.type==DIV_CH_PULSE) {
|
2024-08-18 23:01:24 +04:00
|
|
|
|
chanCount[CHANNEL_TYPE_WAVE]++;
|
2024-03-23 23:14:31 +04:00
|
|
|
|
} else { // sample chan
|
2024-08-18 23:01:24 +04:00
|
|
|
|
chanCount[CHANNEL_TYPE_SAMPLE]++;
|
2024-03-23 23:14:31 +04:00
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case DIV_INS_DAVE:
|
2025-11-17 19:38:45 -05:00
|
|
|
|
if (chanDef.type==DIV_CH_WAVE) {
|
2024-08-18 23:01:24 +04:00
|
|
|
|
chanCount[CHANNEL_TYPE_OTHER]++;
|
2024-03-23 23:14:31 +04:00
|
|
|
|
} else {
|
2025-11-17 19:38:45 -05:00
|
|
|
|
chanCount[chanDef.type]++;
|
2024-03-23 23:14:31 +04:00
|
|
|
|
}
|
|
|
|
|
|
break;
|
2024-10-02 14:57:02 +04:00
|
|
|
|
case DIV_INS_SWAN:
|
2025-11-17 19:38:45 -05:00
|
|
|
|
if (chanDef.type!=DIV_CH_WAVE) {
|
2024-10-02 14:57:02 +04:00
|
|
|
|
chanCount[CHANNEL_TYPE_WAVETABLE]++;
|
|
|
|
|
|
}
|
2025-11-17 19:38:45 -05:00
|
|
|
|
chanCount[chanDef.type]++;
|
2024-10-02 14:57:02 +04:00
|
|
|
|
break;
|
2024-10-10 23:17:52 +04:00
|
|
|
|
case DIV_INS_SID3:
|
2025-11-17 19:38:45 -05:00
|
|
|
|
if (chanDef.type!=DIV_CH_WAVE) {
|
2024-10-10 23:17:52 +04:00
|
|
|
|
chanCount[CHANNEL_TYPE_OTHER]++;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
chanCount[CHANNEL_TYPE_WAVE]++;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
2024-03-23 23:14:31 +04:00
|
|
|
|
case DIV_INS_C64: // uncategorizable (by me)
|
2024-03-22 15:20:24 +04:00
|
|
|
|
case DIV_INS_TIA:
|
|
|
|
|
|
case DIV_INS_PET:
|
|
|
|
|
|
case DIV_INS_SU:
|
2024-03-23 23:14:31 +04:00
|
|
|
|
case DIV_INS_POKEY:
|
|
|
|
|
|
case DIV_INS_MIKEY:
|
2024-08-18 23:01:24 +04:00
|
|
|
|
case DIV_INS_BIFURCATOR:
|
|
|
|
|
|
case DIV_INS_SID2:
|
|
|
|
|
|
chanCount[CHANNEL_TYPE_OTHER]++;
|
2024-03-22 15:20:24 +04:00
|
|
|
|
break;
|
|
|
|
|
|
default:
|
2025-11-17 19:38:45 -05:00
|
|
|
|
chanCount[chanDef.type]++;
|
2024-03-22 15:20:24 +04:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2024-08-18 23:01:24 +04:00
|
|
|
|
// generate string
|
|
|
|
|
|
for (int j=0; j<CHANNEL_TYPE_MAX; j++) {
|
2024-03-23 23:24:59 +04:00
|
|
|
|
unsigned char i=chanNamesHierarchy[j];
|
2024-03-22 15:20:24 +04:00
|
|
|
|
if (chanCount[i]==0) continue;
|
|
|
|
|
|
if (info.length()!=0) {
|
|
|
|
|
|
info+=", ";
|
|
|
|
|
|
}
|
2024-08-18 23:01:24 +04:00
|
|
|
|
if (i==CHANNEL_TYPE_OTHER) {
|
2024-03-22 15:20:24 +04:00
|
|
|
|
if (chanCount[i]>1) {
|
2024-08-18 23:01:24 +04:00
|
|
|
|
info+=fmt::sprintf("%d %s",chanCount[i],chanNames[CHANNEL_TYPE_OTHER+1]);
|
2024-03-22 15:20:24 +04:00
|
|
|
|
} else {
|
2024-08-18 23:01:24 +04:00
|
|
|
|
info+=fmt::sprintf("%d %s",chanCount[i],chanNames[CHANNEL_TYPE_OTHER]);
|
2024-03-22 15:20:24 +04:00
|
|
|
|
}
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
2024-10-02 14:57:02 +04:00
|
|
|
|
info+=fmt::sprintf("%d × %s",chanCount[i],chanNames[i]);
|
2024-03-22 15:20:24 +04:00
|
|
|
|
}
|
|
|
|
|
|
ImGui::Text("%s",info.c_str());
|
|
|
|
|
|
}
|