The third Beta update (version 0.25.B3.1 since 2014-10-25 @ 15:20) just went live (downloadable here if you have a Download Key) and these are the most important updates & changes included:

  • Game breaking bug in a few levels (e.g. II-09, II-10, II-12, III-02 and III-03) where the level would pop up blank and then stall the whole game, needing a good-old-fashion restart (of the game, not the device) to recover. This was caused by an old version of the level descriptor files which updated themselves automatically and tried to write the new updated version back, but failing, since the asset library in compiled Unity apps are read-only (live and learn).
  • A bunch of new music from Svavar Knútur:
    • Baby, Would You Marry Me
      • The final, instrumental, “loop-friendly” version of this is ready (it’s SO awesome… plays on level I-01).
      • I also kept the full, “normal” song, at least for the time being for a bit of variety.
    • While the World Burns
      • Got the pure Ukulele version of this in “loop-friendly” mode although I might see if Svavar and I can’t add a little “meat” onto it similar to “Marry Me” (soft drums, a bit of bass, and background stuff to make it “fuller”).
      • Also added the full “normal” version of this temporarily, again for variety and also to see how the fully “pimped” up edit fits into the game.
    • Girl From Vancouver
      • An instrumental version of this is pending so I added the the full version temporarily to see how it fits, which it does brilliantly. It’s got the same overall feel as the rest of the music and grooves awesomely with the game.
    • Clementine
      • An instrumental version of this is also pending but the full version is still the “title” song in the menus and I also added it to a few levels cause it’s really good and deserves a full listen (which I doubt it’ll get in the menu).
    • New Unpublished Song (as far as I know)
      • Got a pure Ukulele version of a new song I’ve never heard from Svavar that I cut down to a nice loop. As with “World Burns” we might pimp it up a bit to add meat to the bones but it’s beautiful.
    • Komdu
      • Threw in three versions of the chorus of this song as “Win-Fanfare” at the end of the levels. One star plays the first chorus or intro to the song, just Svavar singing “Lalalallallala” and strumming his guitar, two stars play the full chorus from the middle of the song and three stars play the chorus from the end of the song where Svavar, the backups and the band go all out. I was having real trouble finding a good fanfare for the winning screen and initially threw this in more as a joke but it’s been growing on me, especially the contrast between the versions depending on the number of start. I might just keep this as is or work with Svavar to make a more fitting version of the tune depending on his professional opinion. :)
  • And on that note: I’ve completed the new “MusicManager” module that play’s all these beautiful tracks.
    • The key purpose of the MusicManager is not only to loop the audio but to take all the little sequence clips that constitute a “song” and assemble them in different order for each level so that the overall “piece” for each level will feel different even though it’s strictly speaking the same tune. For example; a long level might stretch out the intro and middle of a tune so that the song’s progression better fits the expected length of the level before looping all the way to the (almost) beginning again. This also means that I can make the “climax” and/or “climb” of a song coincide with running out of time to achieve a star. I could even (in theory, depending on how much time I want to spend on this) make the music’s “intensity” step up when the level is near completion.
    • The other nifty voodoo trick the MusicManager does is achieve “near” seamless looping of MP3 files and clips.
      • The problem here is that the MP3 compression needs to have a number of samples that is a multiple of 1152 and if that’s not the case, the uncompressed sample pool gets “padded” with silence both before and after the clip so it fulfills this criteria, causing a fractionally small, but still very audible noisy “skip” when it loops, and MP3 is the only option for audio compression on mobile platforms.
      • Another problem is that since Unity does it’s own compression and handling of the whole asset library so fiddling with the MP3 files after compression (removing the padding via brute-force trimming of the files themselves, which was my first attempted solution) is pointless, since Unity compresses everything, reintroducing the dreaded skip-causing “padding”.
      • Google-ing this pretty much turned up either half-assed partial solutions like:
        • Using uncompressed native audio files (not an option on mobile)
        • Creating huge pre-compiled pieces with distinct “fade-in/fade-out” beginnings and ends (i.e. just have the tune end and the start again, which isn’t looping last time I checked).
        • Compiling the game with the “skips” and then listening for every skip (which can be different in exact length depending on platform and even different depending on OS versions, installed codecs and hardware) and then hard-coding them out and recompiling.
        • …or just the general recommendation; “Not possible, don’t try!”
      • The solution was actually rather simple. I just had the computer itself listen for the length of the “skips” in every sequence during run-time after loading the music and compensate for them during looping (starting sequences a few samples later and starting the next sequence a few samples earlier). I’ll probably do a full blog on the technical side of this later for my fellow Game-Dev Geeks. :)
    • This also required the construction of sequence descriptor files for each tune, describing the different sequences in a tune and whether or not to automatically detect and remove the MP3 looping gaps at the start and/or end of a sequence, as well as “composition” descriptors of what sequences to order together and how and when to loop to what and so on and so forth.
  • And of course; a bunch of trivial bugs and tweaks and things like that.