echolevel
echolevel
199 posts
Brendan O'Callaghan Ratliff - composer, multi-instrumentalist, sound engineer and programmer. Audio Director at Cardboard Sword. Specialist in runtime dynamic music/audio systems for Unreal Engine, location sound recording for TV and film, and audio post production. This is a sporadically updated blog. See echolevel.co.uk for info, contact details, etc. all · game audio · post production · sound design · location sound · demoscene
Don't wanna be here? Send us removal request.
echolevel · 2 years ago
Photo
Tumblr media
I’ve been at this for [checks watch] 800 years now and I’ve almost tuned 1 entire reed. Out of 112. How accordion repairers can be arsed I have no idea. Who hurt you? #concertina #englishconcertina #freereed https://www.instagram.com/p/CdeAXwstnbV/?igshid=NGJjMDIxMWI=
9 notes · View notes
echolevel · 4 years ago
Text
Casio DG-10 MIDI out mod
Should’ve blogged this years ago. People email me about once a month asking for details and I reply with the following - don’t really have time to rewrite it or nicely format it right now, so I’ll just paste it as-is:
Tumblr media
If you check the last comment on this Instagram post ( https://instagram.com/p/xjomIjq_pq/ ), that should get you started - if you reached me via Tumblr, you might not've seen those comments... But I never got around to doing a full Tumblr post about it, so thanks for reminding me! It'll be a while yet before I find the time to make some diagrams, take some photos etc, but if you feel comfortable cracking open your DG-10 and poking around, you'll find that everything's fairly clearly laid out. You'll need to carefully unpack all the circuitboards and cardboard insulation layers, and the CPU's quite a fanny-on to access, but this doc will tell you exactly which one you should be looking for: http://www.warningwillrobinson.com.au/manuals/Casio%20DG10%20DG20%20service%20manual.pdf It's worth having a multimeter handy so you can double-check my instructions: the gist is that when you're playing notes on the guitar (which'll involve a bit of precarious finger acrobatics - I recommend laying the sections of the guitar on your lap for this) you should get corresponding spikes on the multimeter when it's touching pins 17 and GND. I crashed the DG-10 a few times by raking the wrong pins while confirming the info in the manual, but I found that pin 17 has to be counted from pin 1 on the top right going downwards. They then go from 32 on the bottom left up to 64 at the top. This is from the BACK of the CPU's board, where the soldered points are - and up/down are relative to the orientation of the board when you've got the guitar strings-down on your knees with the neck pointed out to your left, and the exposed board lifted up so it's accessible. Might not've explained that very well, but the worst I was able to do was crash the thing and have to replace the batteries to start it again. So once you've found the right pins, and ideally checked them by attaching some alligator clips/similar to a DIN-5 MIDI cable (be careful you don't short anything and wreck your MIDI interface! Most are pretty well protected and I've never ruined one, but there's a first time for everything - I accept no responsibility blah blah blah :), you're ready to solder a DIN-5 jack. MIDI is a unidirectional serial signal, so at its bare minimum it only needs two contacts - data and ground. DIN-5 MIDI normally just uses 2 or 3 of the available pins. Now...it's been a while, and I can't remember which two I soldered to on the jack...but I do remember that I found a bunch of conflicting pinout diagrams (most of which don't make much effort to specify whether they're showing the pins as viewed from the front or back of a jack) and had to resolder and swap the wires until I got it right. A few miniutes' googling will probably set you straight, though. Beyond that, it was just a case of Dremelling the hole and screwing in the jack's mounting plate as you can see here: https://instagram.com/p/xp_Z7Zq_oG/ Another caveat: proper MIDI circuits have various types of spike/ground-loop protection, with diodes and things in, but I don't really know much about that... This is a bit rough and ready, but I haven't experienced any problems and it's thus far been solid enough for occasional studio use either into a DAW or controlling a hardware synth directly. -------------------------- As for other mods, the only one I did was hijacking the 'string mute' button for an always-on option with a switch - also visible in that last pic. It's not much use, to be honest. I *was* a bit miffed to discover that while the DG-10's internals are almost identical to those of the DG-20, I couldn't find a way of accessing those basic synth parameter options detailed in the PDF on the DG-10 despite extensive probing. If you discover anything yourself, I'd be keen to hear about it! -------------------------- I've just realised that I complicated matters by saying you only use two pins; of course, you use the three pins that you've listed :) +5 from 64, ground from wherever you find it (though I used 32), and MIDI from 17. Other tantalising pins on that CPU purport to control chorus, chorus speed, chorus depth, and distortion, and one says it switches between DG-10 and DG-20 mode, but I couldn't get them to do anything... Having built-in chorus on this would be amazing, though, and the only hardware difference I've been able to establish between the 10 and the 20 is the MIDI output assembly, the membrane patch control and the drum pads on the top. Frustrating to know the potential is there...maybe I can persuade a more technically-adept friend to look into it for me. I'll let you know if I find anything! As for wiring those 3 pins, let's number the MIDI jack pins from 1-5 where 1 is the uppermost in these photos - ie on the far left if you were inside the case looking out through the jack hole: GND goes from pin 32 on CPU to pin 2 on the rear of the MIDI jack (black in the photos) MIDI goes from pin 17 on CPU to pin 3 on the rear of the MIDI jack (red in the photos) +5v goes from pin 64 to on CPU to pin 4 on rear of MIDI jack (also black in photos - I only had red and black wire)
Tumblr media Tumblr media Tumblr media
9 notes · View notes
echolevel · 7 years ago
Text
Yamaha SU10 backup/restore
Tumblr media
The Yamaha SU10 is probably the Best Thing. As samplers go, it can do barely anything but it does that with a huge amount of charm. Its big selling point in 1995 was that it was a flash memory sampler in a portable, compact unit; it was lots of people’s first sampler, and most early adopters’ memories are polarised between love and contempt. It’s the size of a VHS tape, runs on 6xAA batteries, has about a minute’s sampling time (this varies based on recording quality etc), usually manages 4-voice polyphony (with a big laundry list of caveats and gotchas), offers the most direct and immediate route to hands-on musical FUN that I’ve ever found in a hardware sampler, and while it fails to do a tonne of stuff normally considered essential in a sampler, it does a few things that are so crazy and so wonderful that they’re either the product of a lucky fluke or a demented genius.
I’ve been posting a lot of short Instagram videos lately that are basically snapshots of the aimless fun I like to have with the SU10 during my downtime from composing Proper Music™ for video games and film. No quantisation, no real sequencer - just a very basic event recorder that records pad-presses as played and requires some deft fingerwork to do anything useful with, no per-sample pitch control, and no resample/bounce ability. One day when I have time I’d like to make a tutorial video, or a series of videos, breaking down some of the tricks I’ve learnt for busting out of the SU10′s considerable limitations. Getting it to do something that you never realised it could do, or that few people familiar with the SU10 realise it can do, is a huge (if very niche) pleasure. 
A thing about me: any time I get hold of a piece of weird/forgotten/obtuse audio kit, I end up succumbing to the temptation to write some kind of software interface for it. There’s always a good reason - at least good for me, in that it’s to solve some highly specific deficiency or roadblock that I’ve run into as a result of trying to make it do something it wasn’t intended to do. Sometimes it’s to work around a fault that would be prohibitively expensive to fix (the various Access Virus editors and controllers I’ve written for my broken-buttoned Virus B are cases in point). Occasionally it’s because I spotted something mad in the depths of a service manual that clued me in to some stub of a capability that was designed and engineered into the hardware but never made use of - like the custom pixeldata area of the Yamaha QY70 ‘walkstation’ sequencer that can be painstakingly controlled via MIDI SYSEX to display and animate tiny images...
Anyway, that’s something I do - and it’s something I thought I’d have to do with the SU10 in order to crack the problem of dumping and restoring full system backups over MIDI. This is a feature the SU10 has, but in all these years I’d never been able to get it to work. An extensive Google search (and believe me, I know how to do extensive Google searches on this sort of shit) threw up discussions going back to the late 90s where people were trying to get the damn thing to restore a backup from anything other than a long-obsolete hardware MIDI filer made by Yamaha in the late 80s. With which the SU10 allegedly plays nice. None of these poor souls had ever had a satisfactory reply. 
Problem with attempting to restore a full system backup of the SU10 is that if it fails, you lose everything. So when you initially send a bulk dump from the SU10 to a computer, or whatever, you’d better hope it works otherwise you’ll zap all your stuff if you try to do a test restore. I’d used Sysex Librarian on MacOS to record the bulk dump messages into one .syx file, thinking it’d be easy enough to restore later. Tried to restore...failed. Argh. (Note: not really argh, because the part of the joy of the SU10′s immediacy is not getting too attached to samples, and knowing that you can always have fun repopulating it with new ones if anything goes wrong. However, some of those Instagram shorts had ideas that I’d like to flesh out some day and also hey, they were some really tasty samples!)
Anyway, to cut a long story short, I wasted far too much of my life writing custom MIDI send/receive apps for the command line, and for WebMIDI, and doing diffs and risky byte swaps in HexFiend, and every other trick up my sleeve...but what eventually worked was just recording the bulk dump onto a MIDI track in Logic Pro X and then playing it out again to the SU10 to restore it. In other words, how everyone backed up their MIDI kit between about 1985 and 2005. I failed to keep it simple, so wasted a Sunday afternoon on nonsense when I could’ve been having extremely high quality SU10 beats time. 
Another thing I wasted some time on relates to a previous SU10 post I made on here - a little tutorial for setting up a context-menu (right-click) service in MacOS for converting MSDS dumps to WAV files. It’s also useful for stuff like older Akai MPCs and probably some other classic sampler/wavetable synth kit. MSDS is ‘MIDI Sample Dump Standard’, defined in the MIDI spec as a means of transferring audio data over serial MIDI connections albeit at mindbogglingly slothful speeds. Apparently one manufacturer crowed in the late 80s that their kit would handle 30GB of sample data via SDS/MSDS, though it was noted by others that this would take around 3 months to transfer. Oh, and if your samples are stereo, you have to transfer the left and right channels separately. Exporting samples from the SU10 isn’t too bad, though annoyingly it’s got no ability to receive samples by the same means. Probably due to whatever unholy buffer-tangle they used to get the damn thing working at all. But I digress. The time I wasted was on a harebrained notion that I could develop a dump editor - sort of a sample bank manager - for manipulating SU10 dumps on a computer, and I thought that using a hex editor to diff MDSD dumps against full SU10 dumps would give me some clues... I’d not had much sleep, to be honest. Total waste of time, of course: both dumps are huge collections of short (500 bytes-ish) messages wrapped with the appropriate SYSEX open/close bytes and arranged in an order that the SU10 can understand. It probably would be possible to develop a computer-side SU10 dump editor, where you could change system options (and maybe even sample options), but it’d need a ludicrous amount of trial and error to map out which bytes store which flags. Like, taking hundreds of dumps from a freshly init’d SU10 and diffing them all while taking notes - and bear in mind that each dump takes ages AND requires you to manually answer a ‘Continue OK?’ request four times along the way. I’ve got the datasheets for the chips used in the SU10; it’s probably possible to figure out how the sample data is stored, and consequently how to manipulate or replace this data, but I absolutely can’t be arsed. So yeah, a tangent and a dead-end: MSDS/SDS is its own defined standard and it’s quite easy to convert to WAV, so that’ll do nicely.
In summary, if anyone’s still having trouble backing up and restoring SU10 data via bulk dump send/receive, it seems that the trick is to find a steady DAW with full SYSEX support (even if it’s hidden away and filtered out by default - go digging in those legacy option graveyards!) and then just keep it simple. Record the output AS PLAYED, then play it back at the same BPM. The AS PLAYED thing is important: I think Sysex Librarian (otherwise a fantastic and essential tool) was getting smart with the timing somehow, and it seems that the SU10′s idiosyncratic expectations of what the message intervals should be are causing the receive errors. Oh, and that initial bulk dump I took with Sysex Librarian that I couldn’t restore? I stuck that in Logic on a new MIDI track, in parallel with an empty SU10 dump recorded straight to Logic, and inserted roughly equal intervals at the same offsets...and it worked! So old backups you’ve never been able to restore might be salvageable after all if you try manually inserting some gaps in the right places.
It’s quite likely anyone who was looking for a definitive answer to this question stopped looking, like, 15 years ago. But you never know. Hope it helps someone. And like I said - it’s not the end of the world if you lose your SU10 samples. Make new ones.
7 notes · View notes
echolevel · 8 years ago
Photo
Tumblr media
Fiddle necromancy! I played this '89-'94, apparently never cleaned it. New sound post to go in, bit of glueing near the tailpiece, hopefully bring it back to life as an emergency backup/studio alternate. #fiddle #luthiery #violin #diy #twitter #irishtrad #tradmusic #studio
1 note · View note
echolevel · 8 years ago
Photo
Tumblr media
Custom Protracker 2.3e from 8bitbubsy's source with some hacks of my own - little UX things that have pissed me off about Protracker for over 20 years, and a test of some custom startup/aboutbox graphics. Assembles in about 15 seconds and runs a treat on ECS/AGA. 8bitbubsy fixed loads of ancient bugs, but has stopped development and made his source available yesterday. 2.3e is basically 2.3d with loads of fixes. #amiga #a600 #68k #68000 #commodore #demoscene #trackers #chiptune #chipmusic #assembly #asm #protracker #twitter
2 notes · View notes
echolevel · 8 years ago
Photo
Tumblr media
Custom tracker chop shop. My 4 down-by-law faves. #chiptune #Amiga #syphus #demoscene #chipmusic #commodore #a1200 #a600 #milkytracker #protracker #ahxtracker #twitter
2 notes · View notes
echolevel · 8 years ago
Photo
Tumblr media
Emergency chip mission calls for pimped-out pink/purple AHX #Amiga #chiptune #A1200 #hardware #studio #Commodore #retro #chipsynth #synthtracker #trackers #oldschool #demoscene #UpRough #syphus #backtoschool #letsgobacktoschool #letsgoletsgobacktoschool #tothaoldschool #twitter
1 note · View note
echolevel · 8 years ago
Photo
Tumblr media
I chopped the lens off my Holga 135BC and taped it to my iPhone camera. I have no regrets. Well, yeah, some. But not many. #LomoYolo
0 notes
echolevel · 8 years ago
Photo
Tumblr media
POWERED GM CARDIGAN RGM-237C #gundam #gunpla #unpainted #mecha #modelkit #mechs #twitter
1 note · View note
echolevel · 8 years ago
Photo
Tumblr media
Lunch breaks #TR505 #metalzone #Roland #Boss #studio #mt2 #rhythmcomposer #drummachine #sequencer #distortion #guitarpedal #twitter #circuitbending #hacked #hardwarehacking #noise
1 note · View note
echolevel · 8 years ago
Text
Custom portfolio CMS with AngularJS, Firebase & Bootstrap
Tumblr media
What the world absolutely didn't need was another CMS, so I made one! But wait: this is a really minimal CMS for managing a single-user website (not a blog) that displays mostly remote content and doesn’t require rich editing, publishing or admin features. Perfect for a portfolio website, in other words, and that’s what I needed when giving echolevel.co.uk an overhaul.
I’ve used AngularJS and Bootstrap for a few clients’ sites and Firebase for an iOS/Android mobile app, but this is the first time I’ve bolted them all together for a web app that exploits Firebase’s client/server concurrency, and the Firebase Storage features introduced since their acquisition by Google. Echolevel CMS has separate back end and front end components (currently the back end is running on my localhost) and the back end authenticates with a Firebase ‘app’ in order to read from and write to a very simple realtime JSON database. ‘App’ is the terminology Firebase use to describe a project that uses, or can use, a range of Firebase services which are all accessed via one app-specific root URL. At least that’s what I think they mean - I still haven’t got my head fully around all the new documentation introduced since the Google buy. The front end just reads the database, with no authentication, and kicks it all out to the user via AngularJS’ model view controller. The front end came first: I manually created a few Firebase entries containing embed URLs for the Soundcloud, Bandcamp, Tumblr and Instagram posts where most of my portfolio stuff lives. I didn’t want to replicate that stuff and then have to maintain it when it already exists in nice iFrame players or card items that users are familiar and comfortable with. But I also gave each embed a brief text description to smooth over the inconsistencies those platforms have with titles and captions, and to keep relevant keywords visible to search engine crawlers (I’m not so bothered about SEO, but it’s good practice). Already this was a better solution than my previous efforts at gathering existing content into a portfolio site: running a secondary Tumblr to share just those embeddable items, then scraping the API to display them on my site.
The back end followed fairly easily: the nice thing about AngularJS is that changing a read-only view to an interactive, editable one is very easy. An object property which, on the front end, you’re displaying in a paragraph tag can on the back end be displayed in an input tag that’s bound to the property itself, and either with an ‘Update’ button or a directive that detects changes to the input field, you can write the changes back to Firebase via an authenticated connection that remains open while the site is loaded.
So the back end now starts by showing you a huge list of all your posts ordered by ‘position’, which is an incremented value assigned to a new post on the basis of how many posts exist on the database. Firebase says this is very bad practice, but that’s from the perspective of Firebase’s focus on being a multi-user realtime database platform; tracking incremented IDs on tens or hundreds of simultaneously connected clients writing to the same JSON child would be a nightmare, which is why they generate unique keys based on timestamps. But I don’t care about that - in fact, I’m mostly ignoring those keys as I want to be able to manipulate ‘position’ in this single-user context so that I can move posts up and down the post array’s sort order. The only thing I do use the unique Firebase key for is identifying the post’s display elements for jQuery operations.
The up and down arrows under each post change the post’s position, and consequently its display order, and this is reflected instantly in the view while being saved to the server - a good example of the 3-way data binding made easy by AngularJS and Firebase (specifically by AngularFire, an officially supported AngularJS binding for Firebase).
That 3-way binding takes care of pretty much everything else, too. The $firebaseArray service gives you a JS array of everything under a specified Firebase child path and returns a promise when it’s done. That should usually be quick as the point of this CMS is to store nothing but a bit of text and HTML in the database, grabbing most of the actual content later via iframe loads from other content providers. Rather than treating your $firebaseArray like a regular JS array (possible but not recommended as it can cause the local data to go out of sync with the server), you get a few special methods - add, remove, save and so on - that sync back to the server. So the ‘Submit’ button in the image above adds to that database by taking the object to which each input field is bound, adding an incremented ‘position’ property, and then shoving it on the end of the array. Deleting a post that’s halfway down the page triggers a loop that recalculates all subsequent items’ position value to close the gap. Uploading an image autofills the URL field with a Firebase Storage URL returned by the upload operation - access rules on the project’s Firebase Storage are, like the realtime database, read-only to the public. 
The ‘Page’ field takes a tag that you can use on your front end to filter all available posts in an ng-repeat (AngularJS’s looping DOM renderer) for use on different pages, although the MVC nature of AngularJS means you can do something like I have on the back end page: allow the users to type into a textbox to instantly filter the list of posts down to those matching the input.
The real strength of AngularJS is in its programmatic DOM rendering stuff, and its extensibility with filters (which can be used as matching/exclusion conditions when iterating through an array of displayable items) and directives (which allow you to pass data via custom DOM tags). I’m not using them for anything particularly wild here - things like array sorting and paginated display with an infinite-ish scroll system - but the critical filter is the one that gives the iframe code (which AngularJS sees as inherently unsafe, for obvious reasons) a shortcut past $sce (Script Contextual Escaping) by instructing it to blindly trust the code as safe HTML. You’d be crazy to do this in a multi-user web app environment, but for a single-user site where I can (hopefully) trust myself, I’m satisfied that anything I input as an embeddable iframe is going to be legit. The alternative would be to write separate code for every platform I might conceivably share content from, and interpret video/photo/song UIDs... I’ve done something similar in the past and it’s laborious, inconsistent and fiddly to maintain.
As for making the whole system fairly kind on the user’s hardware and bandwidth, I’m using a jQuery lazy-loading library to hold back on loading iframe or image content until the user hits the bottom of the screen. This, in conjunction with ‘endless’ scrolling that loads 5 posts at a time (again, until the bottom of the screen is reached), keeps the load low on someone who just wants to glance at the site on their mobile device without having to wait ages, only to discover that they’ve wasted mobile data allowance on 20+ Soundcloud players that they might have no intention of listening to.
So this has been a fun few days that’s taught me a lot more about AngularJS, and it’s also given me a portfolio site that’s very easy to extend and maintain - knowing you have to dig through scrappy old HTML in order to update your portfolio is a huge disincentive for doing so, and I need to get better at trumpeting my achievements. It’s usually the case that busy freelancers never get around to updating their portfolios while...less busy freelancers have all the time in the world for that sort of thing. I’m lucky enough to be quite busy at the moment, but the fear is always that if a slow patch comes along, your site’s woefully out of date and doesn’t reflect all the stuff you’ve been busy doing. Making it as easy as possible to gather it all together as I go is hopefully part of the solution.
This isn’t a tutorial piece (obviously) and there are hundreds of blogging coders who do that sort of thing much better than I could, but maybe I’ll figure out a good way of flattening out my hacks, tidying things up, and sharing this on GitHub in case anybody wants to use it.
0 notes
echolevel · 8 years ago
Photo
Tumblr media
Stealthmode. Black on black on black Artec hot rail humbuckers; sound better than £30's worth, but not amazing. Neck's got thump but bridge hasn't enough high end, and I mostly live at the bridge. Anyway, this particular turd is now polished to maximum possible shine. #ShredwardScissorhands ShredBundy #ShreddyKreuger #electricguitar #guitar #pickups #humbuckers #artec #studio #thrash #metal #thrashmetal #twitter
0 notes
echolevel · 8 years ago
Photo
Tumblr media
Got some new and dangerous-lookin' pickups. Hot rail humbuckers (Artec P23); cheap OEM, but bound to be an improvement in my Aria Pro II Excel shitplank. Got them in black on black because black. #Twitter #electricguitar #guitar #studio #pickups #humbuckers
0 notes
echolevel · 8 years ago
Photo
Tumblr media
Boss Noise Suppressor NS-2. 2nd hand, but in suspiciously pristine condition... #backofalorry #noisegate #studio #guitar #djent #8string #twitter #stompbox #guitarpedals
1 note · View note
echolevel · 8 years ago
Photo
Tumblr media
RYUSEI-GO (GRAZE CUSTOM II) - front view #gundam #modelkit #mecha #mechs
1 note · View note
echolevel · 8 years ago
Photo
Tumblr media
RX-121-1 Gundam TR-1 [Hazel Custom] #mecha #mechs #modelkit #gundam
2 notes · View notes
echolevel · 8 years ago
Photo
Tumblr media
'Tennis Girl' ~ Athena, 1977 #gundam #modelkit #mechs #mecha
0 notes