Fix effects and add Ins/Smp name view
This commit is contained in:
parent
0b2afd5b92
commit
726f1476a2
314
src/main.cpp
314
src/main.cpp
|
@ -2,10 +2,12 @@
|
|||
#include <iostream>
|
||||
#include <cstdlib>
|
||||
#include <stdio.h>
|
||||
#include <map>
|
||||
|
||||
#include <alsa/asoundlib.h>
|
||||
#include <xmp.h>
|
||||
#include <ncurses.h>
|
||||
#include "trakker.h"
|
||||
#include "trakker_version.h"
|
||||
|
||||
#define SAMPLERATE 48000
|
||||
|
@ -25,19 +27,11 @@ int vOffset = 0;
|
|||
int looped = 0;
|
||||
bool stopped;
|
||||
bool loop;
|
||||
std::map<int, char> effects;
|
||||
|
||||
WINDOW *dis;
|
||||
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 err;
|
||||
snd_pcm_t *handle;
|
||||
|
@ -57,13 +51,11 @@ int main(int argc, char *argv[]) {
|
|||
if (xmp_load_module(xc, argv[1]) != 0) {
|
||||
fprintf(stderr, "Failed to load Module: %s\n", argv[1]);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
} else printf("Loaded Module: \"%s\"\n", argv[1]);
|
||||
|
||||
struct xmp_module_info xmi;
|
||||
struct xmp_frame_info xfi;
|
||||
|
||||
printf("Loading Module: \"%s\"\n", argv[1]);
|
||||
|
||||
initscr();
|
||||
|
||||
if (has_colors() == TRUE) {
|
||||
|
@ -141,6 +133,7 @@ int main(int argc, char *argv[]) {
|
|||
int row, pos;
|
||||
xmp_get_module_info(xc, &xmi);
|
||||
row = pos = -1;
|
||||
generateEffectsTable(xmi.mod);
|
||||
xmp_start_player(xc, SAMPLERATE, 0);
|
||||
|
||||
int key;
|
||||
|
@ -176,6 +169,12 @@ int main(int argc, char *argv[]) {
|
|||
case KEY_DOWN: // Seek Down
|
||||
if (vOffset < vMax) vOffset++;
|
||||
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:
|
||||
hOffset = 0;
|
||||
vOffset = 0;
|
||||
|
@ -280,6 +279,7 @@ void createWindows() {
|
|||
|
||||
void renderTrack(xmp_module_info *mi, xmp_frame_info *fi) {
|
||||
werase(dis);
|
||||
wclrtoeol(tab);
|
||||
mvwprintw(tab, 0, 1, mi->mod->name);
|
||||
mvwprintw(
|
||||
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, 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) {
|
||||
renderInfo(mi, fi);
|
||||
} 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) {
|
||||
wattron(dis, A_BOLD);
|
||||
mvwprintw(dis, 3-vOffset, 0, "Format:");
|
||||
mvwprintw(dis, 4-vOffset, 0, "Instruments:");
|
||||
mvwprintw(dis, 5-vOffset, 0, "Channels:");
|
||||
mvwprintw(dis, 6-vOffset, 0, "Looping:");
|
||||
mvwprintw(dis, 8-vOffset, 0, "Comments:");
|
||||
mvwprintw(dis, 1-vOffset, 1, "Format:");
|
||||
mvwprintw(dis, 2-vOffset, 1, "Channels:");
|
||||
mvwprintw(dis, 3-vOffset, 1, "Looping:");
|
||||
mvwprintw(dis, 5-vOffset, 1, "Instruments:");
|
||||
mvwprintw(dis, (7+mi->mod->ins)-vOffset, 1, "Samples:");
|
||||
wattroff(dis, A_BOLD);
|
||||
|
||||
mvwprintw(dis, 3-vOffset, 16, mi->mod->type);
|
||||
mvwprintw(dis, 4-vOffset, 16, "%i", mi->mod->ins);
|
||||
mvwprintw(dis, 5-vOffset, 16, "%i", mi->mod->chn);
|
||||
mvwprintw(dis, 6-vOffset, 16, loop?"YES":"NO");
|
||||
mvwprintw(dis, 1-vOffset, 16, mi->mod->type);
|
||||
mvwprintw(dis, 2-vOffset, 16, "%i", mi->mod->chn);
|
||||
mvwprintw(dis, 3-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) {
|
||||
mvwprintw(dis, 9-vOffset, 0, "%s", mi->comment);
|
||||
for (int xi = 0; xi < mi->mod->ins; xi++) {
|
||||
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() {
|
||||
wattron(dis, A_BOLD);
|
||||
mvwprintw(dis, 1-vOffset, 2, "======== || // || //");
|
||||
mvwprintw(dis, 1-vOffset, 2, "======== \\\\ // \\\\ //");
|
||||
mvwprintw(dis, 2-vOffset, 2, " || || // || //");
|
||||
mvwprintw(dis, 3-vOffset, 2, " || ||// ||//");
|
||||
mvwprintw(dis, 3-vOffset, 2, " || \\\\// \\\\//");
|
||||
mvwprintw(dis, 4-vOffset, 2, " || //==\\\\ //===|| ||\\\\ ||\\\\ //===\\\\ //===\\\\");
|
||||
mvwprintw(dis, 5-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, "...");
|
||||
|
||||
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, "...");
|
||||
sprintf(lnbuf, "|%s %s %s %s", note, ins, vol, efx);
|
||||
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) {
|
||||
// The effect type characters are so strange to me.
|
||||
// They make absolutely no sense in why it's set up this way.
|
||||
// Maybe I'm mega stupid right now but this is all of the IT
|
||||
// formats effects, so maybe this will cover everything enough.
|
||||
// Broken, but not crashy-broken anymore.
|
||||
switch(i) {
|
||||
case 1: return 'F';
|
||||
case 2: return 'E';
|
||||
case 3: return 'G';
|
||||
case 4: return 'H';
|
||||
case 5: return 'L';
|
||||
case 6: return 'K';
|
||||
case 7: return 'R';
|
||||
case 8: return 'X';
|
||||
case 9: return 'O';
|
||||
case 10: return 'D';
|
||||
case 11: return 'B';
|
||||
case 16: return 'V';
|
||||
case 17: return 'W';
|
||||
case 27: return 'Q';
|
||||
case 29: return 'I';
|
||||
case 128: return 'M';
|
||||
case 129: return 'N';
|
||||
case 132: return 'Z';
|
||||
case 135: return 'T';
|
||||
case 137: return 'P';
|
||||
case 138: return 'Y';
|
||||
case 142: return 'C';
|
||||
case 163: return 'A';
|
||||
case 172: return 'U';
|
||||
case 180: return 'J';
|
||||
default: return 0x00;
|
||||
void generateEffectsTable(xmp_module *xm) {
|
||||
if (isPartOf(xm->type, "669")) {
|
||||
effects[96] = 'A';
|
||||
effects[97] = 'B';
|
||||
effects[98] = 'C';
|
||||
effects[99] = 'D';
|
||||
effects[100] = 'E';
|
||||
effects[126] = 'F';
|
||||
} else if (isPartOf(xm->type, "Farandole")) {
|
||||
effects[249] = '1';
|
||||
effects[248] = '2';
|
||||
effects[122] = '3';
|
||||
effects[251] = '4';
|
||||
effects[254] = '5';
|
||||
effects[4] = '6';
|
||||
effects[256] = '7';
|
||||
effects[252] = '8';
|
||||
effects[123] = '9';
|
||||
effects[250] = 'C';
|
||||
effects[15] = 'F';
|
||||
} else if (isPartOf(xm->type, "Imago Orpheus")) {
|
||||
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[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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user