From a51a24974fc1040acc9d088b8732bb86e111271e Mon Sep 17 00:00:00 2001 From: PoroCYon Date: Fri, 10 May 2019 23:43:28 +0200 Subject: [PATCH 1/4] make player code portable --- player/oidos.asm | 134 +++++++++++++++++++++++--------------------- player/oidos.h | 15 +++-- player/oidos.inc | 24 ++++---- player/platform.inc | 23 ++++++++ player/play.asm | 2 + player/play.c | 15 +++++ player/random.asm | 28 ++++----- 7 files changed, 151 insertions(+), 90 deletions(-) create mode 100644 player/platform.inc create mode 100644 player/play.c diff --git a/player/oidos.asm b/player/oidos.asm index 9b6e968..62fdf7d 100644 --- a/player/oidos.asm +++ b/player/oidos.asm @@ -9,28 +9,33 @@ ; Set to 0 if you don't care about Oidos_GenerateMusic preserving registers %define OIDOS_SAVE_REGISTERS 1 -%include "music.asm" +%include "platform.inc" +%include "music.asm" ;; ********** Definitions ********** -global _Oidos_GenerateMusic -global _Oidos_StartMusic -global _Oidos_GetPosition +global PUBLIC_FN(Oidos_GenerateMusic) +%ifdef WIN32 +global PUBLIC_FN(Oidos_StartMusic) +global PUBLIC_FN(Oidos_GetPosition) +%endif -global _Oidos_MusicBuffer -global _Oidos_TicksPerSecond -global _Oidos_MusicLength -global _Oidos_WavFileHeader +global PUBLIC_FN(Oidos_MusicBuffer) +global PUBLIC_FN(Oidos_TicksPerSecond) +global PUBLIC_FN(Oidos_MusicLength) +global PUBLIC_FN(Oidos_WavFileHeader) +%ifdef WIN32 extern __imp__waveOutOpen@24 extern __imp__waveOutPrepareHeader@12 extern __imp__waveOutWrite@12 extern __imp__waveOutGetPosition@12 +%endif -extern _Oidos_RandomData +extern PUBLIC_FN(Oidos_RandomData) %define SAMPLE_RATE 44100 %define BASE_FREQ 0.00232970791933 ; 440/((2^(1/12))^(9+12*4))/44100*(2*3.14159265358979) @@ -38,21 +43,21 @@ extern _Oidos_RandomData ;; ********** Public variables ********** -section tps rdata align=4 -_Oidos_TicksPerSecond: +SECT_RDATA(tps) align=4 +PUBLIC_FN(Oidos_TicksPerSecond): dd TICKS_PER_SECOND -section muslen rdata align=4 -_Oidos_MusicLength: +SECT_DATA(muslen) align=4 +PUBLIC_FN(Oidos_MusicLength): dd MUSIC_LENGTH -section MusBuf bss align=4 -_Oidos_MusicBuffer: -.align24 +SECT_BSS(MusBuf) align=4 +PUBLIC_FN(Oidos_MusicBuffer): +;.align24 resw TOTAL_SAMPLES*2 -section WavFile rdata align=4 -_Oidos_WavFileHeader: +SECT_DATA(WavFile) align=4 +PUBLIC_FN(Oidos_WavFileHeader): db "RIFF" dd 36+TOTAL_SAMPLES*4 db "WAVE" @@ -68,53 +73,53 @@ _Oidos_WavFileHeader: ;; ********** System structures ********** -section WaveForm rdata align=1 -_WaveFormat: +SECT_DATA(WaveForm) align=1 +WaveFormat: dw 1,2 dd SAMPLE_RATE dd SAMPLE_RATE*4 dw 4,16,0 -section WaveHdr data align=4 -_WaveHdr: - dd _Oidos_MusicBuffer +SECT_DATA(WaveHdr) align=4 +WaveHdr: + dd PUBLIC_FN(Oidos_MusicBuffer) dd (TOTAL_SAMPLES*4) dd 0,0,0,0,0,0 -section wavehand bss align=4 -_WaveOutHandle: -.align16 +SECT_BSS(wavehand) align=4 +WaveOutHandle: +.align16: resd 1 -section WaveTime data align=4 -_WaveTime: +SECT_DATA(WaveTime) align=4 +WaveTime: dd 4,0,0,0,0,0,0,0 ;; ********** Internal buffers ********** -section freqarr bss align=16 +SECT_BSS(freqarr) align=16 PartialArray: .align16: resq 10000*3*2 -section sampbuf bss align=16 +SECT_BSS(sampbuf) align=16 SampleBuffer: .align24: reso MAX_TOTAL_INSTRUMENT_SAMPLES -section mixbuf bss align=16 +SECT_BSS(mixbuf) align=16 MixingBuffer: .align24: reso TOTAL_SAMPLES %if NUM_TRACKS_WITH_REVERB > 0 -section revbuf bss align=16 +SECT_BSS(revbuf) align=16 ReverbBuffer: .align24: reso TOTAL_SAMPLES -section delbuf bss align=8 +SECT_BSS(delbuf) align=8 DelayBuffer: .align16: resq 25600 @@ -150,7 +155,7 @@ struc params ;; ********** Internal constants and tables ********** -section base data align=16 +SECT_DATA(base) align=16 baseptr: c_oneone: dq 1.0,1.0 @@ -168,11 +173,11 @@ ReverbParams: dd REVERB_FILTER_HIGH, REVERB_FILTER_LOW, REVERB_DAMPEN_HIGH, REVERB_DAMPEN_LOW, REVERB_VOLUME_LEFT %endif -ParamsPtr: dd _InstrumentParams -TonesPtr: dd _InstrumentTones -TovelPtr: dd _TrackData -LengthPtr: dd _NoteLengths -NotePtr: dd _NoteSamples +ParamsPtr: dd InstrumentParams +TonesPtr: dd InstrumentTones +TovelPtr: dd TrackData +LengthPtr: dd NoteLengths +NotePtr: dd NoteSamples MixingPtr: dd 0 %if NUM_TRACKS_WITH_REVERB > 0 @@ -180,11 +185,11 @@ ReverbState: dq 0.0,0.0,0.0,0.0 %endif -section offset rdata align=4 +SECT_RDATA(offset) align=4 c_timeoffset: dd OIDOS_TIMER_OFFSET*4 -section tempo rdata align=4 +SECT_RDATA(tempo) align=4 c_ticklength: dd SAMPLES_PER_TICK*4 @@ -233,7 +238,7 @@ c_ticklength: ;; ********** Instrument calculation ********** -section makeinst text align=1 +SECT_TEXT(makeinst) align=1 MakeInstrument: mov PARAMS, [BASE + ParamsPtr] @@ -255,7 +260,7 @@ MakeInstrument: add RANDOM, [PARAMS] ; seed add PARAMS, byte 4 shl RANDOM, 2 - add RANDOM, _Oidos_RandomData + add RANDOM, PUBLIC_FN(Oidos_RandomData) GETRANDOM ; subtone fabs @@ -437,7 +442,7 @@ MakeInstrument: ;; ********** Track mixing ********** - section makechan text align=1 +SECT_TEXT(makechan) align=1 MakeChannel: mov SAMPLE, SampleBuffer push byte 0 @@ -589,8 +594,8 @@ MakeChannel: ;; ********** Main ********** -section synth text align=1 -_Oidos_GenerateMusic: +SECT_TEXT(synth) align=1 +PUBLIC_FN(Oidos_GenerateMusic): %if OIDOS_SAVE_REGISTERS pusha %endif @@ -615,7 +620,7 @@ _Oidos_GenerateMusic: %if REVERB_MIN_DELAY != 0 sub eax, REVERB_MIN_DELAY %endif - mul dword [_Oidos_RandomData + REVERB_RANDOMSEED*4 + ecx*4] + mul dword [PUBLIC_FN(Oidos_RandomData) + REVERB_RANDOMSEED*4 + ecx*4] cmp edx, esi jae short .skip @@ -692,7 +697,7 @@ _Oidos_GenerateMusic: fcmovnb st0, st1 fchs - fistp word [_Oidos_MusicBuffer + ebx*2] + fistp word [PUBLIC_FN(Oidos_MusicBuffer) + ebx*2] add ebx, byte 1 cmp ebx, TOTAL_SAMPLES*2 @@ -704,7 +709,7 @@ _Oidos_GenerateMusic: %endif ret -section rfilter text align=1 +SECT_TEXT(rfilter) align=1 ReverbFilter: %macro FILTER 0 ; Basic low-pass filter @@ -731,40 +736,43 @@ ReverbFilter: ret -;; ********** Play ********** +; ********** Play ********** -section startsnd text align=1 -_Oidos_StartMusic: +%ifdef WIN32 +SECT_TEXT(startsnd) align=1 +PUBLIC_FN(Oidos_StartMusic): ; Start music push byte 0 push byte 0 push byte 0 - push _WaveFormat + push WaveFormat push byte -1 - push _WaveOutHandle + push WaveOutHandle call [__imp__waveOutOpen@24] push byte 32 ; sizeof(WAVEHDR) - push _WaveHdr - push dword [_WaveOutHandle] ; waveOutHandle + push WaveHdr + push dword [WaveOutHandle] ; waveOutHandle call [__imp__waveOutPrepareHeader@12] push byte 32 ; sizeof(WAVEHDR) - push _WaveHdr - push dword [_WaveOutHandle] + push WaveHdr + push dword [WaveOutHandle] call [__imp__waveOutWrite@12] ret -section getpos text align=1 -_Oidos_GetPosition: +SECT_TEXT(getpos) align=1 +PUBLIC_FN(Oidos_GetPosition): push byte 32 ; sizeof(MMTIME) - push _WaveTime - push dword [_WaveOutHandle] + push WaveTime + push dword [WaveOutHandle] call [__imp__waveOutGetPosition@12] - fild dword [_WaveTime+4] + fild dword [WaveTime+4] %if OIDOS_TIMER_OFFSET>0 fiadd dword [c_timeoffset] %endif fidiv dword [c_ticklength] ret +%endif + diff --git a/player/oidos.h b/player/oidos.h index c29457c..5fafeff 100644 --- a/player/oidos.h +++ b/player/oidos.h @@ -1,11 +1,15 @@ #ifndef _OIDOS_H_ #define _OIDOS_H_ +#include + struct sample { short left,right; }; +#ifdef __cplusplus extern "C" { +#endif // Fill the block of random data used by Oidos. // Must be called before Oidos_GenerateMusic. void Oidos_FillRandomData(); @@ -15,6 +19,9 @@ extern "C" { // and Oidos_StartMusic can be called. void Oidos_GenerateMusic(); + // On Linux, there are too many sound APIs to choose from, + // so I can't just force anyone to use a specific one. -pcy +#ifdef WIN32 // Play the music void Oidos_StartMusic(); @@ -22,6 +29,7 @@ extern "C" { // Use this function as the timer for the visuals in your intro. // Returned value is measured in music ticks (pattern rows). float Oidos_GetPosition(); +#endif // Buffer containing the music. extern struct sample Oidos_MusicBuffer[]; @@ -41,11 +49,10 @@ extern "C" { // Can also be useful as a 3D noise texture. #define NOISESIZE 64 extern unsigned Oidos_RandomData[NOISESIZE * NOISESIZE * NOISESIZE]; +#ifdef __cplusplus }; - -// If you are using D3D11, you can re-use this GUID. -#ifdef GUID_DEFINED -extern GUID ID3D11Texture2D_ID; #endif +extern uint32_t ID3D11Texture2D_ID[4]; + #endif diff --git a/player/oidos.inc b/player/oidos.inc index 7cafc83..e460b2c 100644 --- a/player/oidos.inc +++ b/player/oidos.inc @@ -1,17 +1,21 @@ ; See oidos.h for documentation. +%include "platform.inc" + ; Functions -extern _Oidos_FillRandomData -extern _Oidos_GenerateMusic -extern _Oidos_StartMusic -extern _Oidos_GetPosition +extern PUBLIC_FN(Oidos_FillRandomData) +extern PUBLIC_FN(Oidos_GenerateMusic) +extern PUBLIC_FN(Oidos_StartMusic) +extern PUBLIC_FN(Oidos_GetPosition) ; Variables -extern _Oidos_MusicBuffer -extern _Oidos_TicksPerSecond -extern _Oidos_MusicLength -extern _Oidos_WavFileHeader -extern _Oidos_RandomData +extern PUBLIC_FN(Oidos_MusicBuffer) +extern PUBLIC_FN(Oidos_TicksPerSecond) +extern PUBLIC_FN(Oidos_MusicLength) +extern PUBLIC_FN(Oidos_WavFileHeader) +extern PUBLIC_FN(Oidos_RandomData) ; GUID -extern ?ID3D11Texture2D_ID@@3U_GUID@@A +extern ID3D11Texture2D_ID + +; vim: set ft=asm diff --git a/player/platform.inc b/player/platform.inc new file mode 100644 index 0000000..41f633b --- /dev/null +++ b/player/platform.inc @@ -0,0 +1,23 @@ + +%ifdef LINUX +%define PUBLIC_FN(n) n +%else +%define PUBLIC_FN(n) _ %+ n +%endif + +%ifdef WIN32 +%define ID3D11Texture2D_ID ?ID3D11Texture2D_ID@@3U_GUID@@A +%endif + +%ifdef LINUX +%define SECT_BSS(n) section .bss.oidos. %+ n nobits alloc noexec write +%define SECT_DATA(n) section .data.oidos. %+ n progbits alloc noexec write +%define SECT_RDATA(n) section .rodata.oidos. %+ n progbits alloc noexec nowrite +%define SECT_TEXT(n) section .text.oidos. %+ n progbits alloc exec nowrite +%else +%define SECT_BSS(n) section .oidos. %+ n bss +%define SECT_DATA(n) section .oidos. %+ n data +%define SECT_RDATA(n) section .oidos. %+ n rdata +%define SECT_TEXT(n) section .oidos. %+ n code +%endif + diff --git a/player/play.asm b/player/play.asm index 6d3b594..6defac6 100644 --- a/player/play.asm +++ b/player/play.asm @@ -1,5 +1,7 @@ ; Stand-alone executable for playing an Oidos song. +; (Windows-only) + %include "oidos.inc" global _main diff --git a/player/play.c b/player/play.c new file mode 100644 index 0000000..43413c9 --- /dev/null +++ b/player/play.c @@ -0,0 +1,15 @@ + +#include + +#include "oidos.h" + +int main() { + Oidos_FillRandomData(); + Oidos_GenerateMusic(); + +#ifndef NO_WAV_HEADER + write(STDOUT_FILENO, Oidos_WavFileHeader, sizeof(Oidos_WavFileHeader)); +#endif + write(STDOUT_FILENO, Oidos_MusicBuffer, Oidos_WavFileHeader[10]); +} + diff --git a/player/random.asm b/player/random.asm index 8a62fc2..465e2ea 100644 --- a/player/random.asm +++ b/player/random.asm @@ -1,30 +1,32 @@ ; Block of random data used by Oidos. ; Can also be useful as a 3D noise texture. -global _Oidos_FillRandomData -global _Oidos_RandomData -global ?ID3D11Texture2D_ID@@3U_GUID@@A +%include "platform.inc" + +global PUBLIC_FN(Oidos_FillRandomData) +global PUBLIC_FN(Oidos_RandomData) +global ID3D11Texture2D_ID %define NOISESIZE 64 - section guid data align=4 +SECT_DATA(d3dtex) align=4 ; If you are using D3D11, you can re-use this GUID. -?ID3D11Texture2D_ID@@3U_GUID@@A: +; It's used as a rng seed, so this can't simply be thrown out on Linux -pcy +ID3D11Texture2D_ID: db 0xF2,0xAA,0x15,0x6F, 0x08,0xD2,0x89,0x4E, 0x9A,0xB4,0x48,0x95, 0x35,0xD3,0x4F,0x9C - section randdata bss align=4 +SECT_BSS(randomdat) align=4 -_Oidos_RandomData: -.align16 +PUBLIC_FN(Oidos_RandomData): resd NOISESIZE*NOISESIZE*NOISESIZE - section fillrand text align=1 +SECT_TEXT(fillrandom) align=1 -_Oidos_FillRandomData: - mov eax, _Oidos_RandomData +PUBLIC_FN(Oidos_FillRandomData): + mov eax, PUBLIC_FN(Oidos_RandomData) .loop: - mov edx, ?ID3D11Texture2D_ID@@3U_GUID@@A + mov edx, ID3D11Texture2D_ID mov ecx, [edx] ror ecx, cl @@ -49,6 +51,6 @@ _Oidos_FillRandomData: xor [eax], ecx add eax, byte 4 - cmp eax, _Oidos_RandomData+NOISESIZE*NOISESIZE*NOISESIZE*4 + cmp eax, PUBLIC_FN(Oidos_RandomData)+NOISESIZE*NOISESIZE*NOISESIZE*4 jb .loop ret From 50214728fcbbbef5e8e6d6918c72082a11299946 Mon Sep 17 00:00:00 2001 From: PoroCYon Date: Fri, 10 May 2019 23:44:24 +0200 Subject: [PATCH 2/4] make converter code portable --- convert/{OidosConvert.py => oidosconvert.py} | 26 +-- convert/{OidosUpgrade.py => oidosupgrade.py} | 208 +++++++++---------- convert/{XML.py => oidosxml.py} | 2 +- convert/py2exe_setup.py | 2 +- 4 files changed, 119 insertions(+), 119 deletions(-) rename convert/{OidosConvert.py => oidosconvert.py} (98%) rename convert/{OidosUpgrade.py => oidosupgrade.py} (93%) rename convert/{XML.py => oidosxml.py} (99%) diff --git a/convert/OidosConvert.py b/convert/oidosconvert.py similarity index 98% rename from convert/OidosConvert.py rename to convert/oidosconvert.py index 54c6288..dd1d80f 100755 --- a/convert/OidosConvert.py +++ b/convert/oidosconvert.py @@ -1,8 +1,8 @@ -#!/usr/bin/env python +#!/usr/bin/env python2 import sys import zipfile -import XML +import oidosxml import struct import ctypes import math @@ -483,8 +483,8 @@ def roundup(v): self.out += "\n%define USES_PANNING\n" # Instrument parameters - self.out += "\n\n\tsection iparam data align=4\n" - self.out += "\n_InstrumentParams:\n" + self.out += "\n\n\tSECT_DATA(iparam) align=4\n" + self.out += "\nInstrumentParams:\n" for instr in self.instruments: self.label(".i%02d" % instr.number) self.comment(instr.title) @@ -502,8 +502,8 @@ def roundup(v): self.out += "\n" # Instrument tones - self.out += "\n\n\tsection itones data align=1\n" - self.out += "\n_InstrumentTones:\n" + self.out += "\n\n\tSECT_DATA(itones) align=1\n" + self.out += "\nInstrumentTones:\n" for instr in self.instruments: self.label(".i%02d" % instr.number) self.comment(instr.title) @@ -516,8 +516,8 @@ def roundup(v): self.out += "%d\n" % (-129 + instr.columns) # Track data - self.out += "\n\n\tsection trdata data align=1\n" - self.out += "\n_TrackData:\n" + self.out += "\n\n\tSECT_DATA(trdata) align=1\n" + self.out += "\nTrackData:\n" for ti in self.track_order: track = self.tracks[ti] instr = self.instrument_map[track.instr] @@ -537,13 +537,13 @@ def roundup(v): self.dataline(tavdata) # Lengths of notes - self.out += "\n\tsection notelen data align=1\n" - self.out += "\n_NoteLengths:\n" + self.out += "\n\tSECT_DATA(notelen) align=1\n" + self.out += "\nNoteLengths:\n" self.notelist(self.lendata, [0], "L_") # Samples for notes - self.out += "\n\tsection notesamp data align=1\n" - self.out += "\n_NoteSamples:\n" + self.out += "\n\tSECT_DATA(notesamp) align=1\n" + self.out += "\nNoteSamples:\n" self.notelist(self.samdata, [], "S_") return self.out @@ -912,7 +912,7 @@ def writefile(filename, s): infile = files[0] outfile = files[1] -x = XML.makeXML(zipfile.ZipFile(infile).read("Song.xml")) +x = oidosxml.makeXML(zipfile.ZipFile(infile).read("Song.xml")) try: music = makeMusic(x.RenoiseSong) print diff --git a/convert/OidosUpgrade.py b/convert/oidosupgrade.py similarity index 93% rename from convert/OidosUpgrade.py rename to convert/oidosupgrade.py index b96eb84..8c92580 100755 --- a/convert/OidosUpgrade.py +++ b/convert/oidosupgrade.py @@ -1,104 +1,104 @@ -#!/usr/bin/env python - -import sys -import zipfile -import XML -import re -import math -import base64 -import struct - - -def upgradeInstrument(xi, xdevice, name): - def newname(s): - return re.sub("MetaSynth", "Oidos", s) - - xdevice.PluginIdentifier.replaceText(newname) - xdevice.PluginDisplayName.replaceText(newname) - xdevice.PluginShortDisplayName.replaceText(newname) - if name is not None: - xi.Name.setData(name) - else: - xi.Name.replaceText(newname) - - #pdata = base64.b64decode(xdevice.ParameterChunk.domlist[0].childNodes[0].data + "=") - #for i,c in enumerate(pdata): - # print "%s%02X" % (" " if (i % 4) == 0 else "", ord(c)), - #print - - xparams = xdevice.Parameters.Parameter.Value - params = [float(p) for p in xparams] - - # Duplicate filter sweep parameter - params = params[:11] + [params[13]] + params[11:17] + [0.0] + params[20:27] + [params[29]] + params[27:33] - - for i,p in enumerate(params): - xparams[i].setData(p) - - pstring = struct.pack("<4I", 1, 1, len(params), 0) + struct.pack("<%df" % len(params), *params) - xdevice.ParameterChunk.setData(base64.b64encode(pstring)) - -def upgradeInstruments(xinstrs, name): - for xi in xinstrs: - for xdevice in xi.PluginProperties.PluginDevice: - plugin_id = str(xdevice.PluginIdentifier) - if plugin_id == "MetaSynth": - upgradeInstrument(xi, xdevice, name) - break - - -def upgradeReverb(xdevice): - def newname(s): - return re.sub("MetaEffect", "OidosReverb", s) - - xdevice.PluginIdentifier.replaceText(newname) - xdevice.PluginDisplayName.replaceText(newname) - xdevice.PluginShortDisplayName.replaceText(newname) - - #pdata = base64.b64decode(xdevice.ParameterChunk.domlist[0].childNodes[0].data + "=") - #for i,c in enumerate(pdata): - # print "%s%02X" % (" " if (i % 4) == 0 else "", ord(c)), - #print - - xparams = xdevice.Parameters.Parameter.Value - params = [float(p) for p in xparams] - - # Reduce parameters - params = params[:20] - - while len(xdevice.Parameters.Parameter) > 20: - xdevice.Parameters.removeChild(xdevice.Parameters.Parameter[20]) - - pstring = struct.pack("<4I", 1, 1, len(params), 0) + struct.pack("<%df" % len(params), *params) - xdevice.ParameterChunk.setData(base64.b64encode(pstring)) - -def upgradeReverbs(xtrack): - for xdevice in xtrack.FilterDevices.Devices.AudioPluginDevice: - plugin_id = str(xdevice.PluginIdentifier) - if plugin_id == "MetaEffect": - upgradeReverb(xdevice) - - -infile = sys.argv[1] -outfile = sys.argv[2] - -zfile = zipfile.ZipFile(infile) -if infile.endswith(".xrns"): - info = zfile.getinfo("Song.xml") - x = XML.makeXML(zfile.read(info)) - upgradeInstruments(x.RenoiseSong.Instruments.Instrument, None) - upgradeReverbs(x.RenoiseSong.Tracks.SequencerTrack) - upgradeReverbs(x.RenoiseSong.Tracks.SequencerSendTrack) -elif infile.endswith(".xrni"): - info = zfile.getinfo("Instrument.xml") - x = XML.makeXML(zfile.read(info)) - upgradeInstruments(x.RenoiseInstrument, infile[infile.rfind('/')+1:-5]) -else: - print "Unknown file extension: " + infile - sys.exit() - - - -outzip = zipfile.ZipFile(outfile, 'w') -outzip.writestr(info, x.export()) -outzip.close() +#!/usr/bin/env python2 + +import sys +import zipfile +import oidosxml +import re +import math +import base64 +import struct + + +def upgradeInstrument(xi, xdevice, name): + def newname(s): + return re.sub("MetaSynth", "Oidos", s) + + xdevice.PluginIdentifier.replaceText(newname) + xdevice.PluginDisplayName.replaceText(newname) + xdevice.PluginShortDisplayName.replaceText(newname) + if name is not None: + xi.Name.setData(name) + else: + xi.Name.replaceText(newname) + + #pdata = base64.b64decode(xdevice.ParameterChunk.domlist[0].childNodes[0].data + "=") + #for i,c in enumerate(pdata): + # print "%s%02X" % (" " if (i % 4) == 0 else "", ord(c)), + #print + + xparams = xdevice.Parameters.Parameter.Value + params = [float(p) for p in xparams] + + # Duplicate filter sweep parameter + params = params[:11] + [params[13]] + params[11:17] + [0.0] + params[20:27] + [params[29]] + params[27:33] + + for i,p in enumerate(params): + xparams[i].setData(p) + + pstring = struct.pack("<4I", 1, 1, len(params), 0) + struct.pack("<%df" % len(params), *params) + xdevice.ParameterChunk.setData(base64.b64encode(pstring)) + +def upgradeInstruments(xinstrs, name): + for xi in xinstrs: + for xdevice in xi.PluginProperties.PluginDevice: + plugin_id = str(xdevice.PluginIdentifier) + if plugin_id == "MetaSynth": + upgradeInstrument(xi, xdevice, name) + break + + +def upgradeReverb(xdevice): + def newname(s): + return re.sub("MetaEffect", "OidosReverb", s) + + xdevice.PluginIdentifier.replaceText(newname) + xdevice.PluginDisplayName.replaceText(newname) + xdevice.PluginShortDisplayName.replaceText(newname) + + #pdata = base64.b64decode(xdevice.ParameterChunk.domlist[0].childNodes[0].data + "=") + #for i,c in enumerate(pdata): + # print "%s%02X" % (" " if (i % 4) == 0 else "", ord(c)), + #print + + xparams = xdevice.Parameters.Parameter.Value + params = [float(p) for p in xparams] + + # Reduce parameters + params = params[:20] + + while len(xdevice.Parameters.Parameter) > 20: + xdevice.Parameters.removeChild(xdevice.Parameters.Parameter[20]) + + pstring = struct.pack("<4I", 1, 1, len(params), 0) + struct.pack("<%df" % len(params), *params) + xdevice.ParameterChunk.setData(base64.b64encode(pstring)) + +def upgradeReverbs(xtrack): + for xdevice in xtrack.FilterDevices.Devices.AudioPluginDevice: + plugin_id = str(xdevice.PluginIdentifier) + if plugin_id == "MetaEffect": + upgradeReverb(xdevice) + + +infile = sys.argv[1] +outfile = sys.argv[2] + +zfile = zipfile.ZipFile(infile) +if infile.endswith(".xrns"): + info = zfile.getinfo("Song.xml") + x = oidosxml.makeXML(zfile.read(info)) + upgradeInstruments(x.RenoiseSong.Instruments.Instrument, None) + upgradeReverbs(x.RenoiseSong.Tracks.SequencerTrack) + upgradeReverbs(x.RenoiseSong.Tracks.SequencerSendTrack) +elif infile.endswith(".xrni"): + info = zfile.getinfo("Instrument.xml") + x = oidosxml.makeXML(zfile.read(info)) + upgradeInstruments(x.RenoiseInstrument, infile[infile.rfind('/')+1:-5]) +else: + print "Unknown file extension: " + infile + sys.exit() + + + +outzip = zipfile.ZipFile(outfile, 'w') +outzip.writestr(info, x.export()) +outzip.close() diff --git a/convert/XML.py b/convert/oidosxml.py similarity index 99% rename from convert/XML.py rename to convert/oidosxml.py index 778ee16..f15ba93 100755 --- a/convert/XML.py +++ b/convert/oidosxml.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python import xml.dom import xml.dom.minidom @@ -89,3 +88,4 @@ def readXML(filename): def makeXML(xstring): return XML([xml.dom.minidom.parseString(xstring)]) + diff --git a/convert/py2exe_setup.py b/convert/py2exe_setup.py index 6e0e4cd..76306e5 100755 --- a/convert/py2exe_setup.py +++ b/convert/py2exe_setup.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python2 from distutils.core import setup import py2exe, sys, os From c7bc996d17793a17d770a761dcc9bd4e26462205 Mon Sep 17 00:00:00 2001 From: PoroCYon Date: Fri, 10 May 2019 23:44:59 +0200 Subject: [PATCH 3/4] add easy_elf script, update makedist.sh to reflect previous updates --- easy_elf/build.sh | 9 +++++++++ easy_elf/readme.txt | 18 ++++++++++++++++++ makedist.sh | 9 +++++++++ 3 files changed, 36 insertions(+) create mode 100755 easy_elf/build.sh create mode 100644 easy_elf/readme.txt diff --git a/easy_elf/build.sh b/easy_elf/build.sh new file mode 100755 index 0000000..ebd80bb --- /dev/null +++ b/easy_elf/build.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +../convert/oidosconvert.py music.xrns music.asm && \ + nasm -felf32 -I ../player/ ../player/oidos.asm -o oidos.o && \ + nasm -felf32 -I ../player/ ../player/random.asm -o random.o && \ + cc -m32 ../player/play.c -o play.o && \ + cc -m32 -o dump_wav oidos.o random.o play.o && \ + rm -fv oidos.o random.o play.o music.asm + diff --git a/easy_elf/readme.txt b/easy_elf/readme.txt new file mode 100644 index 0000000..1019af6 --- /dev/null +++ b/easy_elf/readme.txt @@ -0,0 +1,18 @@ + +This setup is for easily building an executable version of a piece of music +created using Oidos. + +Proceed as follows: + +1. Place your music here, named music.xrns. +2. Edit the music.txt file to contain the text you would like the executable + to print at startup. +3. Edit the wav_filename.txt file to contain the filename (without trailing + newline!) to which the wav writer executable shall write the music. +5. Run build.sh to get the executable which writes the music in WAV format to + the file specified in wav_filename.txt. + +If no executables appear, the script encountered an error along the way. +Consult the output window text for details. + +Enjoy! diff --git a/makedist.sh b/makedist.sh index cad277d..151632d 100755 --- a/makedist.sh +++ b/makedist.sh @@ -41,6 +41,7 @@ cp player/oidos.asm $DIST/player/ cp player/oidos.h $DIST/player/ cp player/oidos.inc $DIST/player/ cp player/play.asm $DIST/player/ +cp player/play.c $DIST/player/ cp player/random.asm $DIST/player/ # Copy examples @@ -54,6 +55,14 @@ cp examples/Songs/Punqtured-4k-Fntstc.xrns $DIST/easy_exe/music.xrns mkdir -p $DIST/easy_exe/temp cp -R easy_exe/tools $DIST/easy_exe/ +# Copy easy_elf +mkdir -p $DIST/easy_elf +cp easy_elf/build.bat $DIST/easy_elf/ +cp easy_elf/*.txt $DIST/easy_elf/ +cp examples/Songs/Punqtured-4k-Fntstc.xrns $DIST/easy_elf/music.xrns +mkdir -p $DIST/easy_elf/temp +cp -R easy_elf/tools $DIST/easy_elf/ + # Copy readme, history and license cp README.md $DIST/ cp HISTORY.md $DIST/ From 5522d59808d2fbbaef6fb57f614dcb596ef7ba46 Mon Sep 17 00:00:00 2001 From: PoroCYon Date: Fri, 17 May 2019 22:04:16 +0200 Subject: [PATCH 4/4] WIN32 -> _WIN32 --- player/oidos.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/player/oidos.h b/player/oidos.h index 5fafeff..0b2a983 100644 --- a/player/oidos.h +++ b/player/oidos.h @@ -21,7 +21,7 @@ extern "C" { // On Linux, there are too many sound APIs to choose from, // so I can't just force anyone to use a specific one. -pcy -#ifdef WIN32 +#ifdef _WIN32 // Play the music void Oidos_StartMusic();