[quote=cyberic] Hello garvalf, could you please share the converter script? it's great! Thx[/quote]
sure.
It's not very clean or use-friendly at the moment, but here is what I did:
First, find some vopm instruments (or design them yourself with the vst plugin, but it's probably easier to use the Ctrlr tool made by synthy if it's for this purpose).
The cool thing is you can find some 1300 instruments (or games) packed from this link: [url]https://www.youtube.com/watch?v=EKQDpWZWIDU[/url] (which link to there: [url]http://www.mediafire.com/download.php?od9s1zgbk4ig125)[/url]
The vopm will export to something like that:
LFO: 0 0 0 0 0 CH: 64 7 2 0 0 120 0 M1: 31 6 0 1 1 33 2 0 3 0 0 C1: 28 5 0 5 5 37 2 3 3 0 0 M2: 27 31 0 3 0 31 1 0 3 0 0 C2: 13 3 0 6 0 25 1 0 3 0 0
copy it to a vopm.txt file.
Then you can use this vopm2arduino script:
cat vopm.txt |\ perl -pe 's|LFO:\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*|LFRQ!;\n\/\/AMS = ;\n\/\/PMS = ;\nLWav = ;\nNFRQ ;\n|' | \ perl -pe 's|CH:\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*|PA!;\nFB = ;\nCON = ;\nAMS = ;\nPMS = ;\nLMod = ;\nNoise ;\n|' |\ perl -pe 's|M1:\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*|AR[0]!;\nD1R[0] = ;\nD2R[0] = ;\nRR[0] = ;\nD1L[0] = ;\nTL[0] = ;\nKS[0] = ;\nMUL[0] = ;\nDT1[0] = ;\nDT2[0] = 000;\n\/\/AMS-EN \g11;\n|' |\ perl -pe 's|C1:\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*|AR[1]!;\nD1R[1] = ;\nD2R[1] = ;\nRR[1] = ;\nD1L[1] = ;\nTL[1] = ;\nKS[1] = ;\nMUL[1] = ;\nDT1[1] = ;\nDT2[1] = 000;\n\/\/AMS-EN \g11;\n|' |\ perl -pe 's|M2:\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*|AR[2]!;\nD1R[2] = ;\nD2R[2] = ;\nRR[2] = ;\nD1L[2] = ;\nTL[2] = ;\nKS[2] = ;\nMUL[2] = ;\nDT1[2] = ;\nDT2[2] = 000;\n\/\/AMS-EN \g11;\n|' |\ perl -pe 's|C2:\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*|AR[3]!;\nD1R[3] = ;\nD2R[3] = ;\nRR[3] = ;\nD1L[3] = ;\nTL[3] = ;\nKS[3] = ;\nMUL[3] = ;\nDT1[3] = ;\nDT2[3] = 000;\n\/\/AMS-EN \g11;\n|'remplace 000 by \g10 with perl 22
in my current pearl implementation, \g10 is not supported, but this DT2 is not much used so it's not a problem.
The script will output to the terminal, which you can redirect to a file. Then copy/paste this output to a DefaultInstrument.h file you can put into your arduino project (midi_in_ym2151). Call this file (#include "DefaultInstrument.h";) from the part after:
sysexValue[5] = 59; sysexValue[6] = 15-RR[3]; MIDI.sendSysEx(8,sysexValue, true);
and before [code] YM2151.write(0x0f,(Noise<<8) + NRFQ);[/code]
When you compile the arduino sketch, it will make the instrument defined in the vopm.txt file as default. You can still alter this with the ctrlr panel. The problem is it's quite tedious to change from one instrument to an other (you have to compile the sketch). You also cannot output from the perl script to the DefaultInstrument.h file, because the arduino IDE doesn't reload if you modify the file externally. You can problably compile it with avrdude directly.
i've tried a few instruments from famous games, and compare them with the original songs, and they sound very close, so it's quite great. It would be even cooler if it could change the values into to ctrlr panels
So I've thought it would be better to use SysEx to change the values on the fly (it's what Ctrlr does by the way).
I made another script, for converting to SysEx:
cat vopm.txt | \ perl -pe 's|LFO:\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*|\ printf("F0 00 00 00 00 08 ") ; printf("%x ",$1*2) ; printf("F7 "); printf("F0 00 00 00 00 07 ") ; printf("%x ",$4) ; printf("F7 "); printf("F0 00 00 00 00 06 ") ; printf("%x ",$6) ; printf("F7 "); |e' | \ perl -pe 's|CH:\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*| printf("F0 00 00 00 00 09 ") ; printf("%x ",$1) ; printf("F7 "); printf("F0 00 00 00 00 01 ") ; printf("%x ",$2) ; printf("F7 "); printf("F0 00 00 00 00 0B ") ; printf("%x ",$3) ; printf("F7 "); printf("F0 00 00 00 00 04 ") ; printf("%x ",$4) ; printf("F7 "); printf("F0 00 00 00 00 05 ") ; printf("%x ",$5) ; printf("F7 "); printf("F0 00 00 00 00 0A ") ; printf("%x ",$6) ; printf("F7 "); printf("F0 00 00 00 00 03 ") ; printf("%x ",$7) ; printf("F7 "); |e' |\ perl -pe 's|M1:\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*|printf("F0 00 00 00 00 18 ") ; printf("%x ",$1) ; printf("F7 "); printf("F0 00 00 00 00 19 ") ; printf("%x ",$2) ; printf("F7 "); printf("F0 00 00 00 00 1B ") ; printf("%x ",$3) ; printf("F7 "); printf("F0 00 00 00 00 1D ") ; printf("%x ",$4) ; printf("F7 "); printf("F0 00 00 00 00 1C ") ; printf("%x ",$5) ; printf("F7 "); printf("F0 00 00 00 00 16 ") ; printf("%x ",$6) ; printf("F7 "); printf("F0 00 00 00 00 17 ") ; printf("%x ",$7) ; printf("F7 "); printf("F0 00 00 00 00 15 ") ; printf("%x ",$8) ; printf("F7 "); printf("F0 00 00 00 00 14 ") ; printf("%x ",$9) ; printf("F7 "); printf("F0 00 00 00 00 1A ") ; printf("%x ",00) ; printf("F7 "); |e' |\ perl -pe 's|C1:\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*|printf("F0 00 00 00 00 22 ") ; printf("%x ",$1) ; printf("F7 "); printf("F0 00 00 00 00 23 ") ; printf("%x ",$2) ; printf("F7 "); printf("F0 00 00 00 00 25 ") ; printf("%x ",$3) ; printf("F7 "); printf("F0 00 00 00 00 27 ") ; printf("%x ",$4) ; printf("F7 "); printf("F0 00 00 00 00 26 ") ; printf("%x ",$5) ; printf("F7 "); printf("F0 00 00 00 00 20 ") ; printf("%x ",$6) ; printf("F7 "); printf("F0 00 00 00 00 21 ") ; printf("%x ",$7) ; printf("F7 "); printf("F0 00 00 00 00 1F ") ; printf("%x ",$8) ; printf("F7 "); printf("F0 00 00 00 00 1E ") ; printf("%x ",$9) ; printf("F7 "); printf("F0 00 00 00 00 24 ") ; printf("%x ",00) ; printf("F7 "); |e' |\ perl -pe 's|M2:\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*|printf("F0 00 00 00 00 2C ") ; printf("%x ",$1) ; printf("F7 "); printf("F0 00 00 00 00 2D ") ; printf("%x ",$2) ; printf("F7 "); printf("F0 00 00 00 00 2F ") ; printf("%x ",$3) ; printf("F7 "); printf("F0 00 00 00 00 31 ") ; printf("%x ",$4) ; printf("F7 "); printf("F0 00 00 00 00 30 ") ; printf("%x ",$5) ; printf("F7 "); printf("F0 00 00 00 00 2A ") ; printf("%x ",$6) ; printf("F7 "); printf("F0 00 00 00 00 2B ") ; printf("%x ",$7) ; printf("F7 "); printf("F0 00 00 00 00 29 ") ; printf("%x ",$8) ; printf("F7 "); printf("F0 00 00 00 00 28 ") ; printf("%x ",$9) ; printf("F7 "); printf("F0 00 00 00 00 2E ") ; printf("%x ",00) ; printf("F7 "); |e' |\ perl -pe 's|C2:\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*(\d+)\s*|printf("F0 00 00 00 00 36 ") ; printf("%x ",$1) ; printf("F7 "); printf("F0 00 00 00 00 37 ") ; printf("%x ",$2) ; printf("F7 "); printf("F0 00 00 00 00 39 ") ; printf("%x ",$3) ; printf("F7 "); printf("F0 00 00 00 00 3B ") ; printf("%x ",$4) ; printf("F7 "); printf("F0 00 00 00 00 3A ") ; printf("%x ",$5) ; printf("F7 "); printf("F0 00 00 00 00 34 ") ; printf("%x ",$6) ; printf("F7 "); printf("F0 00 00 00 00 35 ") ; printf("%x ",$7) ; printf("F7 "); printf("F0 00 00 00 00 33 ") ; printf("%x ",$8) ; printf("F7 "); printf("F0 00 00 00 00 32 ") ; printf("%x ",$9) ; printf("F7 "); printf("F0 00 00 00 00 38 ") ; printf("%x ",00) ; printf("F7 "); |e' | perl -pe 's|\s(\d{1}?)\s| 0$1 |g' | perl -pe 's|\s([abcdef])\s| 0$1 |g'