-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwav2dat.cpp
187 lines (145 loc) · 5.02 KB
/
wav2dat.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#include <QCoreApplication>
#include <QString>
#include <QDebug>
#include <QFile>
#include <QFileInfo>
#include <QTextStream>
#include <QCommandLineParser>
#ifndef VERSION
#define VERSION "0.0.0"
#endif
QCommandLineOption argInfo (QStringList() << "info", QObject::tr("Print information about the file."));
QCommandLineOption argPrint (QStringList() << "print", QObject::tr("Print the output instead of writing to file."));
int main (int argc, char * argv[])
{
int rows = 8, cols = 64;
quint32 row = 0;
quint32 rowinc = 256/rows;
quint32 colinc = 512/cols;
QCoreApplication app(argc, argv);
QCoreApplication::setOrganizationName("LameStation LLC");
QCoreApplication::setOrganizationDomain("www.lamestation.com");
QCoreApplication::setApplicationVersion(VERSION);
QCoreApplication::setApplicationName(QObject::tr("wav2dat"));
QCommandLineParser parser;
parser.addHelpOption();
parser.addVersionOption();
parser.setApplicationDescription(
QObject::tr("\nConvert WAV files into LameAudio samples."));
parser.addOption(argPrint);
parser.addOption(argInfo);
parser.addPositionalArgument("file", QObject::tr("WAV file to convert"), "FILE");
parser.process(app);
quint32 c;
quint32 w;
quint32 samplecount = 0;
if (parser.positionalArguments().length() < 1)
{
qDebug() << "Error: Must provide filename of WAV file to convert (e.g. 'wav2dat organ.wav')";
return 1;
}
QString filename = parser.positionalArguments()[0];
QFileInfo fi(filename);
if (!fi.exists())
{
qDebug() << "Error: File does not exist!";
return 1;
}
if (fi.suffix() == "")
{
qDebug() << "Error: Must have a file extension.";
return 1;
}
if (fi.suffix().compare("wav", Qt::CaseInsensitive))
{
qDebug() << "Error: Must be a WAV file.";
return 1;
}
QString outputfilename = fi.path() + "/wav_" + fi.completeBaseName() + ".spin";
QFile infile(filename);
if (!infile.open(QIODevice::ReadOnly))
{
qDebug() << "Error reading input:" << filename;
return 1;
}
QByteArray input = infile.readAll();
quint32 datasize = input.size() - 44;
quint32 bitdepth = input[34];
quint32 sourcesamples = datasize/(bitdepth/8);
quint32 targetsamples = 512;
quint32 sampleinc = (sourcesamples << 8)/targetsamples;
if (parser.isSet(argInfo))
{
qDebug() << " file name:" << qPrintable(filename);
qDebug() << " output:" << qPrintable(outputfilename);
qDebug() << " file size:" << qPrintable(QString("%1B").arg(input.size()));
qDebug() << " data size:" << qPrintable(QString("%1B").arg(datasize));
qDebug() << " bit depth:" << qPrintable(QString("%1-bit").arg(bitdepth));
qDebug() << " src size:" << qPrintable(QString("%1B").arg(sourcesamples));
qDebug() << " dst size:" << qPrintable(QString("%1B").arg(targetsamples));
qDebug() << " sample inc:" << qPrintable(QString("%1.%2").arg(sampleinc >> 8).arg((sampleinc & 0xFF)*100/256));
}
// generate sample table
QList<quint32> samples;
for (quint32 i = 0; ((i >> 8) < sourcesamples) && (samplecount < targetsamples); i += (sourcesamples << 8)/targetsamples)
{
c = input[44 + (i >> 7) + 1]; // 8 bit = i >> 8
w = (qint8) c + 128;
samples.append(w);
samplecount++;
}
// generate output
QString output;
QTextStream stream(&output);
QFileInfo outfi(outputfilename);
// render header
stream << "' *" << QString(cols, '*') << "\n";
stream << "' " << outfi.fileName() << "\n"
<< "' generated by wav2dat v" << qApp->applicationVersion() << "\n";
stream << "' *" << QString(cols, '*') << "\n\n";
// render plot
stream << "' -" << QString(cols, '-') << "\n";
for (int i = 0; i < rows; i++)
{
QString p(cols, ' ');
for (int j = 0; j < samples.size(); j += colinc)
{
if ((samples[j] >= row) && (samples[j] < (row + rowinc)))
p[j / colinc] = 'o';//samples[j];
}
row += rowinc;
stream << "' |" << p << "\n";
}
stream << "' -" << QString(cols, '-') << "\n";
stream << "\n";
// render spin
stream << "PUB Addr\n"
<< " return @wav_data\n\n"
<< "DAT\n\n"
<< "wav_data\n";
for (int i = 0; i < 512; i++)
{
if (i % 16 == 0) stream << "\nbyte ";
stream << QString("%1").arg((quint8) samples[i], 3);
if (i % 16 != 15) stream << ", ";
}
stream << "\n";
// save output
if (!parser.isSet(argPrint))
{
QFile outfile(outputfilename);
if (!outfile.open(QIODevice::WriteOnly))
{
qDebug() << "Error writing output:" << outputfilename;
return 1;
}
QTextStream outstream(&outfile);
outstream << output;
outfile.close();
}
else
{
qDebug() << qPrintable(output);
}
return 0;
}