Web Enabled Audio and Sound Enhancement Library (aka the Weasel audio library) Copyright 2011, 2012, 2013 Warren Willmey. Change Log: # # ---------------------------------------------------------------------------- # Version: 1.9.1 Date: 2018/02/26 (February 26th 2018) Enhancements: * demo1.html (Jukebox) TCB (The Carebears) X-Y style oscilloscopes based on their TCB Soundtracker from the Atari ST. * demo1.html (Jukebox) Note Dots display option based upon ScreamTracker V3 highly popular visual display Note Dots 8. Bug Fixes: * Missing test for Protracker & Fasttracker BrowserAudio getModule() function. * Protracker & Fasttracker _computeSequenceTableTicks() stuck in infinite loop when module only uses 1 pattern and uses Position Jump (B) and Pattern Break (D) to jump to self, so cannot work out how long the module is. # # ---------------------------------------------------------------------------- # Version: 1.9.0 Date: 2017/11/29 (November 29th 2017) Bad News: * Mozilla's Audio Data API was removed from Firefox 28+ :( AudioContext only from now on.. Note: * The FST (or Fasttracker/Taketracker) format is a bit of a moving target, no single implementation defines it. The Weasel Audio Library's implementation is more targeted at the Fasttracker 2 version, which allows modules with upto 32 channels. Stories: * Added support for FST modules. Change: * Interpolation type weasel.Channel.prototype.SupportedInterpolationTypes.Amiga changed to weasel.Channel.prototype.SupportedInterpolationTypes.None as this is a more accurate meaning and representative of early PC replay routines (besides which the Amiga output is actually closer to the .RLM$D_Alias_Reduction interpolation most likely due to capacitor charge/discharge rates). Enhancements: * demo3.html (fractal zoomer) now supports drag and drop of modules onto it. Bug Fixes: * Protracker Not restoring the Note Period for effect that are not processed on Tick 0. * Loop Quirks is incorrect for switching from a looped sample to a non looped sample (see/hear SampleLoopQuirks.mod pattern 1: Loop Quirk (four*) ). * AudioContext Stop/Start with a different module is playing 10-20ms of old module, BroswerAudio.setModule() now clears the AudioBuffer. # # ---------------------------------------------------------------------------- # Version: 1.8.0 Date: 2013/10/15 (October 15th 2013) Bad News: * Looks like the Mozilla's Audio Data API has been deprecated and is set to be removed in preference for the new Web Audio API Standard (AudioContext) BOO-HISSS!. If you open a console in a currentish Firefox (21-24) you will get a warning message as follows: "The Mozilla Audio Data API is deprecated. Please use the Web Audio API instead.". You can enabled Web Audio instead of Mozilla Audio via the "about:config" URL, and set the Preference "media.webaudio.enabled" to true restart your browser and bingo. (To disable it set it back to false). Currently it seems to ignore system settings for audio playback and always outputs at 48Khz (with no ability to change it from the JavaScript or the Web Browser). The implementation is slightly different from WebKit as the specification changed and I encountered a AudioNode.disconnect() bug/difference from WebKit which had to be worked around. * Bye Bye Mozilla Audio you shall be missed :( I shall not be removing the Mozilla Audio sub system any time soon as there are loads Firefox browsers that use it in LTS (Long Term Support, such as Ubuntu and Debian IceWeasel 19 will be around for years yet). Note: * Spreadpoint Soundtracker 2.5 modules cannot be 100% identified unless they use the new commands introduced they will be considered Spreadpoint Soundtracker 2.3 modules. The Module Sniffer will consider them 2.3 modules if they pass the Sniff test first. This may be a problem if the module relies on the Sample Loop modes of 2.5 (which is the same as Noisetracker/Protracker). Stories: * Added support for Mnemotron's, Mahoney & Kaktus's Spreadpoint Soundtracker 2.5 modules, which are near identical to Noisetracker 1.1 minus Song Restart Position and Set Tick Speed is a modulus instead of clamped. * Weasel Library Regression Check as an automated means of detecting changes in a library revision from Soundtracker modules, gathers the file size, module type, generate a SHA-1 checksum and compare them to previous Weasel library versions to see if there are a any changes (possible regressions). * Provide a command line interface for the Module Sniffer, for use by the Weasel Library Regression Check. * Weasel Soundtracker Module To Raw Converter, directly record to a file a Soundtracker Module. Able to set the replay frequency, volume, mixer type and interpolation. Also a per channel mode. * Weasel Library Regression Check results page, an easy to view HTML results page. * Support for the new Web Audio API (AudioContext), as used in Firefox 21+, whilst still maintaining compatibility with existing WebKit implementations (webkitAudioContext). * Jukebox (demo1) detect and use the requestAnimationFrame function, which is a callback function for Vertical Synchronisation (VSync) with the monitor, allowing for (finally) smooth screen updates in JavaScript. Update the screen at the monitors refresh rate (not necessarily 60hz). Not all Operating Systems support (or expose) TRUE Hardware Vsync for application use, such as Linux, Windows XP (unless your have the correct Gfx Driver). So the right combination of OS, Gfx Card, Gfx Driver and Browser is required for TRUE Hardware Vsync otherwise it is simulated. In such situations the Browser typically simulates a 60hz timer, this timer is considerably more accurate and stable than the JavaScript Interval Timer and does not use the JavaScript Event Queue (so does not clog it up, create additional garbage activity and uses less CPU). But if your monitor is set to 70/85/120Hz and your only getting 60fps this is probably why. (In Firefox you can change this value to match your monitors refresh rate via about:config "layout.frame_rate" -1 = Vsync, any other value is the refresh rate, e.g. 75 for 75hz). Enhancements: * Noisetracker Song Restart Sequence Position now supported. * BrowserAudio.getProfileInMS(), if the high resolution timer is used then this function returns a more accurate result as it ignores the Date.now() - Date.now() = 0ms hole encountered on very low resolution systems. * Jukebox (demo1) Settings->Profiling Information is now independent of the Interval Timer Rate (because of the use of the requestAnimationFrame function it could be inaccurate). * Jukebox (demo1) The light green graph line to draw Audio CPU usage is scaled by times 4 to see some actual detail (or its usually just a pixel high). * weasel.ModuleSniffer() now checks for bad Pattern Note Period values in M.K. modules (Spreadpoint, Noisetracker, Protracker etc), there are only 36 notes and "no note" (making 37 valid values in total). However due to corrupt disks and bad packers it is possible to come across non-valid values. * weasel.ModuleSniffer() now checks patterns for valid Instrument Numbers values in M.K. modules. Only 0-31 is valid, but due to bit rot occasionally duff values are found. * weasel.ModuleSniffer() for Protracker M.K. modules checks to see if Effect Command 8 and Extended Effect Command E8x are used, as they are NOT valid Protracker Commands (they are unused). If bNotSoStrict mode is enabled for scanning then these effects are allowed through. Bug Fixes: * weasel.MKPatternCell.setCell() was allowing instrument numbers > 31 through. Bit of a grey area as the pattern data allows for 255 instruments, the M.K. module format however only has 31 instrument slots. The module encountered this bug was a version of "project-x_remix" by Allister Brimble (filename: "MOD.project-x_remix") which had duff data in Pattern 7 Row 27 Channel 4 and surprisingly caused the Jukebox to crash via the MKPatternCell() object, the audio library carried on playing though. * Protracker M.K. needs valid Note Periods in the Pattern data or the fine tune values cannot be found non-valid Note Periods. Mostly source of these are that the module came from an (Amiga) corrupt floppy disk or the module has at some point been compressed with a bad packer (which introduces corruption, not that uncommon at the time!). # # ---------------------------------------------------------------------------- # Version: 1.7.2 Date: 2013/9/8 (September 8th 2013) Thanks must go out again to Sylvain Chipaux who has been listening! :) Stories: * Protracker 3 Set Sample Offset (9xx) mode, as this command behaves slightly differently than earlier Protrackers (fewer quirks, see the Weasel Doc Protracker commands for details). When this mode is enabled it only adds the Offset in the command to the starting address of the sample once before playing the sample. In the Weasel Jukebox this mode can be found under Settings->Song->Sample Offset. Enhancements: * DMA Pause (that occurs between samples end and starting along with the ED0 command) has been refined to match the Amiga value better. Protracker 3 Editor does a very good job of removing any pause (near zero) and eliminates the software pause associated with the ED0 command and Retrigger Note (E96), the Weasel Library now has a Protracker DMA Wait mode which is enabled when Protracker 3 Set Sample Offset (9xx) mode is enabled. Bug Fixes: * Protracker Pattern Break (Dxx) used in same pattern with Row Delay (EEx) caused jump to Dxx +1. This was a regression bug :( Bug spotted by Sylvain Chipaux! * Protracker Set Sample Offset (9xx) has LOTS of quirks associated with it. Firstly the Offset value is ADDED to the starting address of the sample before AND after playing the sample (so an offset of 910 would cause the sample to start playing at 0x1000 as expected, but subsequent use of 900 will be started from 0x2000). Any use of 9xx without a Sample Number (including 900) WILL move the Sample Offset further along, again being applied before AND after playing. The Commands Note Delay and Retrigger will also use the new Sample Offset value unless a Sample Number is present in the pattern cell. This bug was initially spotted by Sylvain Chipaux whose hyper attentive ear picked up an odd note in Noiseless's Signia mod, it soon became a "How far down the rabbit hole" issue! Notes: * I still haven't quite got the software DMA pause value correct, it is however closer. I monitored how long this pause takes on an Amiga using CIA A Timer B, the value can vary but by far the most consistent value was 361 for a single pause (361/.709379)/1000 = 0.508895809ms when using either Chip or Fast RAM. However sampling the audio from an Amiga with lots of ED0 commands thrown at it revealed that the pause is indeed longer and more varied (a difference between sampling the same module can often be seen). * The Tab key on my trusty Amiga 500 has stopped working :( Kinda need that in Devpac 2 and MonAm! # # ---------------------------------------------------------------------------- # Version: 1.7.1 Date: 2013/8/27 (August 27th 2013) Thanks must go out to Sylvain Chipaux for his encyclopedic knowledge of Protracker bugs & quirks and for point out Protracker has a VBL mode! Stories: * Add Protracker VBL mode support, as Protracker has 2 modes of operation BPM and VBL. In VBL (Vertical Blank) mode the playback is locked to the refresh rate of the TV/Monitor so can be either PAL or NTSC, also the Set Speed command behaves different in that it allows a Tick Speed of 1-255. Some mods actually use this mode and will not play correctly in BPM mode, such as Jogeir Liljedahl's "Slow motion". * Protracker Note Delay on Tick 0 (ED0) and Retrigger (E9x) cause actual software pauses in the replay routine (6000 clock cycles) which delay the other channels. These effects are accumulative, three ED0's will cause a pause 3 times bigger than just one ED0 command. Behaviour changes: * Calling weasel.ProTrackerMK.timingOverride() on a Protracker module and switching to PAL or NTSC from BPM causes the module patterns to be rescanned and the Time Duration of the module recalculated and sets the module to Protracker VBL Mode. Switching back to BPM mode also causes a rescan. * In order to switch to Protracker VBL mode in the Jukebox go to Settings->Song->Speed->Beats Per Minute->PAL (or NTSC). This causes the modules patterns to be rescanned and the Time Duration of the module recalculated. Bug Fixes: * weasel.ModuleSniffer - Noisetracker 1.1 & 2.0 modules actually allow a Tick Speed greater that 31 in the patterns, however the values are clamped by the replay routine to 31. The module sniffer will now allow Tick Speeds greater than 31 so that Noisetracker modules can be detected correctly (in this case module "klisje paa klisje" by Walkman was not being correctly sniffed as a Noisetracker module). Bug spotted by Sylvain Chipaux! * Protracker Row Delay was not processing the Extended Commands correctly, so that commands like Fine Volume Slide were only being applied once, not multiple times. Bug spotted by Sylvain Chipaux! * Protracker command Retrigger Note (E96) can occur on Tick 0, but only if there is NO note. * Protracker Quirk - Row Delay (EEx) combined with Pattern Break (Dxx) causes a row to be skipped, so it jumps to row Dxx + 1 instead. Notes: * I haven't quite got the software DMA pause value correct, it should be ((300 * 10 Clock Cycles)/7093790 (PAL CPU Clock Speed)) * 1000ms but measured values from an Amiga indicate it is nearly twice this value. Even taking into account DMA access its still not quite right, so need to do some low level testing on an Amiga to puzzle this one out. # # ---------------------------------------------------------------------------- # Version: 1.7.0 Date: 2013/8/14 (August 14th 2013) Stories: * Add Protracker support. * Module Sniffer function ModuleSniffer.getAllReasons() added to return a log of reasons as to why it failed on a module, as opposed to just the last reason. This is because there are now lots of different formats and it was difficult to spot why a module was failing. Behaviour changes: * Changed the default volume in the Weasel Jukebox (Demo 1) to 76% as some modules use fatterned samples which may end up sounding blown when using RLM-D FAT at 100%. * Module Sniffer will now allow through overlapping samples (where the loop point exceeds the end of the sample and goes into the next sample's data) as long as it does not exceed the end of the file. This is because the all the default Soundtracker replay routines treat all the samples as one big contiguous block of data, not as separate samples. There is a known issue with this, for Protracker Modules that use the "Invert Loop" command on a overlapping sample (on the actual overlapping data) it would cause 2 or more samples to be modified. This event is extremely unlikely to occur and the Weasel Audio Library does not emulate this, only the intended sample is modified. Enhancements: * Added support for 4 channel modules saved from Bjorn Wessen's StarTrekker series, these modules are treated as Noisetracker 2 modules as they are identical in every way except for "M.K." marker bytes are now "FLT4" (Fairlight 4 channels). StarTrekker is a branch of the Noisetracker 2 Editors code base, the 4 channel replay routine is identical. StarTrekker's 8 channel modules are not yet supported. * Added support for Looped Sample Chaining (the ability to play another sample the exact moment the current sample ends) to Noisetracker/Protracker. This is used a lot by "Chip Tunes" as it allows changing the waveform on the fly (e.g. 4-Mat's MTS - Multi-tone system). * Added support for Sample Loop offset 0 behaviour/quirk to Noisetracker/Protracker. If (and only if) the sample loop offset is set to zero then the entire sample is played first THEN the loop point is played as normal. * Jukebox (demo1) displays ModuleSniffer.getAllReasons() when a module fails to load, as a tool tip in the Play List (as a red entry). * Module Sniffer to allow overlapping samples through the detection, where the loop end goes beyond the end of the sample but not beyond the end of file. Bug Fixes: * Noisetracker Arpeggio now behaves as the Noisetracker Editor does when beyond the range of its table (it just hits a bank of zeros). * Module sniffer for failed Noisetracker 2 modules was returning a message saying it was Noisetracker 1.1 when the sample lengths where too long, it now say Noisetracker 2. * Noisetracker 1.1 was not restoring the Note Period when certain effects are played or none (basically 0, 5-15 commands). This caused the Note Period to stay at its previous value (such as after a vibrato) which is incorrect. Under certain circumstances this made things sound out of tune. * Noisetracker 2.0 was not restoring the Note Period when certain effects are played or none (basically 0, 7-15 commands). This caused the Note Period to stay at its previous value (such as after a vibrato) which is incorrect. Under certain circumstances this made things sound out of tune. * Noisetracker 1.1/2.0 was setting the Note Portamento speed at the wrong moment (it was being set in the Preprocess effect stage, instead on during process change effect stage). * Noisetracker 2.0 was forcing Noisetracker 1.1 to use its _processChannelEffect(), now it uses its original _processChannelEffect() function (as in release 1.5.0). Although in theory it should not have been a problem as the Module Sniffer should have stopped any unwanted effects from being processed during detection (unless the bNotSoStrict had been set). It might be possible to remove the Noisetracker 1.1 function entirely via a refactor. hmm... * Noisetracker 1.1/2.0 Note Portamento was active when the Target Note was zero, causing pitch bend upwards. # # ---------------------------------------------------------------------------- # Version: 1.6.0 Date: 2013/4/24 (April 24th 2013) Note: * Noisetracker 2.0 modules cannot be 100% identified unless they use Noisetracker 2.0 commands they may be considered Noisetracker 1.1 modules. unfortunately the Vibrato Commands are slightly different between 1.1 & 2.0 resulting in the playback being different IF the Vibrato command is used. By using the Module.setVibratoMode() function it is possible to switch between the two available Vibrato modes of operation and allow the module to play correctly. This feature can also be found in the Jukebox (demo1) under "Settings->Song->Vibrato". Stories: * Add Noisetracker 2.0 support. * Refactor Volume Slide command, present in various trackers, into a common function. * Add ability to change Vibrato Mode for Noisetracker 1.1/2.0 modules to the Jukebox (demo1). # # ---------------------------------------------------------------------------- # Version: 1.5.0 Date: 2013/4/18 (April 18th 2013) Stories: * Add Noisetracker 1.1 support. Bug Fixes: * When using Arpeggio and Pitch Bend commands sequentially together they were not behaving as early Soundtracker routines would which had separate period values for these two Effect Commands (a Pitch Bend followed by Arpeggio would arpeggio at the original note period NOT the resultant Pitch Bend note period. Pitch Bending again would pitch bend from the last pitch bended period NOT from the arpeggio note period). # # ---------------------------------------------------------------------------- # Version: 1.4.1 Date: 2013/3/26 (March 26th 2013) Note: * Weasel Task Profiler is still in a prototype state, although functioning and usable it currently does not have a complete Unit Test coverage. * Strangely the Type Arrays data type may actually be slower than the normal Window.Array/List on certain browser/CPU architecture. Stories: * Add support for the unsigned byte array data type (window.Uint8Array) usage if the browser supports it. * Add barrel loop to looped samples, this is purely intended for performance enhancement of small looped samples and should be transparent to the usage of looped samples. * Update sample replay of looped samples to use the barrel loop if found. * Remove recursion from playing looped samples. * Weasel Task Profiler, to time how long common tasks take against different versions of the Weasel Audio Library to check for performance regressions. Behaviour changes: * Looped samples have a barrel loop added automatically, this may result in the sample data changing if the loop is not at the end of the sample. Enhancements: * weasel.Helper.convertStringToArray() now returns a Uint8Array typed array if the browser supports it. * weasel.Helper.base64Decode() speed up and causes less garbage whilst running. * weasel.Helper.base64Decode() now returns a Uint8Array typed array if the browser supports it. Bug Fixes: * The 4 additional samples added to non-looping samples are now set to the last sample value used in the sample instead of zero. * If calling weasel.Channel.make( iSamplesToFill ) with to many iSamplesToFill the browser would cause an exception with "too much recursion" error as their stack size is set too small (the size of the stack varies from browser to browser). * On very slow machines (like the Raspberry PI) Audio.mozWriteAudio() can generate exceptions "Component returned failure code 0x80004005 (NS_ERROR_FAILURE)." It is now caught with a try catch block. # # ---------------------------------------------------------------------------- # Version: 1.4.0 Date: 2012/12/7 (December 7th 2012) Note: * Turns out the M.K. format is widely abused like the Ultimate Soundtracker format, both Noisetracker and Protracker save modules as M.K. but interpret some of the data differently. Most notably the sample loop starting positions and the Song BPM Speed. So although a module might have a M.K. ID it does not make it a Spreadpoint Soundtracker 2.3 module, even if the Effect Commands are supported! * Quite difficult to find genuine Spreadpoint Soundtracker 2.3 modules as Noisetracker was released shortly after and most modules have since been converted to Protracker. Stories: * Add support for the original Michael Klep's "M.K." 31 sample modules introduced with Mnemotron's Spreadpoint Soundtracker 2.3/2.4. Behaviour changes: * There are two types of Pattern Cell objects, one supports the M.K. format, the other Ultimate Soundtracker etc. * weasel.PatternColumn() constructor now takes a parameter to determine which type of Pattern Cell to use. Enhancements: * Jukebox (demo1) Added ability to see all 31 samples when a M.K. module is loaded. * Jukebox (demo1) Add a legend and colour coding to the sample list, so its obvious which samples are used, loop and corrupt. Bug Fixes: * weasel.Channel.setSampleAccumulator() was ignoring Master Volume, so caused a audible click if Master Volume is set to zero and a new note is played. * Jukebox.Display.drawSampleOnCanvas() hung when trying to draw an instrument which did exist (for example trying to display instrument 20 when a Ultimate Soundtracker module is loaded that only has 15 samples). * Jukebox (demo1) when the jukebox is first loaded (without autoplay enabled) and no module has been selected, if the Master Volume is changed (to zero for example) and then a module played, the Master Volume change is ignored. Bug reported by Sylvain Chipaux, cheers! # # ---------------------------------------------------------------------------- # Version: 1.3.1 Date: 2012/11/22 (November 22th 2012) Thanks must go out to Sylvain Chipaux, for being a sounding board, ideas man and being the main person willing to deal with all those corrupt IFF headers! Cheers man! Note: * This release is mainly about making the Jukebox (demo1) into a more usable application, possibly to spin it off into its own project in the future. * Added support to use the (LGPL 3) JSXCompressor library (part of the JSXGraph project AKA JXG) which if found is used to decompress gzipped and zipped modules. * The new Weasel Jukebox API currently can only add entries to the play list via DOM Storage, not all browsers have this yet, but this method allows entries to be added from multiple tabs/windows instead of just a single page. DOM Storage needs to be enabled and on certain browsers (Firefox & Chromium/Chrome) Cookies must also be enabled in to be allowed to use DOM Storage. Stories: * Helper.easyPlay() now supports compressed modules (.gz & .zip) if the JSXCompressor library is found. * Jukebox (demo1) Option to display the module name clearly (not just in the background) and the type of module replay used. * Jukebox (demo1) Export of Weasel Jukebox Play List as a JSON text file. (Does not include locally dragged and dropped files). * Jukebox (demo1) Import of Weasel Jukebox Play List. * Jukebox (demo1) Support drag and drop of Weasel Jukebox play list. * Jukebox (demo1) Load a Weasel Jukebox play list from the URL. * Jukebox (demo1) Weasel Jukebox API for easy adding modules to the play list from a web page. (Done via DOM Storage). * Jukebox (demo1) Start adding unit tests for the jukebox (hurray!). Behaviour changes: * The Module Sniffer will now allow samples of length 0 but have a loop offset and loop length set through, allowing some modules marked as corrupt to play. This seems to be caused by Soundtracker Editors when the composer removes a unused sample (only the length is set to zero). However early Soundtracker files do not have a "magic" id/watermark to identify itself as a module, so hopefully this wont affect the ID'ing of modules from random data files. Enhancements: * The Module Sniffer will now allow samples of length 0 that have a loop offset and length through. * Jukebox (demo1) Loaded files are now cached (uncompressed), reducing bandwidth to server if module is played again. * Jukebox (demo1) Now able to select to turn off the display update when the window is in the background. This frees up lots of CPU time. * Jukebox (demo1) Auto Start URL parameter, allows automatic playing of music when the jukebox is opened (and not playing music). * Jukebox (demo1) removed all modules references from the demo1.html file, the default play list. Now all play list entries are loaded from the WeaselJukeboxPlayList.json file upon loading. Bug Fixes: * Jukebox (demo1) Clearing the play list now also removes the OptGroup (option group/headings) in the Opera browser. * Jukebox (demo1) Skip to next/previous pattern ending the song on DOC Soundtracker 2.2 modules due to the tracking of pattern usage (due to Sequence Position Jump Command its need to track when a song has finished when it revisits a sequence). # # ---------------------------------------------------------------------------- # Version: 1.3.0 Date: 2012/10/30 (October 30th 2012) Note: TJC Soundtracker 2 support is technically not 100% as it does not emulate the hardware based Frequency Modulation and Amplitude Modulation of the Amiga. The reason for this is due to the (surprisingly) complete lack of any TJC/Def Jam modules that actually use these features, I even asked Asle of the AMP project but all we could find where modules that used the Volume Slide and Auto Slide commands (Cheers Asle, thanks for looking!). I did come across a couple that used command 9, but they where obviously typos. So rather than bloat the code base with code that will never run or be used I thought it better not to implement these specific TJC features, at least until a few (if any exist, which I doubt) TJC modules turn up. API Changes: * ModuleSniffer.createModule() now requires a third parameter, the Sample Scan Mode (used for detecting/dealing with IFF Header residue), this has the knock-on affect of all module constructors needing this parameter (if your constructing them directly). Stories: * Add support for TJC Soundtracker 2 modules to the Weasel library. * Add support for Def Jam Soundtracker 3 modules (which basically extends TJC with added Set Tick Speed command) to the Weasel library. * Add support for Def Jam Soundtracker 3 to the converter script convertmodule.py. * Detect and remove corrupt IFF header residue from sample data, 73 of the 281 modules in my test directory have this IFF header present, that over 25% :O Behaviour changes: * The Easy Player scans for and remove IFF Headers from sample data. Enhancements: * The Demo 1 - Jukebox now has a volume scrollbar to adjust the volume. * The Demo 1 - Jukebox can change the scanning for and removal of IFF Header (ignore/clear/remove). Bug Fixes: * The setSampleAccumulator() function was not honouring the Channel Mute parameter, which caused a noticeable click on muted channels when (certain) samples are restarted. * Sequence Position Jump command for DOC Soundtracker 2.2 was limited to the first 64 sequences, not the whole 128 range. It is now the entire 128 range. * Module Sniffer, in Not So Strict mode when scanning for Ultimate Soundtracker 1.21 modules it would not allow any BPM speed other than 120. Now it does. * The Midori 0.2.2 web browser was not playing the HTMLAudio via dataURI correctly, it was looping the first dataURI given to it. It requires the call to Audio.load(), even though its WebKit based. So added UserAgent detection and it now plays modules correctly. Although Midori 0.2.2 absolutely hate the CSS menu (specifically selection boxes) and does not allow you to change any of the settings. * The Epiphany or "Web" Browser 2.30.6, also requires the Audio.load() function called to play correctly. CSS Menu is broken, but using tab and cursor keys allows selection! * ModuleSniffer now treats a Ultimate Soundtracker PitchBend commands that bends up and down at the same time as not a Ultimate Soundtracker modules (that is it will fail the sniffer), as this is more likely a TJC/DOC PitchBend Down command. # # ---------------------------------------------------------------------------- # Version: 1.2.0 Date: 2012/10/12 (October 12th 2012) Stories: * Add support for DOC Soundtracker 2.0 & 2.2 modules to Weasel library. * Add support for DOC Soundtracker 2.0 & 2.2 to the converter script convertmodule.py. Behaviour changes: * DOC Soundtracker 9 modules are now only sniffed in Strict Mode, the Not So Strict Mode only applies to DOC Soundtracker 2.2 modules. Enhancements: * Added setCurrentSequencePosition() function to modules so that you no longer need to change a modules Sequence Position attribute directly (in truth I forgot to add it!). Bug Fixes: * Corrected inheritance of module types (generated a warning message in Firefox when using **Strict** JavaScript mode about undefined parameters during construction). * More JSDoc tags corrected (odd that the Closure Compiler is not pointing some of these out). # # ---------------------------------------------------------------------------- # Version: 1.1.0 Date: 2012/10/01 (October 1st 2012) Stories: * DOC Soundtracker 9 module support. * The convertmodule.py script can convert to DOC Soundtracker 9 modules. Behaviour changes: * The module sniffer now ignores the bNotSoStrict flag for Ultimate Soundtracker modules, they now get detected as DOC Soundtracker 9 modules (which is what the modules where being treated as and converted to Ultimate Soundtracker modules on the fly). The sniffer still uses the bNotSoStrict flag for DOC Soundtracker 9 modules, so it is capable of playing DOC Soundtracker 2.x modules (it still ignores the unsupported Effect Commands). * Some refactoring under the hood, mainly to the sniffer, but if your digging deep into the library you many encounter some changes. * Dependency order changed, if your including the file individually. * DOC Soundtracker 9 modules need to be scanned from start to end to compute the playing time of the module, this is due to tick speed changes. However it only need to be done once at the start (changing the BPM speed after the module has been constructed is ok). Enhancements: * Added rudimentary filter support, its not particularly accurate (the roll-off is different) but it sounds reasonable. Its just an averaging filter so its rather quick. By default it is set to off and to ignore any Filter Effect Commands in the module. Bug Fixes: * Work around for major problem with Firefox (15.0 but might be other version too) on Windows XP, as Audio.mozCurrentSampleOffset() does not return a Long (64 bit integer). Meaning that after some > 134,148,864 samples are played it wraps round to zero (actually it get stuck at zero for half a second or so then starts again). After ~25:20 minutes @ 44.1Khz the audio breaks up (192Khz Stereo thats ~5:50s). If you change the replay rate you effectively reset to the counter to zero but the bug reappears. The work around stops the audio breaking up, but there is a slight pause in audio (unless the prebuffering is high enough) as the counter get stuck at zero. Only seems to effect Windows XP (cannot test on other versions of Windows, sorry). * Module Sniffer allowed Ultimate Soundtracker modules through with more than 64 patterns (this limit is set by the Editor not the file format and is valid for other Soundtrackers too). * A few JSDoc comments corrected (I'm sure there are others, there always are!). # # ---------------------------------------------------------------------------- # Version: 1.0.0 Initial release of library.