Fix effects and add Ins/Smp name view

This commit is contained in:
Wirlaburla 2023-09-14 00:57:21 -05:00
parent 0b2afd5b92
commit 726f1476a2

View File

@ -2,10 +2,12 @@
#include <iostream> #include <iostream>
#include <cstdlib> #include <cstdlib>
#include <stdio.h> #include <stdio.h>
#include <map>
#include <alsa/asoundlib.h> #include <alsa/asoundlib.h>
#include <xmp.h> #include <xmp.h>
#include <ncurses.h> #include <ncurses.h>
#include "trakker.h"
#include "trakker_version.h" #include "trakker_version.h"
#define SAMPLERATE 48000 #define SAMPLERATE 48000
@ -25,19 +27,11 @@ int vOffset = 0;
int looped = 0; int looped = 0;
bool stopped; bool stopped;
bool loop; bool loop;
std::map<int, char> effects;
WINDOW *dis; WINDOW *dis;
WINDOW *tab; WINDOW *tab;
void destroyWindows();
void createWindows();
void renderInfo(xmp_module_info *mi, xmp_frame_info *fi);
void renderAbout();
void renderTrack(xmp_module_info *mi, xmp_frame_info *fi);
void renderRows(xmp_module_info *mi, xmp_frame_info *fi);
void renderChannels(xmp_module_info *mi, xmp_frame_info *fi);
void renderInstruments(xmp_module_info *mi, xmp_frame_info *fi);
char getEffectType(int i);
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
int err; int err;
snd_pcm_t *handle; snd_pcm_t *handle;
@ -57,13 +51,11 @@ int main(int argc, char *argv[]) {
if (xmp_load_module(xc, argv[1]) != 0) { if (xmp_load_module(xc, argv[1]) != 0) {
fprintf(stderr, "Failed to load Module: %s\n", argv[1]); fprintf(stderr, "Failed to load Module: %s\n", argv[1]);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} } else printf("Loaded Module: \"%s\"\n", argv[1]);
struct xmp_module_info xmi; struct xmp_module_info xmi;
struct xmp_frame_info xfi; struct xmp_frame_info xfi;
printf("Loading Module: \"%s\"\n", argv[1]);
initscr(); initscr();
if (has_colors() == TRUE) { if (has_colors() == TRUE) {
@ -141,6 +133,7 @@ int main(int argc, char *argv[]) {
int row, pos; int row, pos;
xmp_get_module_info(xc, &xmi); xmp_get_module_info(xc, &xmi);
row = pos = -1; row = pos = -1;
generateEffectsTable(xmi.mod);
xmp_start_player(xc, SAMPLERATE, 0); xmp_start_player(xc, SAMPLERATE, 0);
int key; int key;
@ -176,6 +169,12 @@ int main(int argc, char *argv[]) {
case KEY_DOWN: // Seek Down case KEY_DOWN: // Seek Down
if (vOffset < vMax) vOffset++; if (vOffset < vMax) vOffset++;
break; break;
case KEY_PPAGE:
if (vOffset > vMin + LINES-6) vOffset-=(LINES-5);
break;
case KEY_NPAGE:
if (vOffset < vMax - LINES-5) vOffset+=(LINES-5);
break;
case 10: case 10:
hOffset = 0; hOffset = 0;
vOffset = 0; vOffset = 0;
@ -280,6 +279,7 @@ void createWindows() {
void renderTrack(xmp_module_info *mi, xmp_frame_info *fi) { void renderTrack(xmp_module_info *mi, xmp_frame_info *fi) {
werase(dis); werase(dis);
wclrtoeol(tab);
mvwprintw(tab, 0, 1, mi->mod->name); mvwprintw(tab, 0, 1, mi->mod->name);
mvwprintw( mvwprintw(
tab, tab,
@ -292,7 +292,7 @@ void renderTrack(xmp_module_info *mi, xmp_frame_info *fi) {
); );
mvwprintw(tab, 1, COLS-10, "VOL: %i%%", vol); mvwprintw(tab, 1, COLS-10, "VOL: %i%%", vol);
mvwprintw(tab, 1, 1, "%i/%ibpm", fi->speed, fi->bpm); mvwprintw(tab, 1, 1, "%i/%ibpm", fi->speed, fi->bpm);
mvwprintw(tab, LINES-2, (COLS/2)-4, stopped?"STOPPED":"PLAYING"); mvwprintw(tab, LINES-2, (COLS/2)-4, "%s%s", stopped?"STOPPED":"PLAYING", loop?" [L]":"");
if (display == 0) { if (display == 0) {
renderInfo(mi, fi); renderInfo(mi, fi);
} else if (display == 1) { } else if (display == 1) {
@ -311,28 +311,32 @@ void renderTrack(xmp_module_info *mi, xmp_frame_info *fi) {
void renderInfo(xmp_module_info *mi, xmp_frame_info *fi) { void renderInfo(xmp_module_info *mi, xmp_frame_info *fi) {
wattron(dis, A_BOLD); wattron(dis, A_BOLD);
mvwprintw(dis, 3-vOffset, 0, "Format:"); mvwprintw(dis, 1-vOffset, 1, "Format:");
mvwprintw(dis, 4-vOffset, 0, "Instruments:"); mvwprintw(dis, 2-vOffset, 1, "Channels:");
mvwprintw(dis, 5-vOffset, 0, "Channels:"); mvwprintw(dis, 3-vOffset, 1, "Looping:");
mvwprintw(dis, 6-vOffset, 0, "Looping:"); mvwprintw(dis, 5-vOffset, 1, "Instruments:");
mvwprintw(dis, 8-vOffset, 0, "Comments:"); mvwprintw(dis, (7+mi->mod->ins)-vOffset, 1, "Samples:");
wattroff(dis, A_BOLD); wattroff(dis, A_BOLD);
mvwprintw(dis, 3-vOffset, 16, mi->mod->type); mvwprintw(dis, 1-vOffset, 16, mi->mod->type);
mvwprintw(dis, 4-vOffset, 16, "%i", mi->mod->ins); mvwprintw(dis, 2-vOffset, 16, "%i", mi->mod->chn);
mvwprintw(dis, 5-vOffset, 16, "%i", mi->mod->chn); mvwprintw(dis, 3-vOffset, 16, loop?"YES":"NO");
mvwprintw(dis, 6-vOffset, 16, loop?"YES":"NO"); mvwprintw(dis, 5-vOffset, 16, "%i", mi->mod->ins);
mvwprintw(dis, (7+mi->mod->ins)-vOffset, 16, "%i", mi->mod->smp);
if (mi->comment != NULL) { for (int xi = 0; xi < mi->mod->ins; xi++) {
mvwprintw(dis, 9-vOffset, 0, "%s", mi->comment); mvwprintw(dis, xi+6-vOffset, 1, "[%02X] %s", xi, mi->mod->xxi[xi].name);
}
for (int xs = 0; xs < mi->mod->smp; xs++) {
mvwprintw(dis, xs+(8+mi->mod->ins)-vOffset, 1, "[%02X] %s", xs, mi->mod->xxs[xs].name);
} }
} }
void renderAbout() { void renderAbout() {
wattron(dis, A_BOLD); wattron(dis, A_BOLD);
mvwprintw(dis, 1-vOffset, 2, "======== || // || //"); mvwprintw(dis, 1-vOffset, 2, "======== \\\\ // \\\\ //");
mvwprintw(dis, 2-vOffset, 2, " || || // || //"); mvwprintw(dis, 2-vOffset, 2, " || || // || //");
mvwprintw(dis, 3-vOffset, 2, " || ||// ||//"); mvwprintw(dis, 3-vOffset, 2, " || \\\\// \\\\//");
mvwprintw(dis, 4-vOffset, 2, " || //==\\\\ //===|| ||\\\\ ||\\\\ //===\\\\ //===\\\\"); mvwprintw(dis, 4-vOffset, 2, " || //==\\\\ //===|| ||\\\\ ||\\\\ //===\\\\ //===\\\\");
mvwprintw(dis, 5-vOffset, 2, " || || || | || \\\\ || \\\\ ||===// ||"); mvwprintw(dis, 5-vOffset, 2, " || || || | || \\\\ || \\\\ ||===// ||");
mvwprintw(dis, 6-vOffset, 2, " || || \\\\===|| || \\\\ || \\\\ \\\\___/ ||"); mvwprintw(dis, 6-vOffset, 2, " || || \\\\===|| || \\\\ || \\\\ \\\\___/ ||");
@ -406,7 +410,7 @@ void renderRows(xmp_module_info *mi, xmp_frame_info *fi) {
else snprintf(vol, 4, "..."); else snprintf(vol, 4, "...");
char f1; char f1;
if ((f1 = getEffectType(event.fxt)) != 0) snprintf(efx, 4, "%c%02X", f1, event.fxp); if ((f1 = effects[event.fxt]) != NULL) snprintf(efx, 4, "%c%02X", f1, event.fxp);
else snprintf(efx, 4, "..."); else snprintf(efx, 4, "...");
sprintf(lnbuf, "|%s %s %s %s", note, ins, vol, efx); sprintf(lnbuf, "|%s %s %s %s", note, ins, vol, efx);
for (int z = 0; z < chnsize; z++) { for (int z = 0; z < chnsize; z++) {
@ -465,38 +469,228 @@ void renderInstruments(xmp_module_info *mi, xmp_frame_info *fi) {
} }
} }
char getEffectType(int i) { void generateEffectsTable(xmp_module *xm) {
// The effect type characters are so strange to me. if (isPartOf(xm->type, "669")) {
// They make absolutely no sense in why it's set up this way. effects[96] = 'A';
// Maybe I'm mega stupid right now but this is all of the IT effects[97] = 'B';
// formats effects, so maybe this will cover everything enough. effects[98] = 'C';
// Broken, but not crashy-broken anymore. effects[99] = 'D';
switch(i) { effects[100] = 'E';
case 1: return 'F'; effects[126] = 'F';
case 2: return 'E'; } else if (isPartOf(xm->type, "Farandole")) {
case 3: return 'G'; effects[249] = '1';
case 4: return 'H'; effects[248] = '2';
case 5: return 'L'; effects[122] = '3';
case 6: return 'K'; effects[251] = '4';
case 7: return 'R'; effects[254] = '5';
case 8: return 'X'; effects[4] = '6';
case 9: return 'O'; effects[256] = '7';
case 10: return 'D'; effects[252] = '8';
case 11: return 'B'; effects[123] = '9';
case 16: return 'V'; effects[250] = 'C';
case 17: return 'W'; effects[15] = 'F';
case 27: return 'Q'; } else if (isPartOf(xm->type, "Imago Orpheus")) {
case 29: return 'I'; effects[1] = '1';
case 128: return 'M'; effects[2] = '2';
case 129: return 'N'; effects[3] = '3';
case 132: return 'Z'; effects[4] = '4';
case 135: return 'T'; effects[5] = '5';
case 137: return 'P'; effects[6] = '6';
case 138: return 'Y'; effects[7] = '7';
case 142: return 'C'; effects[8] = '8';
case 163: return 'A'; effects[9] = '9';
case 172: return 'U'; effects[10] = 'A';
case 180: return 'J'; effects[11] = 'B';
default: return 0x00; effects[12] = 'C';
effects[13] = 'D';
effects[14] = 'E';
effects[15] = 'F';
effects[16] = 'G';
effects[17] = 'H';
effects[18] = 'I';
effects[19] = 'J';
effects[20] = 'K';
effects[21] = 'L';
effects[22] = 'M';
effects[23] = 'N';
effects[24] = 'O';
effects[25] = 'P';
effects[26] = 'Q';
effects[27] = 'R';
effects[28] = 'S';
effects[29] = 'T';
effects[30] = 'U';
effects[31] = 'V';
effects[32] = 'W';
effects[33] = 'X';
effects[34] = 'Y';
effects[35] = 'Z';
} else if (isPartOf(xm->type, "S3M")) {
effects[163] = 'A';
effects[11] = 'B';
effects[13] = 'C';
effects[10] = 'D';
effects[2] = 'E';
effects[1] = 'F';
effects[3] = 'G';
effects[4] = 'H';
effects[29] = 'I';
effects[180] = 'J';
effects[6] = 'K';
effects[5] = 'L';
effects[9] = 'O';
effects[27] = 'Q';
effects[7] = 'R';
effects[254] = 'S';
effects[171] = 'T';
effects[172] = 'U';
effects[16] = 'V';
effects[8] = 'X';
effects[141] = 'X';
effects[14] = 'S';
} else if (isPartOf(xm->type, "IT")) {
effects[163] = 'A';
effects[11] = 'B';
effects[142] = 'C';
effects[10] = 'D';
effects[2] = 'E';
effects[1] = 'F';
effects[3] = 'G';
effects[4] = 'H';
effects[29] = 'I';
effects[180] = 'J';
effects[6] = 'K';
effects[5] = 'L';
effects[128] = 'M';
effects[129] = 'N';
effects[9] = 'O';
effects[137] = 'P';
effects[27] = 'Q';
effects[7] = 'R';
effects[254] = 'S';
effects[135] = 'T';
effects[172] = 'U';
effects[16] = 'V';
effects[17] = 'W';
effects[8] = 'X';
effects[138] = 'Y';
effects[141] = 'S';
effects[136] = 'S';
effects[14] = 'S';
effects[192] = 'c';
effects[193] = 'd';
effects[194] = 'a';
effects[195] = 'b';
effects[132] = 'S';
effects[139] = 'S';
effects[140] = 'S';
} else if (isPartOf(xm->type, "LIQ")) {
effects[0] = 'A';
effects[171] = 'B';
effects[13] = 'C';
effects[2] = 'D';
effects[172] = 'F';
effects[11] = 'J';
effects[10] = 'L';
effects[14] = 'M';
effects[3] = 'N';
effects[9] = 'O';
effects[163] = 'S';
effects[7] = 'T';
effects[1] = 'U';
effects[4] = 'V';
effects[5] = 'X';
effects[6] = 'Y';
} else if (isPartOf(xm->type, "Oktalyzer")) {
effects[1] = '1';
effects[2] = '2';
effects[112] = '0';
effects[113] = '0';
effects[114] = '0';
effects[115] = '6';
effects[116] = '5';
effects[156] = '6';
effects[11] = 'B';
effects[15] = 'F';
effects[157] = '5';
effects[12] = 'C';
effects[10] = 'A';
effects[174] = 'E';
effects[17] = 'E';
effects[0] = '0';
} else if (isPartOf(xm->type, "STX")) {
effects[15] = 'A';
effects[11] = 'B';
effects[13] = 'C';
effects[10] = 'D';
effects[2] = 'E';
effects[1] = 'F';
effects[3] = 'G';
effects[4] = 'H';
effects[29] = 'I';
effects[0] = 'J';
} else if (isPartOf(xm->type, "Funk")) {
effects[121] = 'A';
effects[120] = 'B';
effects[122] = 'C';
effects[123] = 'D';
effects[124] = 'G';
effects[125] = 'H';
effects[0] = 'L';
effects[12] = 'N';
effects[127] = 'O';
effects[14] = 'O';
effects[15] = 'O';
} else {
effects[0] = '0';
effects[1] = '1';
effects[2] = '2';
effects[3] = '3';
effects[4] = '4';
effects[5] = '5';
effects[6] = '6';
effects[7] = '7';
effects[8] = '8';
effects[9] = '9';
effects[10] = 'A';
effects[11] = 'B';
effects[12] = 'C';
effects[13] = 'D';
effects[14] = 'E';
effects[15] = 'F';
effects[16] = 'G';
effects[27] = 'Q';
effects[181] = 'P';
effects[17] = 'H';
effects[21] = 'L';
effects[164] = 'c';
effects[33] = 'X';
effects[20] = 'K';
effects[25] = 'P';
effects[29] = 'T';
effects[146] = '4';
effects[160] = 'x';
effects[161] = 'x';
effects[171] = 'F';
} }
} }
bool isPartOf(char* w1, char* w2) {
int i=0;
int j=0;
while(w1[i]!='\0'){
if(w1[i] == w2[j]) {
int init = i;
while (w1[i] == w2[j] && w2[j]!='\0') {
j++;
i++;
}
if(w2[j]=='\0') {
return true;
}
j=0;
}
i++;
}
return false;
}