(define (row first . rest) `(tr (td (@ (align "right")) ,first) ,@(map (lambda (field) `(td (@ (align "left")) ,field)) rest))) (post :title "Firmware comparison between Wavedrums Original, Black and Oriental" :date (string->date* "2013-10-31 00:00") :tags '("DIY" "electronics" "music" "hacking" "wavedrum") (p [Since ,(ref "/posts/2013-08-11-hacking-the-wavedrum.html" "my first post on hacking the Wavedrum") two fellow musicians have sent me copies of the contents of their Wavedrum instruments, so I now have the data for the original silver issue, the black re-issue and the Oriental.]) (p [The differences between the data from the silver and the data from the black Wavedrum are very few. Of the files sent to me only five differ: ,(code [USER.BIN]), ,(code [CALIB.BIN]), ,(code [WD2_PROG.BIN]), ,(code [SYSTEM/VERSION.INF]), and ,(code [SYSTEM/WDX_M100.BIN]). ,(code [USER.BIN]) contains only the mapping of programmes to slots and banks, which have been altered by the respective owners of the two instruments, so it can safely be ignored. Likewise, ,(code [WD2_PROG.BIN]) contains custom user programmes and hence is of no interest.]) (p [,(code [CALIB.BIN]) contains as of yet unknown calibration information, just like the similarly named ,(code [CALIB.BOR]) on my Wavedrum Oriental. The contents of ,(code [CALIB.BIN]) from the original Wavedrum are identical to those of the matching file on the Oriental. The only difference that the Black has over the other two is a single digit. This is from the Oriental:]) (pre (code [01 00 00 75 00 00 00 00 02 00 00 00 00 00 00 00])) (p [And this is from the Black:]) (pre (code [01 00 00 75 00 00 00 00 01 00 00 00 00 00 00 00])) (p [Not very exciting.]) (p [,(code [SYSTEM/VERSION.INF]) contains the hardware/software versions. Here are the contents of the Original, followed by the Black and the Oriental:]) (pre (code [01 20 01 10 01 20 00 00 00 00 00 00 00 00 00 00 01 32 01 10 01 32 00 00 57 44 58 5F 00 00 00 00 02 02 01 10 02 02 00 00 57 44 4f 52 00 00 00 00])) (p [Again, these are in decimal notation and are in this format: firmware version (two bytes), sub-version (two bytes), data version (two-bytes), two empty bytes, four bytes for an optional identifier followed by four empty bytes.]) (table :align '("right") :headers '("Type" "Firmware" "Sub-version" "Data version" "Identifier") :rows '(("Original" "1.20" "1.10" "1.20" "none") ("Black" "1.32" "1.10" "1.32" "WDX_") ("Oriental" "2.02" "1.10" "2.02" "WDOR"))) (p [Looking at the version numbers above it becomes apparent that the sounds themselves are not covered by these numbers as the sounds on the Black are no different from those on the Original, yet the data version differs.]) (p [The file ,(code [SYSTEM/WDX_M100.BIN]) must be the firmware on both the Original and the Black Wavedrum, serving the same purpose as ,(code [SYSTEM/WDORM202.BIN]) on the Oriental. There are quite a few changes even between version 1.20 and 1.32, but I haven’t yet taken the time to analyse them. It is interesting to note, though, that every firmware file is ,(em [exactly]) one megabyte long, independent of the Wavedrum type. This is due to padding which in the Original firmware begins at offset 0xC967C, in the Black firmware at offset 0xC9C68, and in the Oriental firmware at offset 0xDCB64.]) (p [More to follow.]) (p [Read ,(ref "/tags/wavedrum.html" "more posts about the Wavedrum here").]))