summaryrefslogtreecommitdiffstats
path: root/apps/plugins/midi2wav.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/midi2wav.c')
-rw-r--r--apps/plugins/midi2wav.c231
1 files changed, 117 insertions, 114 deletions
diff --git a/apps/plugins/midi2wav.c b/apps/plugins/midi2wav.c
index 6dc7a626b5..241d56defb 100644
--- a/apps/plugins/midi2wav.c
+++ b/apps/plugins/midi2wav.c
@@ -20,21 +20,22 @@
#define MAX_VOICES 100
-//Only define LOCAL_DSP on Simulator or else we're asking for trouble
+/* Only define LOCAL_DSP on Simulator or else we're asking for trouble */
#if defined(SIMULATOR)
- //Enable this to write to the soundcard via a /dsv/dsp symlink in /
-// #define LOCAL_DSP
+ /*Enable this to write to the soundcard via a /dsv/dsp symlink in */
+// #define LOCAL_DSP
#endif
#if defined(LOCAL_DSP)
-// This is for writing to the DSP directly from the Simulator
+/* This is for writing to the DSP directly from the Simulator */
#include <stdio.h>
#include <stdlib.h>
#include <linux/soundcard.h>
#include <sys/ioctl.h>
#endif
+#include "../../firmware/export/system.h"
#include "../../plugin.h"
@@ -53,9 +54,9 @@ long bpm;
-int fd=-1; //File descriptor where the output is written
+int fd=-1; /* File descriptor where the output is written */
-extern long tempo; //The sequencer keeps track of this
+extern long tempo; /* The sequencer keeps track of this */
struct plugin_api * rb;
@@ -66,27 +67,28 @@ struct plugin_api * rb;
enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
{
- TEST_PLUGIN_API(api);
- rb = api;
- TEST_PLUGIN_API(api);
- (void)parameter;
- rb = api;
-
- if(parameter == NULL)
- {
- rb->splash(HZ*2, true, " Play .MID file ");
- return PLUGIN_OK;
- }
- rb->splash(HZ, true, parameter);
- if(midimain(parameter) == -1)
- {
- return PLUGIN_ERROR;
- }
- rb->splash(HZ*3, true, "FINISHED PLAYING");
- return PLUGIN_OK;
+ TEST_PLUGIN_API(api);
+ rb = api;
+ TEST_PLUGIN_API(api);
+ (void)parameter;
+ rb = api;
+
+ if(parameter == NULL)
+ {
+ rb->splash(HZ*2, true, " Play .MID file ");
+ return PLUGIN_OK;
+ }
+
+ rb->splash(HZ, true, parameter);
+ if(midimain(parameter) == -1)
+ {
+ return PLUGIN_ERROR;
+ }
+ rb->splash(HZ*3, true, "FINISHED PLAYING");
+ return PLUGIN_OK;
}
-signed char outputBuffer[3000] IDATA_ATTR; //signed char.. gonna run out of iram ... !
+signed char outputBuffer[3000] IDATA_ATTR; /* signed char.. gonna run out of iram ... ! */
int currentSample IDATA_ATTR;
@@ -98,132 +100,133 @@ int outputSampleTwo IDATA_ATTR;
int midimain(void * filename)
{
- printf("\nHello.\n");
+ printf("\nHello.\n");
- rb->splash(HZ/5, true, "LOADING MIDI");
+ rb->splash(HZ/5, true, "LOADING MIDI");
- struct MIDIfile * mf = loadFile(filename);
+ struct MIDIfile * mf = loadFile(filename);
- rb->splash(HZ/5, true, "LOADING PATCHES");
- if (initSynth(mf, "/.rockbox/patchset/patchset.cfg", "/.rockbox/patchset/drums.cfg") == -1)
- {
- return -1;
- }
+ rb->splash(HZ/5, true, "LOADING PATCHES");
+ if (initSynth(mf, "/.rockbox/patchset/patchset.cfg", "/.rockbox/patchset/drums.cfg") == -1)
+ {
+ return -1;
+ }
-//This lets you hear the music through the sound card if you are on Simulator
-//Make a symlink, archos/dsp.raw and make it point to /dev/dsp or whatever
-//your sound device is.
+/*
+ * This lets you hear the music through the sound card if you are on Simulator
+ * Make a symlink, archos/dsp.raw and make it point to /dev/dsp or whatever
+ * your sound device is.
+ */
#if defined(LOCAL_DSP)
- fd=rb->open("/dsp.raw", O_WRONLY);
- int arg, status;
- int bit, samp, ch;
+ fd=rb->open("/dsp.raw", O_WRONLY);
+ int arg, status;
+ int bit, samp, ch;
- arg = 16; // sample size
- status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
- status = ioctl(fd, SOUND_PCM_READ_BITS, &arg);
- bit=arg;
+ arg = 16; /* sample size */
+ status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
+ status = ioctl(fd, SOUND_PCM_READ_BITS, &arg);
+ bit=arg;
- arg = 2; //Number of channels, 1=mono
- status = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg);
- status = ioctl(fd, SOUND_PCM_READ_CHANNELS, &arg);
- ch=arg;
+ arg = 2; /* Number of channels, 1=mono */
+ status = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg);
+ status = ioctl(fd, SOUND_PCM_READ_CHANNELS, &arg);
+ ch=arg;
- arg = SAMPLE_RATE; //Yeah. sampling rate
- status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
- status = ioctl(fd, SOUND_PCM_READ_RATE, &arg);
- samp=arg;
+ arg = SAMPLE_RATE; /* Yeah. sampling rate */
+ status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
+ status = ioctl(fd, SOUND_PCM_READ_RATE, &arg);
+ samp=arg;
#else
- file_info_struct file_info;
- file_info.samplerate = SAMPLE_RATE;
- file_info.infile = fd;
- file_info.channels = 2;
- file_info.bitspersample = 16;
- local_init("/miditest.tmp", "/miditest.wav", &file_info, rb);
- fd = file_info.outfile;
+ file_info_struct file_info;
+ file_info.samplerate = SAMPLE_RATE;
+ file_info.infile = fd;
+ file_info.channels = 2;
+ file_info.bitspersample = 16;
+ local_init("/miditest.tmp", "/miditest.wav", &file_info, rb);
+ fd = file_info.outfile;
#endif
- rb->splash(HZ/5, true, " Starting Playback ");
+ rb->splash(HZ/5, true, " I hope this works... ");
+ /*
+ * tick() will do one MIDI clock tick. Then, there's a loop here that
+ * will generate the right number of samples per MIDI tick. The whole
+ * MIDI playback is timed in terms of this value.. there are no forced
+ * delays or anything. It just produces enough samples for each tick, and
+ * the playback of these samples is what makes the timings right.
+ *
+ * This seems to work quite well.
+ */
- // tick() will do one MIDI clock tick. Then, there's a loop here that
- // will generate the right number of samples per MIDI tick. The whole
- // MIDI playback is timed in terms of this value.. there are no forced
- // delays or anything. It just produces enough samples for each tick, and
- // the playback of these samples is what makes the timings right.
- //
- // This seems to work quite well.
+ printf("\nOkay, starting sequencing");
- printf("\nOkay, starting sequencing");
+ currentSample=0; /* Sample counting variable */
+ outputBufferPosition = 0;
- currentSample=0; //Sample counting variable
- outputBufferPosition = 0;
+ bpm=mf->div*1000000/tempo;
+ numberOfSamples=SAMPLE_RATE/bpm;
- bpm=mf->div*1000000/tempo;
- numberOfSamples=SAMPLE_RATE/bpm;
+ /* Tick() will return 0 if there are no more events left to play */
+ while(tick(mf))
+ {
+ /*
+ * Tempo recalculation moved to sequencer.c to be done on a tempo event only
+ *
+ */
+ for(currentSample=0; currentSample<numberOfSamples; currentSample++)
+ {
+ synthSample(&outputSampleOne, &outputSampleTwo);
- //Tick() will return 0 if there are no more events left to play
- while(tick(mf))
- {
- //Some annoying math to compute the number of samples
- //to syntehsize per each MIDI tick.
+ /*
+ * 16-bit audio because, well, it's better
+ * But really because ALSA's OSS emulation sounds extremely
+ * noisy and distorted when in 8-bit mode. I still do not know
+ * why this happens.
+ */
- //Yes we need to do this math each time because the tempo
- //could have changed.
+ outputBuffer[outputBufferPosition]=outputSampleOne&0XFF; // Low byte first
+ outputBufferPosition++;
+ outputBuffer[outputBufferPosition]=outputSampleOne>>8; //High byte second
+ outputBufferPosition++;
- // On second thought, this can be moved to the event that
- //recalculates the tempo, to save a little bit of CPU time.
- for(currentSample=0; currentSample<numberOfSamples; currentSample++)
- {
+ outputBuffer[outputBufferPosition]=outputSampleTwo&0XFF; // Low byte first
+ outputBufferPosition++;
+ outputBuffer[outputBufferPosition]=outputSampleTwo>>8; //High byte second
+ outputBufferPosition++;
- synthSample(&outputSampleOne, &outputSampleTwo);
+ /*
+ * As soon as we produce 2000 bytes of sound,
+ * write it to the sound card. Why 2000? I have
+ * no idea. It's 1 AM and I am dead tired.
+ */
+ if(outputBufferPosition>=2000)
+ {
+ rb->write(fd, outputBuffer, 2000);
+ outputBufferPosition=0;
+ }
+ }
+ }
- //16-bit audio because, well, it's better
- // But really because ALSA's OSS emulation sounds extremely
- //noisy and distorted when in 8-bit mode. I still do not know
- //why this happens.
- outputBuffer[outputBufferPosition]=outputSampleOne&0XFF; // Low byte first
- outputBufferPosition++;
- outputBuffer[outputBufferPosition]=outputSampleOne>>8; //High byte second
- outputBufferPosition++;
-
- outputBuffer[outputBufferPosition]=outputSampleTwo&0XFF; // Low byte first
- outputBufferPosition++;
- outputBuffer[outputBufferPosition]=outputSampleTwo>>8; //High byte second
- outputBufferPosition++;
-
-
- //As soon as we produce 2000 bytes of sound,
- //write it to the sound card. Why 2000? I have
- //no idea. It's 1 AM and I am dead tired.
- if(outputBufferPosition>=2000)
- {
- rb->write(fd, outputBuffer, 2000);
- outputBufferPosition=0;
- }
- }
- }
-
-// unloadFile(mf);
- printf("\n");
+ printf("\n");
#if !defined(LOCAL_DSP)
- close_wav(&file_info);
+ close_wav(&file_info);
#else
- rb->close(fd);
+ rb->close(fd);
#endif
- return 0;
+ return 0;
}