SunVox for ZGE
Moderator: Moderators
Re: SunVox for ZGE
Today, I tested ZGE with the latest SunVox DLL 1.9.3. It works fine.
Re: SunVox for ZGE
So I started toying with SunVox, which is quite amazing. Everything works on PC and Android ( latest lib 1.9.4c).
I'm still learning the basics, therefore I try to load some examples. The problem is that musics plays on ZGE, such as "Boomlinde - Caravan.sunvox", while others don't play at all, or even make ZGE crash. Do you happen to know what is causing that? Is it coming from a custom and rather complicated module, or from the number of tracks, or something else?
Because everything works fine in SunVox, so I'm not sure if the problem comes from ZGE or the sunvox.dll
Thanks for your knowledge on the subject
Edit:
Thanks to Kjell, now I know that everything is fine with SunVox. I spent one hour this morning to try all the example songs and classify them into subfolders such as OK, BAD (all instruments are messed up), NO (not playing), CRASH (crashes ZGE). Turns out that the problem was coming from the computer
I'll try that computer again tomorrow morning and try to discover what's going on with it.
I'm still learning the basics, therefore I try to load some examples. The problem is that musics plays on ZGE, such as "Boomlinde - Caravan.sunvox", while others don't play at all, or even make ZGE crash. Do you happen to know what is causing that? Is it coming from a custom and rather complicated module, or from the number of tracks, or something else?
Because everything works fine in SunVox, so I'm not sure if the problem comes from ZGE or the sunvox.dll
Thanks for your knowledge on the subject
Edit:
Thanks to Kjell, now I know that everything is fine with SunVox. I spent one hour this morning to try all the example songs and classify them into subfolders such as OK, BAD (all instruments are messed up), NO (not playing), CRASH (crashes ZGE). Turns out that the problem was coming from the computer
I'll try that computer again tomorrow morning and try to discover what's going on with it.
Re: SunVox for ZGE
I just made a test in order to only play the bass line at some point. But I'm not sure what would be the best method to do that.
I thought of 3 methods (you can set the method number in *Onloaded/ZExpression", just press space to mute the song and keep the bass)
Method 1:
By using two files, I play the Song and the Bass at the same time on two different tracks. Then I play with the volume on the Song track.
This is working great, but I wonder if they will still be coordinated and play at the same time...
Method 2:
I also use two files. One being the complete Song, and the other just the Bass. I play the first file, then I stop it and play the Bass starting from the timecode where the other file stoped. The problem is that I don't know how to get that timecode, since SunVox run with custom Ticks.
Method 3:
I just use the complete song File and I mute paterns (or modules?) directly in it. But I have no clue how to retrive such a thing from the file.
I thought of 3 methods (you can set the method number in *Onloaded/ZExpression", just press space to mute the song and keep the bass)
Method 1:
By using two files, I play the Song and the Bass at the same time on two different tracks. Then I play with the volume on the Song track.
This is working great, but I wonder if they will still be coordinated and play at the same time...
Method 2:
I also use two files. One being the complete Song, and the other just the Bass. I play the first file, then I stop it and play the Bass starting from the timecode where the other file stoped. The problem is that I don't know how to get that timecode, since SunVox run with custom Ticks.
Method 3:
I just use the complete song File and I mute paterns (or modules?) directly in it. But I have no clue how to retrive such a thing from the file.
Code: Select all
<?xml version="1.0" encoding="iso-8859-1" ?>
<ZApplication Name="App" Caption="ZGameEditor application" MouseVisible="255" FileVersion="2">
<OnLoaded>
<ZExternalLibrary ModuleName="SunVox">
<Source>
<![CDATA[/*
Adapter to the SunVox Library.
http://www.warmplace.ru/soft/sunvox
Created by Rado1(c)2012-2013
Download the library from http://www.warmplace.ru/soft/sunvox/sunvox_dll.zip
More info: http://www.emix8.org/forum/viewtopic.php?p=5446
*/
// Constants
const int SV_NOTECMD_NOTE_OFF = 128;
const int SV_NOTECMD_ALL_NOTES_OFF = 129; // notes of all synths off
const int SV_NOTECMD_CLEAN_SYNTHS = 130; // stop and clean all synths
const int SV_NOTECMD_STOP = 131;
const int SV_NOTECMD_PLAY = 132;
const int SV_INIT_FLAG_NO_DEBUG_OUTPUT = 1 << 0;
const int SV_INIT_FLAG_USER_AUDIO_CALLBACK = 1 << 1;
const int SV_INIT_FLAG_AUDIO_INT16 = 1 << 2;
const int SV_INIT_FLAG_AUDIO_FLOAT32 = 1 << 3;
const int SV_INIT_FLAG_ONE_THREAD = 1 << 4;
const int SV_MODULE_FLAG_EXISTS = 1;
const int SV_MODULE_FLAG_EFFECT = 2;
const int SV_MODULE_INPUTS_OFF = 16;
const int SV_MODULE_INPUTS_MASK = ( 255 << SV_MODULE_INPUTS_OFF );
const int SV_MODULE_OUTPUTS_OFF = ( 16 + 8 );
const int SV_MODULE_OUTPUTS_MASK = ( 255 << SV_MODULE_OUTPUTS_OFF );
const int SV_STYPE_INT16 = 0;
const int SV_STYPE_INT32 = 1;
const int SV_STYPE_FLOAT32 = 2;
const int SV_STYPE_FLOAT64 = 3;
// Initialization functions
int sv_init(string dev, int freq, int channels, int flags) {}
int sv_deinit() {}
int sv_open_slot(int slot) {}
int sv_close_slot(int slot) {}
int sv_lock_slot(int slot ) {}
int sv_unlock_slot(int slot) {}
int sv_load(int slot, string name) {}
int sv_load_from_memory(int slot, xptr data, int data_size) {}
// Functions to control song playing
int sv_play(int slot) {}
int sv_play_from_beginning(int slot) {}
int sv_stop(int slot) {}
int sv_set_autostop(int slot, int autostop) {}
// autostop values: 0 - disable autostop; 1 - enable autostop.
// When disabled, song is playing infinitely in the loop.
int sv_rewind(int slot, int t) {}
int sv_volume(int slot, int vol) {}
int sv_send_event(int slot, int channel_num, int note, int vel, int module, int ctl, int ctl_val) {}
// Functions to get info about the engine, song and its playing
int sv_audio_callback(xptr buf, int frames, int latency, int out_time) {}
// Get the next piece of SunVox audio.
// buf - destination buffer of type signed short (if SV_INIT_FLAG_AUDIO_INT16 used in sv_init())
// or float (if SV_INIT_FLAG_AUDIO_FLOAT32 used in sv_init());
// stereo data will be interleaved in this buffer: LRLR... ; where the LR is the one frame;
// frames - number of frames in destination buffer;
// latency - audio latency (in frames);
// out_time - output time (in ticks).
int sv_get_sample_type() {}
// Get internal sample type of the SunVox engine.
// Return value: one of the SV_STYPE_xxx defines.
// Use it to get the scope buffer type from get_module_scope() function.
int sv_end_of_song(int slot) {}
// Return values: 0 - song is playing now; 1 - stopped.
int sv_get_current_line(int slot) {}
int sv_get_current_signal_level(int slot, int channel) {}
string sv_get_song_name(int slot) {}
int sv_get_song_bpm(int slot) {}
int sv_get_song_tpl(int slot) {}
int sv_get_song_length_lines(int slot) {}
int sv_get_song_length_frames(int slot) {}
// Frame is one discrete of the sound. Sampling frequency 44100 Hz
// means, that you hear 44100 frames per second.
int sv_get_ticks() {}
// Returns the current tick counter (from 0 to 0xFFFFFFFF).
// SunVox engine uses its own time space, measured in ticks.
int sv_get_ticks_per_second() {}
// Returns the number of SunVox ticks per second.
int sv_get_number_of_modules(int slot) {}
int sv_get_module_flags(int slot, int mod_num) {}
string sv_get_module_name(int slot, int mod_num) {}
int[] sv_get_module_inputs(int slot, int mod_num) {}
int[] sv_get_module_outputs(int slot, int mod_num) {}
int sv_get_module_xy(int slot, int mod_num) {}
int sv_get_module_color(int slot, int mod_num) {}
byte[] sv_get_module_scope(int slot, int mod_num, int channel, int[] offset, int[] buffer_size) {}
int sv_get_number_of_patterns(int slot) {}
int sv_get_pattern_x(int slot, int pat_num) {}
int sv_get_pattern_y(int slot, int pat_num) {}
int sv_get_pattern_tracks(int slot, int pat_num) {}
int sv_get_pattern_lines(int slot, int pat_num) {}
byte[] sv_get_pattern_data(int slot, int pat_num) {}
// Returns array of structures:
// typedef struct {
// unsigned char note; // 0 - nothing; 1..127 - note num; 128 - note off; 129, 130... - see NOTECMD_xxx
// unsigned char vel; // Velocity 1..129; 0 - default
// unsigned char module; // 0 - nothing; 1..255 - module number
// unsigned char nothing;
// unsigned short ctl; // CCXX. CC - number of controller. XX - std effect
// unsigned short ctl_val; // Value of controller
// } sunvox_note;
int sv_pattern_mute(int slot, int pat_num, int mute) {}
// Use it with sv_lock_slot() and sv_unlock_slot()]]>
</Source>
</ZExternalLibrary>
<ZExpression>
<Expression>
<![CDATA[//
sv_init("", 44100, 2, 0);
sv_open_slot(0); // All
sv_open_slot(1); // Melody
sv_open_slot(2); // Bass
Method = 1;
switch(Method)
{
case 1:
sv_load_from_memory(1, MusicSongFile.FileEmbedded, MusicSongFile.Size);
sv_load_from_memory(2, MusicBassFile.FileEmbedded, MusicBassFile.Size);
sv_play_from_beginning(1);
sv_play_from_beginning(2);
break;
default:
sv_load_from_memory(0, MusicAllFile.FileEmbedded, MusicAllFile.Size);
sv_play_from_beginning(0);
break;
}]]>
</Expression>
</ZExpression>
</OnLoaded>
<OnUpdate>
<ZExpression Expression="PressSpace = 0;"/>
<KeyPress CharCode="32">
<OnPressed>
<ZExpression Expression="PressSpace = 1;"/>
</OnPressed>
</KeyPress>
<ZExpression>
<Expression>
<![CDATA[
switch (Method)
{
// Play Song and Bass file at the same time
case 1:
if (PressSpace)
{
if (Volume > 0) Volume -= App.DeltaTime * 400;
}
else
{
if (Volume < 100) Volume += App.DeltaTime * 400;
}
sv_volume(1, Volume);
break;
// Switch File to play All or Bass only
// But I don't know how to retrieve where we were in the music
case 2:
if (sv_end_of_song(0)) Time = 0; // This is not working
else Time += App.DeltaTime;
trace(IntToStr(Time*100));
if (PressSpace != OnlyBass)
{
OnlyBass = PressSpace;
int ticks = sv_get_ticks();
//trace(IntToStr(ticks));
if (OnlyBass) sv_load_from_memory(0, MusicBassFile.FileEmbedded, MusicBassFile.Size);
else sv_load_from_memory(0, MusicAllFile.FileEmbedded, MusicAllFile.Size);
//sv_rewind(0, ticks);
//float ttime = Ticks / sv_get_ticks_per_second();
// trace(IntToStr(ttime));
// sv_rewind(0, ttime);
//sv_rewind(0, Time);
sv_play(0);
}
break;
// Play just file All and mute certain tracks
// Is it possible?
case 3:
trace(IntToStr(sv_get_pattern_tracks(0,3)));
break;
}]]>
</Expression>
</ZExpression>
</OnUpdate>
<OnClose>
<ZExpression>
<Expression>
<![CDATA[//
sv_stop(0);
sv_close_slot(0);
sv_close_slot(1);
sv_close_slot(2);
sv_deinit();]]>
</Expression>
</ZExpression>
</OnClose>
<Content>
<File Name="MusicAllFile" Comment="Imported from music-all.sunvox">
<FileEmbedded>
<![CDATA[78DAED5A0D7C144715DFFBC817F90E148E260D9B122909012F4028C654F6721FB933F7C5DD254D620B494808912389F9E04BF0AE6AB55AACB1965A296D23B4D52A2215055B6C7B466A63AB524AA5524B89B5B5B482A256C5523877EE76EF86C9CEEDEEDC71D0FEBAF7BBBC3733EFCDECCCFFBD376FE6E26E743451ECD36874B9D52C55AA3314B56C01F06A559AA2D669A301BF99FDBA9D4603E053D9AFA7CE15E2D521DE309FE7EB1A1D56401BD9AF5D673316B154EFD6B90C3A37AD77D83D167B43838D6EDF409B1A9A1C260F6573EB43F2E3ECD7D6E270009E52B03CDB1AE2417D7394B7DADCF53CAF6F705979DE63B119015F0CDED3680DCD653290AF33DA015FC07E9D3A4F88CF0EF31E5E97E543FDA8006FF0E8C0F8F32865A84DCBD14A8E5671B49AA3351CBD01295723F295487F576AFF3A8E3AF5E6D05A29006FB584781AF0CDEE96086FB2D645D6D0A277803A4A033E9A29EC67AAE65ACDCC8A92D292074B46E9D1D6D14020A453A757712AB56136180C3A4DA608C2CEA6A6A608DFDCDC0CF82D8037DA0D148F90928AFB591CB2638A327334D9CF87E3C7373E6FA14A99167AC792377CAA9C40E14ABA9A7E595F5D3BA9FDC2CC02EDDAA23773B57967679C5D4266A1A5A885B28E33954ABBE88DF9F2748EE2DAE32DC7DB3F4E5F8394A723E542A44C1C43E0474DA5800F73B8D6E972BA1817710C3905641084265199C80A84CB7CBD9FABE7CB687B2A420B90723A47A720E50CA41FD2F1B3113A1D296721FD67206552848AD9991684FF2EA66607CA98394C39338FA1197A139D162045E8208A9012EC63E9098D3A65487F68FF5AA45C19E7F85584FA8B583D15BB001753154753121885D32FC9FBF38F3FCEF713B250468285DEFCF8FED38FDD77E0F88B738EAE2E2D9DD5317B4AB9A762E1BC416DD67CEBCEA75FAB23B3D0EDEF430B8DEA0BD34522ED5522ED0B44DAE5D24AA4AC45CAE87CE6C6B9FE6502FA4A8AE6A896A30C9626CA424F4E7BFBC653D793582813CB42D9D76A10C9B03EE8EDE47988DFE7D7B15FC6EFDBCEB01FDF6DCC70DFF0F211668409F84877B90E814C3117D9970BB9722E9207F065B47D12427179029A1FF0FAF9C8F8D720F5FCF87C196D4729DAAE41FACF4F501EC29E5F8BE97C6D3E7D8476D5DCC43A02C36C3A93359C7E7FAE92F54D950C845A2184C604A2BCD4A7BC2DBED354B92E4EFD0FC7BF24E3939E3659D709507D5451384405A83369415FD0E7A7C21FD218A286630862A90B44F2877291F60571668462FA62F98A56A47DAEE47C67E2A3A67273C9E88CB8A93F41FD8851D27CE4EEEE8A854D57EFC90E064F9C7B72734D0D6B86C10BBEF796346FDB61BCABAC2F47BAA50670F98853E78ADCB3727A0A488FC69D05393D8504BDD9B047088CA7C2E44D6332C66344C6C3E9C17B4C85801E25617E5B64E831847AAD227AB8F9F9213DAD080E38BD3119F63242682F2332EC05D61B271C2F2082BB42C27872ECC54F88FB08A15E80506F5C442F4DC27842F6A296B02E42714929C1FF4EC9D06308F55A09F5FC847A23847A0142BD7111BD5409387408D84BAA041CE4E8B512EAF909F54608F502847AE3227AE9127050CBD06308F55A09F5FC847A23847A0142BD718C9E9B93D503DEAEB38175770C0DF60D0DE2B35FB7299CF185789731F2FBB89B1B4BC33AA59B1BEB7550DFD2D21291E17E8B072FE76E7486F7264516E5D63BAC5CBAE7B6592C11719B450FF1B5EAB00890714678ABBD1E4C3B932F23536B86A656D7D9D3D9DF36D8DB8F9B9AA7D939E92239B1C9EEA7A2936514F2269B12A448261BFABF84465DA46B9E4F83EAFD109F0AF1A5109F07F723813F0C789BC5E08CAE57305114056DA93A0A9A71C5AADE58A731005A0A2F2786D76E4514AFF54A99C6B9D34782571E97EF81723A4785F08331F3623056A0D8B0786809F088B5DEA66EEF60677FECF54E8BCA89ADF87268C59F95E921BE63C4E100F0D998553C5E206CE12A884F97E21D509F33A17A1AE25B2861F494B1FA67515D7F09BC8CD43A2C5008ADEF5EB15A8A75707262D651A58A5A47914A9E7550F70613193F294CFCA430C852327CD49C403463A163E81F5AE3DED033B84A64838BCA89016481009A26336052CFC50DD0BBD0C23E04D5AB217E0C03044309F338195C306630863181BF82DD56D7D3E6EDEDA2BB700910308C7C213931FB78070AEF57C974E0DDF12740B7636CA213E3A8FB30F5B0D34E5546F9932A61F93D8BA2FC32B5703F0720BE03336E9EC83670CF65B42731AA37DBEB23EB6EB6DB22EF6D367880CD3D72E82D4D792575F8C068CE897DAF7497ECBD73DB0B79E65B1E3D5F32FC84EFD0C30FE8CDA69049187645F5159C7EF604038D91D65B3BDB3AC432447969FD5128AD9FA54C4A5ACF272D707A3888B15038F2A440FCF3548C6D48A43EA8B83CE9BDC9DBD6D31523A300E0A5437262D0954001E92999D06DF7054933FC34CE995108719B8A1FB381293139E84E091052D40703420B7483B02B7910A686FE9D215C3759425EF07E87100EA1A6A18D1BE9DAB681818485D06108C42C55D26F46A4844E583E5BC2D9EF8A089D7414347DEF9ABEFECE8101DC7D16002DF3623931D48A21D4CEC93CAD07B544A8693897C90086C26D68B1A26806C4AFC06C844111F75A1C0752131081DCC8B834F6FF7E004454613931245E8290E89319047DE789EF4DD4C80DD56905E6B4AC98B8AAB484558DB57A063D5DEBEDC5DF2FF0F60CC989AD6206940DF4C8B5E7677CA4ABA840EFF9B81582FE6F24663876AFEBF47A139AD1EE8532DAEB5449CB6873918568C038E63A88D76232DA2B392C5BF29411F06C43DEC1EE18B730BC19437262E8B541E89965A2F76AFC9B296ED35C25E12A2DE6E5298B0E930074629D44FDD07672B91EF4741B7DBF70BD92AB5700018552A54E494D4BCF989499959D939B975F3079CA5553A769A65F5D58744DF10CBAE4DA99A51F9975DDECB2F2391573E77D545B397FC1C2AA45D72FFE58F5C76B6EF8C4124657AB37184D7566CB27EBAD36BBC3B9D4E5F63434DED8D4DCF2A99B6E5EB6BCB5AD7D4547E7CAAE55DD9F5EED5DD3D3DBF799FE81C1A1B5EBD66FD8F8D94D9B3FE7F3DFF2F92F7CF1D62F7DF9B6AF7CF5F62D5FBBE3EBC3DFB8F39B776DBDFB5BF77C7BDBBDDBEFBBFF8191EFECD8F9E0430F7FF77B8F7CFF07BB7EB8FB477B1EFDF1DE9FFC74DFFE9F3DF6F8819F3FF1E453815F8CFEF2E0D3BF7A66ECD7CF3EF79BDFFEEED0F3875F38F2E2EF8FBEF487632FFFF195E3AF9E18FFD36B7F7EFD8DBFBC79F2ADB7FF7AEAF4DFFE7EE61FFFFCD73BFFFECF7FCFFEEFDD73EF9DBF108C79D268EC6E07E14EF4A4C1CB89F9D549C8AF3432FDCA173C481A157342FFA02CEC3B2AA9694C92D21BC1DF4FE7276A5BBA1502608732E9DB92DBDA23B85FE32E587081B04A21F397A3CBB44DC1607ABA7BBABC1B129963144229EBD6E41FF99661CEE05B310B5F469183A65326F1C80781E6EA5CDBD9DF2EFEF31B272786D84A08B1F532110B1E214E8F0B10770B627E6D3986733D09B9069C156626F986E5FF87E50951]]>
</FileEmbedded>
</File>
<File Name="MusicBassFile" Comment="Imported from music-bass.sunvox">
<FileEmbedded>
<![CDATA[78DADD5A09781345149E4DD2BBA50758538B752BC8256241AB88A89BE6686273914D6B5B115A20966A686B0FA188B61E78815A0FBC40A85C8A221E28A888D48A8A2756BC5081AAA8A878DF07C69DCD6E324E33D9EC360674F3A5F3CFEC7BB33BEF7FF3E6CDA46C99A31C705799D1C56AB852A549A28AB80AC41A750255E4B4D1105FCC7D59A7D100713CF77517BB78ACE1B1619C888BCB1C565896715FBBCE661CCC957A56E732E8585AEFB0BB2DF6D2521B3DAD953695963B4C6E6063F5BC7C2FF7B5553A1C10038AC3DC5D1EC3F68A20B6DAD81211EB4B5D5611BB2D3623C4D9F03D8D567E2C03A17CB1D10E7116F775EADC3CA6FCD82DEA7298EF270762835B0705C600157FAF4028C70A65A1504E10CA8942791A569F80C98FC5FA3B54FBD709A5536F0EDACA6AE1310D71055B19C0266B71C08616BD03B6012DFC6807719F6CEDD1DA21A3F387E6AFCCEFA6BBABBABBBA789D62BD5A5029F2439FCFE73499020C3BCBCBCB03B8A2A202E285101BED068030940D12007A89F51CA124DDEF6FBDBFFD93F4B5583D07ABE76275C50CA19706C4C10FD353E474395D8C4B3143FBA10CC6503248C12CE0AF8BEDED42BB58C7EFC7636516564F14CA41583D09EB47E9F3D3B03207ABA762FD276175A50CE57123CDF2FF1D0F46748D648E65463163189AA1E7D1095D4A19DA1A82A174EC8D73857A3A6621B18EDF4FC64A920571CB89FA99D8F38FC4DAC5E78B75FC3E5EE2F7B558FF995162888B9B7974664126BD83764D9C0C18C030F3BE4DED485C9AAEE2E2A75A0643550843DB50869C3A7E0D56F16FE0D7A3103D9AC4AC841E437A1EA60F2278EE42197A8C42BD2A093DD238DB15DAB553A15D7B497A118EB35DA17D3A15EA7529D4EB95D05347F0BC507C5011F8DB7E197A8C42BD2A857AED0AF53A15EA7529D4EB25E8B182AC1E622E71877677B43437B43403E2C59AFC1193C72E63201767856769B9C9C20ACFDA0BDB2B2B2B033242DE0F5F8E2D73FADF994A05ACDE6115C2256BB35802E2368B1EC1451ABF08947106B0D55E92C8E114B18E0DAD02195AB1A7CED358DD5CDF481A9ABBC299FC0F39A9C16E04C1C13294BCC1C6F98092C1F27BA0325DA06B112720EDED088E47F0500467A0FD44807B20B6590CCEA0BD7CD12A71D2266982A419A7CFAC07612E485A9C2827C5D73A2AC8D71C954CE75CD1A684AF0C213EC27AA25086E20FE5CC4BE098C2B9E1F82850C047387B9B6ABDCD9EC6F0F64E08CA49597C2A62F19764CE90B69D8AC301C469042BEECA0AEDE16A042746323B903E8720ED34822B4168F654E1FAE7589DF32FCC32A5DE6141426849EDF4F323F10E414ECA3B0AD541EF18AC96E71D60B12F9AF11310E22720300B64CC517314D90CC78EA1B16516DB5AD73C5362810BCA49116441083A5C66C0042FF79BA0DF11C3AE42DA3508DE46208201A1314986148C198263F4C187F0B4D5D5557BEB6BE81A5202041D2333949C947FFC8884F7C3644EE075FD4F8016107CC24398A81B08EDE8A4CD5605F13E7568F9874E0AE2299AD0FD6C42F00CC27333249681DB0FA23F49957AB3BD246077B3DD16786FB3C10D7D6ECDF6CFB5A3C6829E4DDD03F66CF8A0367FFD4D77BE9161BEF4E103F91D9BDBB6AF5EA6379B789730AC0DEA53827E5A1F070D93D65B3DD533A432447969FDDB485A3F4C1593B45E4C5AD0F4B099E0A168E48943F0EB20CC3224D1EEA30E4E7A6FF256D7D584C928207989889C1475F94840DA2293BA256D3EA5197E823099710A498B4A3B6101531172D015115008C0FF83420B7282B0367614C6F347D8FEB68111E405FF750AD1106A6A993B972EAA6E6A8A5A08ED40484C55C7FC642492D089CAA745B0F73B2442271D244D5F3FABA1D1D3D4443ACF82A4A5FC534E8AB53C84B53F64EED67D058A58D30A532689FF6DCDBFA0858BA249089E4E58087D12D36B7C3F98EAC308328D8C930090CA44D47E392926DE419868901904DB0E283E37D16027545F5184DD32D5D7AA7404560D673D839E2EF2D693CF17447F46E4A4AC988464037572FDF98536A556A4F0733EC142898885C2856376B6C7EB8D6A46BB1EC96887AB6396D1A6638628254CCCD9082E2064B4877258B664A802E4D95ABCCDB5614E61443746E4A4D8AB46D833CB646F77FF1753D2A2393382A3B4B087A71C3B4C14D809B7136D4796938375E1BBDBE0FBF9DB55423B050528955A13179F9098949C929A36203D23336BE0A0C3B20FD7E61C913BF8C8BCA3E8FCA3870C3D66D8F01123471D3BFAB831C7178C1D77C28985279D3CFE9409A74E3CEDF433185D91DE6034159B2D6796586D768773928B7597969D555E5179F6E473A64CADAA9E367D86E7DC9A99B5E79DEF9D5557DF7041635373CB85B3E7B4CEBD68DEC597B4B55F7AD9E557CCBFF2AAABAFB976C1C2EBAEBFA1E3C69B6EBE65D1ADB7DD7EC79D8B97DCB57459E7DDCB57AC5CB5FA9E7BD7DC77FFDA07D63DF8D0C38FAC7FF4B10D1B1F7FE2C94D4F6D7E7A4BD733DDCF6E7DEEF917B6BDF8D2CBAFBCFADAF6D77BDED8F1E65B6FBFF3EECEF7DEFF60D7EE3DBD1F7EF4F1DE4F3EFD6CDFE75F7CB9FFABAFBFF9F6BBEF7FF8F1A79F7FF9F5B7DFFFF8F3C05FBEB03B8DB2DA6930DC49EE344439A979B50F99575A99F3AACDB75569541CC0FF534AE8B9A38E348D89517A13F2F7D371D15A96E623042C57C57C5962AD7521D76BD2010B29101652327F393A48CB144AA6BBB6AEC6DB1ACD1C2317495917C57ECB3785B0075F4430FC48A09C349D2A865B3E843497E7424FE334E99FDF043929C6CE45189B239331DF0EC5E9711636DD7C845F5B7692A65E04B9069A15A6C4F884E56FCE358B47]]>
</FileEmbedded>
</File>
<File Name="MusicSongFile" Comment="Imported from music-song.sunvox">
<FileEmbedded>
<![CDATA[78DAED590974134518DECDA6B4057A50502A5408529196C37014115192E6686273D14D4B531568692895D0D636E5524CF056142B8207A256501145045150F18807E28D28822047BD11C1FB40AE7527DD24439AD9D9DD84703C366FDF7C99FDFFDDD9F9FE6B66E9126B29C11E25BA225ACEB632793299CFFE01584E2592F936B302E059EC49DB745A80DBB1A7BDA0C88FE57EAC1D1CC005255613684BD8D3A236EBB2D85643AB8BB46A5AA1B15AEC464B71B159513143A12F2EB5EAED8499D6F8E55BD8D35C66B5024C902C66AFFA31E87784B0C94C1706B0A6B8C814C076A35907F052304E9DC9FF2E9D817C81CE0270067BDAD4764B609C2CB6077459ECBF0F05B0D6AE266444D4C770FF2C1184816BE37D9C797E74CFB7690C7E5B01A6603319FD5801B0832E0B62BDA9206843468D15F4CD1DF5BD874AF5759FA818A1D8AE1991DFBEE268EF0CE5D4AC1FD394E9077A1E1865D31768284E25BF15320C63D3EB83166E2B2D2D0D6287C3017036C03A8B96802C74209114D319CB09BB5FF8FD9561FF0745F9FC3C89FAC3583D8A9D80635B8A6B1362684149C765FC81C31BE5F802164A4216AA1260A157BDB276FFCB0FAFDBB9B9DF96C9D9D97D2AFB76C9B5F71F3AD0ADEC38D8B464FD3705D22C74119039C52C34A41FB91D86B99E87B93E04735D6C3B28ECBF32EC7FF8FB0C8872FE7322E8CBFC76055A25D7AA906DAC2C744FD7BD63F65D24C542557C16CA0EAB18931D4EF7EB91181292E5D8E8E5F1AAD953E5F52C52B13FCF6DAAA6BAA671CDAA6695CF0374A4C490CA08594EE8915B1E5D9D91AB8E52FFCCF38FCBF3A5D6616C7AF511754456AB03F888DF12190FE3F112AD3FA9162A8F60A14330592917737D489475064E1F97059598EB030467D1B6879C484B93D6F68CBAF5C6E83EB8566A96BBAFBAFFD0D26E2B531866F7A1D7678D1CC99A1F73D473789463E162DDFC9CBA54E116EA4365399BBA2828CBE991909E02D2EB0B5B36464F25516F3CA4D75F849E17D2538AD06B96384E9FC471B660F44801EF17893F4A007F95119E4709E04F8CDE78897A5E897ACD12F57C12F55A307A72013CC845E8A924EA8D97A8E795A8D72C51CF2751AF05A14773B21A802D6A3398776BA3BBAED18DCE4EB4BE3522FB71912EB85F4873CFCA643338CD3DEB3BD05F56561694E1F626C1E0E8125BAB0F931D095A633571E198361B8D4171B35103E17C79AB0890B105B1C95208D26587C0FFB0577340AF56E0AC71D697BB6BEB51AF6677D8DA1F23877BD9B544E86555A4B8974D6008292FEBDFA72D51076F1DC08950BF17C2ED209C0DE174F83E02F02680CD46AD2D345F4CACDA70D246CB43A4E9264CAAE5AB9600690901391C5F2BC8105FD365228D7389470A5FE95C7C04FF93B836127F30672E04C76438372C1F4A097CF0CDB7BEDAE576D6F3CF7762480E37E3E3A019FF40A48778B6490E0700A72066716746640BA7209C24C43BA07BF686FA15102E2322B327E3BB3FCBEAF4E3E06552ADC30885D0C2EA09938558072787B38E3C2A641D599438EB201E6262193F0944FC2410CC12227CD4104336F9D8D1D6374EA167D4B82761125C480E47901122A8ABC880497C18354107A1897D02EA9743F83D04112A223246C9A082B10A61186DF049ECB6EA9A72576D95A20A550001C3E814490E671F7F41E1FD2C910EBC22FA02680EC2269C08475D83E8879DF66C5908EFA122CBAF1C16C263E591EFB30EC29588E7A663D2C00327D09E70ADC660290CCEBBC1620E8EDBA0B5039B5BB6F1A7CCDC41C4A6756FA5EE5EB3A3BAD7EA790B3F4B37CC5E75A457D36B9E8D4F3EAA31E8FD26A15D1ED22739FD943606CA53D69B9CE595B80A515C59BF052AEBFBC8E252D6078A16B83C74232C148E3C0910FE94E04943987E863C31E5BDDE555E53C5535100F29220391C75BDA080F48648EA167918A9157E22E7CCE114A2928A1791C064881A7489000A09E2F4A0D008ED202C8F1F8560A1DC9EEBEB2CA02E38D5298443A8BE71E64C457E794343CC4268134462472AEE3B234242272C9F2260ED7752844E4588344DED94BA7A6743036A3F0B90D6E158391C6B3D20D60E895CAD334A49AC65722E930C0C854B687C513419C213108990C1B8D7F028986AC308E446BAD1FCDF64012354AB1C8E89AD1013752283A0E788E47D1379D80ED57E12B15A26DBCEAA42C0ACF2CD9E56A3C877D5A2F71702F60CC9E1663119AA066AC4DAF3068FD45924C3F7F9B81982BEEBF286637A9AD3E58A6945BB1AAA682FA0E256D1A6854D4431C231A7415889A8684FE6B06C4C9705C93337BADCD53CBB30013386E470EC9543EC1944B2B72BFA648A4A9A93046CA5F16E9EB2ECA862C00EDF4AD40BA593137584AF6E43E36BED9771FD24102065943CA15D625272FB0E1D5352D3D23B6574EE72D6D95D33CFE9D63DEBDC1E3D15BDCEEB9D7D7E9F0BFAE6E4F6EB3F60E085CA4183870CCD1B76D1F08B475C32F2D2CB46A9D4F91AAD4E5F60305E5E68325BACB6D145B4BDB8644CA9A3EC8A2BAF1A3B6E7C79C5844AE7C4AA49D5574F764DA9A9ADBBA6BEC1DD3875DAF41933AFBD6ED6F51EEFEC1B6EBCE9E65B6EBDEDF63BE6DC79D7DCBB9BEE9977EFFC05F7DDFFC0830B1F5AF4F0238F363FB678C9E34F3CB9F4A9654F3FB3FCD915CFAD5CF5FCEA175E5CB3F6A5975F59F7EA6BAFBFE17BF3ADB7DF59FFEE86F7DEFFE0C38F3EFE64E3A79B3EFB7CF3175BB67EB96DFB573B76EEDADDF2F537DF7EF7FD0F3FEEF969EFCFFBF6FFF2EB6FBFFFF1E75F7FFFF3EF81FF0E1E3A7CE428C3BBD228A9AE00E10EBBD208C8E1FC6A0FE4579922FDCAC3BC23352AA6B2672784EF5042CB9838953711BF9F0E8E555ABA192260B12CEE698936D544CCD7A80D165420CC23457E393A41690A26D35E5D53E59A11CB1AA33B54B22E88FF926F2C620DBE0031F1398474D2D4B2382EF920D28A9C539DF515F8CF6F9C1C8EB1891063D34532C67C2EB93CCE08733706F1B5651BCAF504D41A7055D821CE3B2CFF030377D10E]]>
</FileEmbedded>
</File>
<Variable Name="OnlyBass" Type="1"/>
<Variable Name="PressSpace"/>
<Variable Name="Time"/>
<Variable Name="Method"/>
<Variable Name="Volume"/>
</Content>
</ZApplication>
Re: SunVox for ZGE
Hi Ats,
K
You can use the sv_send_event function. Attached is a simple example ( use the left-mouse-button to toggle the "melody" on and off ).
K
- Attachments
-
- Foo.zip
- (1.36 KiB) Downloaded 863 times
Re: SunVox for ZGE
Thanks Kjell
I think I get it. It will be a bit more complicated to handle that method with several music files but it's very efficient!
Where did you find that 0x0100 is the for the volume? In SunVox source code?
I think I get it. It will be a bit more complicated to handle that method with several music files but it's very efficient!
Where did you find that 0x0100 is the for the volume? In SunVox source code?
Code: Select all
<?xml version="1.0" encoding="iso-8859-1" ?>
<ZApplication Name="App" Caption="ZGameEditor application" FileVersion="2">
<OnLoaded>
<ZExternalLibrary ModuleName="SunVox">
<Source>
<![CDATA[//
int sv_init(string dev, int freq, int channels, int flags) {}
int sv_deinit() {}
int sv_open_slot(int slot) {}
int sv_close_slot(int slot) {}
int sv_load(int slot, string name) {}
int sv_load_from_memory(int slot, xptr data, int data_size) {}
int sv_play(int slot) {}
int sv_play_from_beginning(int slot) {}
int sv_stop(int slot) {}
int sv_send_event(int slot, int channel_num, int note, int vel, int module, int ctl, int ctl_val) {}]]>
</Source>
</ZExternalLibrary>
<ZExpression>
<Expression>
<![CDATA[//
sv_init("", 44100, 2, 0);
sv_open_slot(0);
//sv_load(0, "Foo.sunvox");
sv_load_from_memory(0, MusicAllFile.FileEmbedded, MusicAllFile.Size);
sv_play_from_beginning(0);
Volume = 0x4000;]]>
</Expression>
</ZExpression>
</OnLoaded>
<OnUpdate>
<KeyPress Keys="{" RepeatDelay="0.25">
<OnPressed>
<ZExpression Expression="Toggle = !Toggle;"/>
</OnPressed>
</KeyPress>
<ZExpression>
<Expression>
<![CDATA[// sv_send_event(int slot,
// int channel_num,
// int note,
// int vel,
// int module, // SunVox Module n° + 1
// int ctl, // Volume
// int ctl_val) // Volume value
if (Toggle) // OFF
{
if (Volume > 0)
{
Volume -= 0x0200;
sv_send_event(0, 1, 0, 0, 2, 0x0100, Volume);//Generator
sv_send_event(0, 1, 0, 0, 6, 0x0100, Volume);//Kicker
sv_send_event(0, 1, 0, 0, 7, 0x0100, Volume);// Analog generator
sv_send_event(0, 1, 0, 0, 8, 0x0100, Volume);//Lead
// sv_send_event(0, 1, 0, 0, 11, 0x0100, Volume);//FuzzBass 0B
}
}
else
{
if (Volume < 0x4000)
{
Volume += 0x0200;
sv_send_event(0, 1, 0, 0, 2, 0x0100, Volume);
sv_send_event(0, 1, 0, 0, 6, 0x0100, Volume*2);//Should I retrieve module's original volume at the start?
sv_send_event(0, 1, 0, 0, 7, 0x0100, Volume);
sv_send_event(0, 1, 0, 0, 8, 0x0100, Volume);
// sv_send_event(0, 1, 0, 0, 11, 0x0100, Volume);
}
}]]>
</Expression>
</ZExpression>
</OnUpdate>
<OnClose>
<ZExpression>
<Expression>
<![CDATA[//
sv_stop(0);
sv_close_slot(0);
sv_deinit();]]>
</Expression>
</ZExpression>
</OnClose>
<Content>
<Variable Name="Toggle" Type="4"/>
<Variable Name="Volume" Type="1"/>
<File Name="MusicAllFile" Comment="Imported from music-all.sunvox">
<FileEmbedded>
<![CDATA[78DAED5A0D7C144715DFFBC817F90E148E260D9B122909012F4028C654F6721FB933F7C5DD254D620B494808912389F9E04BF0AE6AB55AACB1965A296D23B4D52A2215055B6C7B466A63AB524AA5524B89B5B5B482A256C5523877EE76EF86C9CEEDEEDC71D0FEBAF7BBBC3733EFCDECCCFFBD376FE6E26E743451ECD36874B9D52C55AA3314B56C01F06A559AA2D669A301BF99FDBA9D4603E053D9AFA7CE15E2D521DE309FE7EB1A1D56401BD9AF5D673316B154EFD6B90C3A37AD77D83D167B43838D6EDF409B1A9A1C260F6573EB43F2E3ECD7D6E270009E52B03CDB1AE2417D7394B7DADCF53CAF6F705979DE63B119015F0CDED3680DCD653290AF33DA015FC07E9D3A4F88CF0EF31E5E97E543FDA8006FF0E8C0F8F32865A84DCBD14A8E5671B49AA3351CBD01295723F295487F576AFF3A8E3AF5E6D05A29006FB584781AF0CDEE96086FB2D645D6D0A277803A4A033E9A29EC67AAE65ACDCC8A92D292074B46E9D1D6D14020A453A757712AB56136180C3A4DA608C2CEA6A6A608DFDCDC0CF82D8037DA0D148F90928AFB591CB2638A327334D9CF87E3C7373E6FA14A99167AC792377CAA9C40E14ABA9A7E595F5D3BA9FDC2CC02EDDAA23773B57967679C5D4266A1A5A885B28E33954ABBE88DF9F2748EE2DAE32DC7DB3F4E5F8394A723E542A44C1C43E0474DA5800F73B8D6E972BA1817710C3905641084265199C80A84CB7CBD9FABE7CB687B2A420B90723A47A720E50CA41FD2F1B3113A1D296721FD67206552848AD9991684FF2EA66607CA98394C39338FA1197A139D162045E8208A9012EC63E9098D3A65487F68FF5AA45C19E7F85584FA8B583D15BB001753154753121885D32FC9FBF38F3FCEF713B250468285DEFCF8FED38FDD77E0F88B738EAE2E2D9DD5317B4AB9A762E1BC416DD67CEBCEA75FAB23B3D0EDEF430B8DEA0BD34522ED5522ED0B44DAE5D24AA4AC45CAE87CE6C6B9FE6502FA4A8AE6A896A30C9626CA424F4E7BFBC653D793582813CB42D9D76A10C9B03EE8EDE47988DFE7D7B15FC6EFDBCEB01FDF6DCC70DFF0F211668409F84877B90E814C3117D9970BB9722E9207F065B47D12427179029A1FF0FAF9C8F8D720F5FCF87C196D4729DAAE41FACF4F501EC29E5F8BE97C6D3E7D8476D5DCC43A02C36C3A93359C7E7FAE92F54D950C845A2184C604A2BCD4A7BC2DBED354B92E4EFD0FC7BF24E3939E3659D709507D5451384405A83369415FD0E7A7C21FD218A286630862A90B44F2877291F60571668462FA62F98A56A47DAEE47C67E2A3A67273C9E88CB8A93F41FD8851D27CE4EEEE8A854D57EFC90E064F9C7B72734D0D6B86C10BBEF796346FDB61BCABAC2F47BAA50670F98853E78ADCB3727A0A488FC69D05393D8504BDD9B047088CA7C2E44D6332C66344C6C3E9C17B4C85801E25617E5B64E831847AAD227AB8F9F9213DAD080E38BD3119F63242682F2332EC05D61B271C2F2082BB42C27872ECC54F88FB08A15E80506F5C442F4DC27842F6A296B02E42714929C1FF4EC9D06308F55A09F5FC847A23847A0142BD7111BD5409387408D84BAA041CE4E8B512EAF909F54608F502847AE3227AE9127050CBD06308F55A09F5FC847A23847A0142BD718C9E9B93D503DEAEB38175770C0DF60D0DE2B35FB7299CF185789731F2FBB89B1B4BC33AA59B1BEB7550DFD2D21291E17E8B072FE76E7486F7264516E5D63BAC5CBAE7B6592C11719B450FF1B5EAB00890714678ABBD1E4C3B932F23536B86A656D7D9D3D9DF36D8DB8F9B9AA7D939E92239B1C9EEA7A2936514F2269B12A448261BFABF84465DA46B9E4F83EAFD109F0AF1A5109F07F723813F0C789BC5E08CAE57305114056DA93A0A9A71C5AADE58A731005A0A2F2786D76E4514AFF54A99C6B9D34782571E97EF81723A4785F08331F3623056A0D8B0786809F088B5DEA66EEF60677FECF54E8BCA89ADF87268C59F95E921BE63C4E100F0D998553C5E206CE12A884F97E21D509F33A17A1AE25B2861F494B1FA67515D7F09BC8CD43A2C5008ADEF5EB15A8A75707262D651A58A5A47914A9E7550F70613193F294CFCA430C852327CD49C403463A163E81F5AE3DED033B84A64838BCA89016481009A26336052CFC50DD0BBD0C23E04D5AB217E0C03044309F338195C306630863181BF82DD56D7D3E6EDEDA2BB700910308C7C213931FB78070AEF57C974E0DDF12740B7636CA213E3A8FB30F5B0D34E5546F9932A61F93D8BA2FC32B5703F0720BE03336E9EC83670CF65B42731AA37DBEB23EB6EB6DB22EF6D367880CD3D72E82D4D792575F8C068CE897DAF7497ECBD73DB0B79E65B1E3D5F32FC84EFD0C30FE8CDA69049187645F5159C7EF604038D91D65B3BDB3AC432447969FD5128AD9FA54C4A5ACF272D707A3888B15038F2A440FCF3548C6D48A43EA8B83CE9BDC9DBD6D31523A300E0A5437262D0954001E92999D06DF7054933FC34CE995108719B8A1FB381293139E84E091052D40703420B7483B02B7910A686FE9D215C3759425EF07E87100EA1A6A18D1BE9DAB681818485D06108C42C55D26F46A4844E583E5BC2D9EF8A089D7414347DEF9ABEFECE8101DC7D16002DF3623931D48A21D4CEC93CAD07B544A8693897C90086C26D68B1A26806C4AFC06C844111F75A1C0752131081DCC8B834F6FF7E004454613931245E8290E89319047DE789EF4DD4C80DD56905E6B4AC98B8AAB484558DB57A063D5DEBEDC5DF2FF0F60CC989AD6206940DF4C8B5E7677CA4ABA840EFF9B81582FE6F24663876AFEBF47A139AD1EE8532DAEB5449CB6873918568C038E63A88D76232DA2B392C5BF29411F06C43DEC1EE18B730BC19437262E8B541E89965A2F76AFC9B296ED35C25E12A2DE6E5298B0E930074629D44FDD07672B91EF4741B7DBF70BD92AB5700018552A54E494D4BCF989499959D939B975F3079CA5553A769A65F5D58744DF10CBAE4DA99A51F9975DDECB2F2391573E77D545B397FC1C2AA45D72FFE58F5C76B6EF8C4124657AB37184D7566CB27EBAD36BBC3B9D4E5F63434DED8D4DCF2A99B6E5EB6BCB5AD7D4547E7CAAE55DD9F5EED5DD3D3DBF799FE81C1A1B5EBD66FD8F8D94D9B3FE7F3DFF2F92F7CF1D62F7DF9B6AF7CF5F62D5FBBE3EBC3DFB8F39B776DBDFB5BF77C7BDBBDDBEFBBFF8191EFECD8F9E0430F7FF77B8F7CFF07BB7EB8FB477B1EFDF1DE9FFC74DFFE9F3DF6F8819F3FF1E453815F8CFEF2E0D3BF7A66ECD7CF3EF79BDFFEEED0F3875F38F2E2EF8FBEF487632FFFF195E3AF9E18FFD36B7F7EFD8DBFBC79F2ADB7FF7AEAF4DFFE7EE61FFFFCD73BFFFECF7FCFFEEFDD73EF9DBF108C79D268EC6E07E14EF4A4C1CB89F9D549C8AF3432FDCA173C481A157342FFA02CEC3B2AA9694C92D21BC1DF4FE7276A5BBA1502608732E9DB92DBDA23B85FE32E587081B04A21F397A3CBB44DC1607ABA7BBABC1B129963144229EBD6E41FF99661CEE05B310B5F469183A65326F1C80781E6EA5CDBD9DF2EFEF31B272786D84A08B1F532110B1E214E8F0B10770B627E6D3986733D09B9069C156626F986E5FF87E50951]]>
</FileEmbedded>
</File>
</Content>
</ZApplication>
Re: SunVox for ZGE
Hi Ats,
Volume is the first "controller" of the SpectraVoice module, hence a value of 0x0100 for the "ctl" argument.
K
From the original header ( sunvox.h ) included with the SunVox library.
Code: Select all
/*
sv_send_event() - send some event (note ON, note OFF, controller change, etc.)
Parameters:
slot;
track_num - track number within the pattern;
note: 0 - nothing; 1..127 - note num; 128 - note off; 129, 130... - see NOTECMD_xxx defines;
vel: velocity 1..129; 0 - default;
module: 0 - nothing; 1..255 - module number + 1;
ctl: 0xCCEE. CC - number of a controller (1..255). EE - effect;
ctl_val: value of controller or effect.
*/
int sv_send_event( int slot, int track_num, int note, int vel, int module, int ctl, int ctl_val ) SUNVOX_FN_ATTR;
K
Re: SunVox for ZGE
Hi everyone. I'm back on track with ZGE, trying to continue Omeganaut.
So here's my new problem: when I play on the game on Android and press the Android Navigation home button, the game is paused, normal, but the SunVox player continue to produce music. How should I pause the music too ?
I believe it has to do with the zegAtcivity.java onPause() function that, maybe, should pause the libsunvox.so library ?
Or is it something else?
Thanks for your help
So here's my new problem: when I play on the game on Android and press the Android Navigation home button, the game is paused, normal, but the SunVox player continue to produce music. How should I pause the music too ?
I believe it has to do with the zegAtcivity.java onPause() function that, maybe, should pause the libsunvox.so library ?
Or is it something else?
Thanks for your help
Re: SunVox for ZGE
Hi Ats. Also for me it's a long time ago when I touched ZGE. However, you can try to use the KeyPress component. If you read its help page, it's saying that CharCode 255 represents loosing of application focus on Android. So calling sv_stop() from embedded ZExpression should work. Similarly, CharCode 254 means that the application got focus, so you could call sv_play() to resume playing.
Re: SunVox for ZGE
Wow, that was a quick response. I'm glad you're still here Rado1
I'm going to try that.
Edit: And it's working perfectly ! Thanks
I'm going to try that.
Edit: And it's working perfectly ! Thanks
Re: SunVox for ZGE
Hi guys. Good it was solved
Re: SunVox for ZGE
Hi, I'm trying to run my test ZgeSunVox.zgeproj in linux, but I don't know what to do with the sunvox.so library...
My ZgeSunVox.zgeproj test won't launch on Linux even though there's the x86 sunvox.so in the same folder. How is it supposed to work?
Since linux is case sensitive, I tried to rename sunvox.so to SunVox.so but it's not working either.
I also tried copying sunvox.so to
without success...
I also tried everything I could do with LD_RUN_PATH to search the lib somewehere before launching ZgeSunVox.
Do I need to link the library during the build? Maybe with upx? The SunVox linux program is working without the library, so I guess the library is merged with the executable!?
My ZgeSunVox.zgeproj test won't launch on Linux even though there's the x86 sunvox.so in the same folder. How is it supposed to work?
Since linux is case sensitive, I tried to rename sunvox.so to SunVox.so but it's not working either.
I also tried copying sunvox.so to
Code: Select all
/usr/local/lib/
/usr/lib/
/lib/
I also tried everything I could do with LD_RUN_PATH to search the lib somewehere before launching ZgeSunVox.
Do I need to link the library during the build? Maybe with upx? The SunVox linux program is working without the library, so I guess the library is merged with the executable!?
Last edited by Ats on Wed Apr 07, 2021 3:20 pm, edited 2 times in total.
Re: SunVox for ZGE
Unfortunately, I do not have Linux, so cannot help you much. Probably Ville could. On windows, the library should be included in the same directory as the project/exe file.
Re: SunVox for ZGE
Too bad, as I was kind of expecting you to help me compile ZgeBullet library for linux in my next step
So I'm currently reading this: https://aimlesslygoingforward.com/blog/ ... -on-linux/
It's interesting and comprehensible. But the weird thing is that there's no trace of sunvox.so in my ZgeSunVox test:
Edit:
I just tried renaming the ZExternalLibrary ModuleName from "SunVox" to "sunvox", but also "sunvox.so", which prevents the Windows version from running.
On linux, the terminal just trace that ModuleName then the app shuts down...
So I'm currently reading this: https://aimlesslygoingforward.com/blog/ ... -on-linux/
It's interesting and comprehensible. But the weird thing is that there's no trace of sunvox.so in my ZgeSunVox test:
Code: Select all
readelf -d ZgeSunVox
Dynamic section at offset 0x62f04 contains 26 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libSDL-1.2.so.0]
0x00000001 (NEEDED) Shared library: [libpthread.so.0]
0x00000001 (NEEDED) Shared library: [libdl.so.2]
0x00000001 (NEEDED) Shared library: [librt.so.1]
0x00000001 (NEEDED) Shared library: [libcrypt.so.1]
0x00000001 (NEEDED) Shared library: [libc.so.6]
0x0000000c (INIT) 0x8049000
0x0000000d (FINI) 0x80a4cf8
0x00000004 (HASH) 0x8048168
0x6ffffef5 (GNU_HASH) 0x8048230
0x00000005 (STRTAB) 0x8048450
0x00000006 (SYMTAB) 0x8048260
0x0000000a (STRSZ) 473 (bytes)
0x0000000b (SYMENT) 16 (bytes)
0x00000015 (DEBUG) 0x0
0x00000003 (PLTGOT) 0x80ac000
0x00000002 (PLTRELSZ) 200 (bytes)
0x00000014 (PLTREL) REL
0x00000017 (JMPREL) 0x80486c0
0x00000011 (REL) 0x80486b8
0x00000012 (RELSZ) 8 (bytes)
0x00000013 (RELENT) 8 (bytes)
0x6ffffffe (VERNEED) 0x8048668
0x6fffffff (VERNEEDNUM) 2
0x6ffffff0 (VERSYM) 0x804862a
0x00000000 (NULL) 0x0
I just tried renaming the ZExternalLibrary ModuleName from "SunVox" to "sunvox", but also "sunvox.so", which prevents the Windows version from running.
On linux, the terminal just trace that ModuleName then the app shuts down...
Re: SunVox for ZGE
Hi Ats,
The ZExternalLibrary component loads a external library at runtime. On Linux this is done using dlopen. Have you tried prefixing your ModuleName with a "/" so it looks for the .so file in the directory of your executable?
K
The ZExternalLibrary component loads a external library at runtime. On Linux this is done using dlopen. Have you tried prefixing your ModuleName with a "/" so it looks for the .so file in the directory of your executable?
K
Re: SunVox for ZGE
Thanks for the hint. I finally got something different. I had to type "./sunvox.so" for the ModuleName. Same as Android libs in fact...
So I get a new crash:
The address code is different at each and every crash. But I managed to find where it crashes:
sv_load_from_memory(0, MusicFile.FileEmbedded, MusicFile.Size);
Which is working on Windows and Android.
I also tried to load an external file instead with the exact same result:
sv_load(0, "./completedestruction.sunvox");
So I get a new crash:
Code: Select all
Desired audio buffer size: 2048 frames
ALSA: pulse
ALSA HW Default rate: 44100
ALSA HW Rate: 44100 frames
ALSA HW Buffer size: 4096 frames
ALSA HW Period size: 227
ALSA HW Periods: 0
ALSA SW Avail min: 227
ALSA SW Start threshold: 1
ALSA SW Stop threshold: 4096
An unhandled exception occurred at $ADD8D1FE:
EAccessViolation: Access violation
$ADD8D1FE
sv_load_from_memory(0, MusicFile.FileEmbedded, MusicFile.Size);
Which is working on Windows and Android.
I also tried to load an external file instead with the exact same result:
sv_load(0, "./completedestruction.sunvox");