Monday, 18 June 2018

Japanese Numbers

The New Job

Nowadays I'm working in medical research. One recent task was to internationalise some UI, then localise it into Japanese. With little in the way of a clue how to do this, but having built up some Audible audiobook credits over the spring months, I decided to take advantage of my three hour daily commute to learn a little about the Japanese language and culture. After all, there's every chance I'll soon have the opportunity to visit Japan on the company ticket, and I'd like to be able to speak to people in their first language, without causing humongous offence. So I bought a couple of Teach Yourself Japanese audiobooks.

Linguistic Regularity

Boy, did they do a job on me. You would never think, looking at the Japanese writing system, reputedly one of the most horrendously complex in the world, that this language could be a clean and tidy, logically lovable, stone fox. But I was soon smitten. I mean, just look at some of these features. There are no singular or plural nouns, there's just the noun. The verb to be, one of the most irregular in my native tongue, doesn't conjugate at all; it's just like I be, you be, he she or it be. Month names are like first month, second month, and so on. Dates are in perfect ANSI order: the greater subdivision always comes first, so it's year-month-day, or yyyy-mm-dd. Ideal for sorting by computer! There are only 47 syllables in the language, and every vowel is always pronounced the same.

Of course that's just the first flush of romance; eventually reality and entropy make themselves heard. There might indeed be so many welcome regularities in Japanese, but then they go and spoil it all by saying something stupid like "there are three levels of formality for every sentence", or "men and women speak with subtly different inflections." This last, together with the fact that most teachers of Japanese are female, has the interesting consequence that male learners usually, unwittingly, start off sounding quite effeminate.

Numeric Logicality

But then there are the numbers. The Japanese counting system is beautifully simple and regular, with very few exceptions in structure and pronunciation. Again, the first idealistic impression is somewhat spoiled by reality, this time by the introduction of "counters". These are little particles which must be appended to numbers, when counting objects. Surprisingly, the particular counter used is often based upon the physical appearance of the thing being counted. Then again, certain numbers cannot be used in counting certain types of thing, but must be substituted with other special purpose counters...

Still, the basic counting system is quite easy to learn, interesting too, and if nothing else can at least be used while you count through the steps of kata in your chosen martial art (mine is press-ups-do). I considered it potentially a big win, both mathematically and scientifically, to count as high as I possibly could using this system. As a study aid I made a little text file, delighted to realise that all the kanji characters and superscript numerals available in unicode were supported in Notepad. Printed out and laminated in A6, it became a pocket reference card. Later in A4 format, it would become a placemat suitable, used in conjunction with a transparent plate, for learning your ichi-ni-san while eating your sushi.

Original Text Version

The version below can be copied to the clipboard as text, then saved in Notepad. Just remember to select one of the Unicode options, such as UTF-8, from the Encoding drop-down list.

0  〇/零  zero/rei  JAPANESE NUMBERS REFERENCE CARD  * Learn these exceptions!

       1            10               100              1,000           10,000
1   一 ichi       十 jū            百 hyaku         千 sen        一万 ichi-man
2   二 ni       二十 ni-jū       二百 ni-hyaku     二千 ni-sen     二万 ni-man
3   三 san      三十 san-jū      三百 san-byaku *  三千 san-zen *  三万 san-man
4   四 yon      四十 yon-jū      四百 yon-hyaku    四千 yon-sen    四万 yon-man
5   五 go       五十 go-jū       五百 go-hyaku     五千 go-sen     五万 go-man
6   六 roku     六十 roku-jū     六百 ro-ppyaku *  六千 roku-sen   六万 roku-man
7   七 nana     七十 nana-jū     七百 nana-hyaku   七千 nana-sen   七万 nana-man
8   八 hachi    八十 hachi-jū    八百 ha-ppyaku *  八千 ha-ssen *  八万 hachi-man
9   九 kyū      九十 kyū-jū      九百 kyū-hyaku    九千 kyū-sen    九万 kyū-man

10⁵ 十万 jū-man       10⁶ 百万 hyaku-man       10⁷ 千万 sen-man

10⁸    10¹²   10¹⁶   10²⁰   10²⁴     10²⁸   10³²   10³⁶   10⁴⁰   10⁴⁴   10⁴⁸
億     兆     京      垓     𥝱/秭    穣     溝      澗     正     載     極
oku    chō    kei    gai    jo/shi   jō     kō     kan    sei    sai   goku

10¹² 一兆 itchō      8x10¹² 八兆 hatchō        10¹³ 十兆 jutchō †
10¹⁶ 一京 ikkei      6x10¹⁶ 六京 rokkei      8x10¹⁶ 八京 hakkei

10¹⁷ 十京 jukkei †     † Multiples of 10:  change -jū to -jutchō or -jukkei
10¹⁸ 百京 hyakkei ‡    ‡ Multiples of 100: change -ku to -kkei

10⁵²⸍⁵⁶       10⁵⁶⸍⁶⁴       10⁶⁰⸍⁷²       10⁶⁴⸍⁸⁰       10⁶⁸⸍⁸⁸
恒河沙         阿僧祇     那由他/那由多     不可思議      無量大数
gōgasha       asōgi        nayuta        fukashigi    muryōtaisū

How It Works

The first thing to do is memorise the top left column, digits 1 to 9, and 10: ichi, ni, san, yon, go, roku, nana, hachi, kyū, jū. Note that the horizontal bar along the top of a vowel just makes it sound "long" - some guides use double vowels for this purpose.

Next, to form the numbers 11 to 19, just use literally ten-one, ten-two, ten-three, etc. So that's jū-ichi, jū-ni, jū-san, etc.

Multiples of ten up to ninety are found in the second column: ni-jū (20) is literally two tens, san-jū (30) three tens, and so on. Intermediate numbers are simply concatenated or added together, so 42 is "four tens two", or yon-jū-ni.

It's a similar story for multiples of 100, found in the third column, although there are three little exceptions to be aware of - more or less subtle variations in pronunciation. I've marked these with asterisks. So although 3 is san and 100 is hyaku, 300 is not san-hyaku but san-byaku; note the hard 'b' sound here, and also the hard 'pp' in 600 (ro-ppyaku instead of roku-hyaku) and 800 (ha-ppyaku rather than hachi-hyaku).

Multiples of 1,000, as seen in the fourth column, also have exceptions marked at 3,000 and 8,000, although there isn't an exception for 6,000, which is just business as usual: roku-sen.

Chinese Roots

Reaching 10,000 there's another little surprise in store, and quite an important one. It might help a bit to think first about English powers of 10. Notice that 100 (one hundred) and 1,000 (one thousand) both begin with the word "one", whereas 10 (ten) and 10,000 (ten thousand) don't. But actually, there is an old English number "myriad", one of whose older meanings is literally ten thousand. We might therefore think of 10,000 as "one myriad", and in fact that's similar to what the Japanese, following on from Chinese tradition, actually do. Ten thousand is best translated into Japanese via "one myriad", hence ichi-man.

With that in mind, column five otherwise proceeds much as before: 20,000 is ni-man (two myriad), 30,000 is san-man, and so on without further exceptions. But we have just passed an important milestone here. Just as our big numbers tend to group themselves into powers of 1,000 such as thousands, millions, billions, trillions, and so on, each time multiplying by 10³ and adding another comma, so the oriental tradition is to partition into powers of 10,000, and groups of four digits. The importance of this structure is reflected in the use of the ichi (one) prefix for 10,000: not just man (myriad), but ichi-man (one myriad).

The same caveat will apply to all subsequent powers of 10,000. But before getting to those, look at the next few powers which are not multiples of 4, and don't need the ichi prefix. As shown immediately below the main table, we already knew how to construct:
  • one hundred thousand (100,000  = 10⁵ = ten myriad = jū-man),
  • one million (1,000,000 = 10⁶ = hundred myriad = hyaku-man), and
  • ten million (10,000,000 = 10⁷ = thousand myriad = sen-man).
Next, we shall alight upon the Big Sequence, the powers of 10⁴ spanning 10⁸ to 10⁴⁸ (one quindecillion!), listed in the second horizontal table.

To Infinity And Beyond (almost)

So, now we avail ourselves of the long line of Powers of Myriad (that's definitely the name of my next witching and wizarding trilogy, watch out JK). We have reached 10⁸ which is labelled oku, but since 8 is a multiple of 4, we have to prepend this with ichi. Thus, 10⁸, or a hundred million, becomes ichi-oku. Two hundred million is ni-oku. And so on.

Things chug along quite nicely until we reach one trillion, or 10¹². Everything we've covered so far leads to the expectation ichi-chō, until we stop and consider the clumsiness of that utterance. Surely that is the reason the wise Japanese have decided to contract it to itchō. Similarly, eight trillion becomes not hachi-chō but hatchō, while ten trillion is not jū-chō but jutchō (with the shorter u).

Similar exceptions apply to the next big multiplier, 10¹⁶ (which becomes not ichi-kei but ikkei), as well as multiples of this by 6, 8, 10 and 100. There is a pattern to the modifications in these cases, codified by the daggered comments in the bottom half of the reference card (or placemat).

Finally, we reach the bottom 3 rows of the card, where the only reliable historical sources contradict each other. In a denouement reminiscent of the war between American and British billions (see Wikipedia for details, https://en.wikipedia.org/wiki/Names_of_large_numbers), there's a forking schism in which the same terms are used to count, simultaneously and incompatibly, using multiples of 10⁴ and/or 10⁸, into an uncaring infinity. Of limited scientific use admittedly, but why not take advantage of the Creative Commons licence, and print out and laminate your own set of Japanese Numbers placemats?

Thursday, 17 November 2016

My Collie Here

Meet our Archie

Every cat needs a collie, and this is Cleo's new wee brother, Archie.

"Wee" brother is right. Although he's grown to double her size, in the 4½ weeks he's been with us - compare the picture on the right with the one below, taken 4½ weeks later - he still gets "Wee Archie" due to his determination to cover the whole house in a uniform coat of wee!

Actually, that's a bit unfair. When he came to us at exactly 8 weeks old, he was already trained to go on the puppy training pads, and had more or less a 100% record on those. But that was only for wee; anything more demanding would be deposited instantly and immediately, just wherever he happened to be, as the mood took him. Now that we've started trying to take away the training pads, the result - with apologies to Kevin Bacon - has been a return to Everything Everywhere.

End of the Tunnel

Yesterday he attended his first puppy socialising class at The Dogs Trust, where he did us proud with his precocious knowledge of the Sit, Stay, and Down commands. All credit to Linda there, for her decades of experience training very intelligent border collies.

Socialising per se was less successful. Archie has had to be kept away from other dogs for longer than is usual, because his breeder failed to immunise him against deadly diseases such as Parvovirus. We didn't find out about this until we took Archie to our own vet, for what we thought would be his second and final inoculation, but which turned out to be a complete restart at day one.

So yesterday, two weeks later than he should have, he finally got to meet other pups. He was timid and reluctant, and basically failed to do so. However the instructor expressed his confidence that this delayed development can be put right over the coming month.

Archie and Cleo, everybody!

Thursday, 10 November 2016

FLAC Forensics

Frequency Fingerprints

I was asked by a friend if it was possible to check whether some downloaded files were actually faithful to the original WAV format entities, or whether they had in fact been rehydrated from an unfortunate, lossy intermediate MP3 excursion. The files in question were FLAC compressions of the original 3½ hour, 42 track Analord series of electronic pieces by Richard D. James, most of which were only ever issued on 12" vinyl by the artist's now defunct Rephlex Records outlet.

Update: My personal RD James expert informs me that these original 42 tracks were also released in lossless digital format on Rephlex, and that some (or all?) of the subsequently released additional, digital-only tracks were also added to these by Rephlex.

I loaded the first of these files, SteppingFilter 101, into Audacity, and took a look at the frequency domain graph (Analyze|Plot Spectrum...). After a brief complaint about only being able to analyze 237.8 seconds of audio at a time, the result was this:


Notice the slight uptick at the extreme right (high frequency) end, around 22kHz. This represents extraneous noise generated by the digital sampling process, which in this case appears to have been set naturally enough to the CD standard stereo setting of 44.1kHz. This effect will be present in any rip, at some frequency or other, and is of a different kind from the artefacts introduced by MP3 processing.

Next, I used FooBar2000/LAME to convert this file to MP3 format, using the highest available quality, Constant Bit Rate standard preset, namely 320kbps CBR (actually LAME can handle non-ISO bit rates of up to 640kbps via its freeformat option, but very few MP3 players can handle such files).

The result of this 320kbps conversion has a very obvious steep cutoff at about 20kHz:


Any attempt to convert this back to the WAV format will preserve this telltale high frequency cutoff. Does this mean we can be confident that the source file represents a good, high quality, uncompressed rip from the original vinyl? I would say confident, yes; certain, well, that's another bottle of kippers. We haven't ruled out nonstandard MP3 or other shenanigans with this test alone, but those compression antics are at worst extremely unlikely.

Saturday, 3 September 2016

Sundry Surround Sound Recordings

Planned Obsolescence

At the time of purchase in May 2015, my current universal (DTS/SACD/DVD-A/Blu-ray) player, a Pioneer BDP450, cost me a featherweight £159. Just over a year later it's "unavailable", unless I'm willing to settle for a refurbished model from Ebay. Reasonably priced multichannel DTS/SACD and DVD-Audio players are becoming really hard to find, even from the manufacturers who invented these formats. At present the best available options appear to be:
  • PIONEER BDPLX58 (£449 at Richer Sounds)
  • CAMBRIDGE CXU (£799.95)
  • OPPO BDP105D (£1,099)
  • PIONEER BDPLX88 (£1,099)
No wonder then that collectors of surround sound DVD-Audio recordings, and even more so those of multichannel DTS media or SACDs, are feeling increasingly under siege these days. For how much longer will we be able to play these purchases? How many more times will we be able to afford a new player, when the last one packs in and its perishing rubber wheels and belts and lasers can't be replaced?

This is a partial list of my surround sound recordings by format. It will let me sit and grieve as first DTS, then SACD, then DVD-A, and finally (sooner than you'd think!) Blu-ray playback become impossible. Then I will at least be able to see at a glance each month, exactly what fraction of my collection has now become permanently unavailable to me. It's also a work in progress, since I have no intention of losing the bad habit of buying these wonderful recordings; currently I'm looking forward to the much-delayed Steven Wilson remixes of the early Roxy Music albums.

Top 100+ Speciality Multichannel Studio Mixes

This first table lists recordings where a studio engineer (usually Steven Wilson or Jakko Jakszyk ;-) has carefully pored over the source material, and arranged things in space to produce a curated, meticulously arranged, surround sound experience.

Artist or ComposerAlbum TitleYearPhysical Media
SACDDVD‑ABlu‑ray
Ian Anderson Homo Erraticus2014
Bach Bach Classics 17xx
Bass CommunionLoss2006
The Beatles Love 2006
Beethoven Beethoven Classics 18xx
Symphony No. 6 "Pastorale" 1808
BlackfieldBlackfield V2017
David BowieThe Rise and Fall of Ziggy Stardust...1972
CaravanIn the Land of Grey and Pink 1971
Eagles Hotel California 1976
Hell Freezes Over 1994
ELP Tarkus 1971
Trilogy 1972
Brain Salad Surgery1973
Flaming Lips Yoshimi Battles the Pink Robots 2002
Fleetwood Mac Rumours 1977
Genesis Trespass 1970
Nursery Cryme 1971
Foxtrot 1972
Selling England By The Pound 1973
The Lamb Lies Down on Broadway 1974
A Trick of the Tail 1976
Wind & Wuthering
...And Then There Were Three... 1978
Duke1980
Abacab1981
Genesis1983
Invisible Touch 1986
We Can't Dance1991
Gentle Giant Three Piece Suite 1970-2
Octopus 1972
The Power and the Glory 1974
Handel Handel's Water Garden 17xx
Gavin Harrison Cheating the Polygraph 2015
Jethro Tull Stand Up (The Elevated Edition) 1969
Benefit (A Collector's Edition) 1970
Aqualung 1971
Thick as a Brick1972
A Passion Play 1973
War Child 1974
Minstrel in the Gallery 1975
Too Old to Rock'n'Roll: Too Young to Die! 1976
Songs from the Wood 1977
Heavy Horses 1978
King Crimson In the Court of the Crimson King1969
In the Wake of Poseidon 1970
Lizard
Islands1971
Larks' Tongues in Aspic1973
Starless and Bible Black 1974
Red
Discipline1981
Beat1982
Three of a Perfect Pair1984
THRAK1995
Radical Action (To Unseat The Hold...) 2016
Marillion Misplaced Childhood1985
The Moody Blues Days of Future Passed 1967
On the Threshold of a Dream 1969
To Our Children's Children's Children
Seventh Sojourn 1972
Mozart Mozart Classics17xx
Mike Oldfield Tubular Bells 1973
Hergest Ridge 1974
Ommadawn 1975
Five Miles Out 1982
OpethStill Life 1999
Deliverance & Damnation 2002/3
Watershed 2008
Heritage 2011
Anthony PhillipsThe Geese & the Ghost 1977
Wise After the Event 1978
Slow Dance 1990
Pink Floyd Atom Heart Mother (Devi/Ation, quad) 1970
Echoes (Reverber/Ation, quad) 1971
Meddle (Reverber/Ation, 5.1) 1971
The Dark Side of the Moon 1973
Wish You Were Here 1975
Porcupine Tree Stupid Dream 1999
Lightbulb Sun 2000
Deadwing (2 copies, 1 signed) 2005
Fear of a Blank Planet2007
The Incident2009
Riverside Love, Fear and the Time Machine 2015
Roxy Music Roxy Music 1972
Avalon 1982
Schubert Schubert Classics18xx
Simple Minds New Gold Dream (81-82-83-84) 1982
Sparkle in the Rain 1984
Once Upon a Time 1985
Steely Dan Gaucho 1980
Everything Must Go 2003
T. RexElectric Warrior1971
Tchaikovsky Tchaikovsky Classics 18xx
The Nutcracker 1892
Tears for Fears Songs from the Big Chair 1985
Trondheim Solistene Divertimenti 2008
In Folk Style 2010
Rick Wakeman The Six Wives of Henry VIII 1973
The Myths and Legends of King Arthur... 1975
The Who Tommy 1969
Quadrophenia 1973
Steven Wilson Insurgentes 2009
Grace for Drowning 2011
The Raven that Refused to Sing 2013
Drive Home
Hand. Cannot. Erase. 2015
2016
To The Bone 2017
XTC Drums and Wires 1979
Skylarking 1986
Oranges & Lemons 1989
Nonsuch 1992
Yes The Yes Album 1971
Fragile (2002 - Rhino)
Fragile (2015 - Panegyric)
Close to the Edge 1972
Tales from Topographic Oceans 1973
Relayer 1974

Notice that most of the Yes titles are double entries (in fact Fragile is a triple): the DVD-Audio and Blu-ray editions of these are of course equally essential.

The Loneliness of the Long Interval Musicologist

The Year column is problematic. Every recording has its place on multiple chronologies; for example, the life and development of its composer, its conductor, and its performing artist(s). The difficulty is that different performances naturally emphasise disparate chronologies, and a single date field in a table or database struggles to accommodate these variations.

For the historical study of musical development, the time stamp of primary interest is the date of composition. Sadly this is not recorded in typical media metadata, such as the ID3 tags on MP3 files. The "Year" recorded there represents the release date - when the particular edition was issued. Now, for most "popular" music (in the strict Amazon.com sense of "anything non-classical"), this is close enough to the date of composition; but for all of the recordings listed here, without exception, the release date for the multichannel edition is many years later than that of first publication of the original material, and the problem is only worse in the case of classical works.

Generally I've tried to get as close as possible to the date of composition. That means for popular works using the year of first issue, and for classical, the historical year (or century, for compilations) of composition. Still there remain intractable inconsistencies. For example, all of the material on the Beatles' "Love" album was recorded and issued long before Cirque du Soleil went shopping for a soundtrack in 2006. Finally, there's Daniel Barenboim. When the focus of a classical recording is neither composer nor performer, but instead a famous conductor, then I use the performance date.

Live Surround Sound Music Videos

This second table lists live video recordings of musical performances that just happen to have a surround sound component, often limited to a feeling of ambience in the hall where the recording was made. These are the second class citizens of the surround sound community, and this collection listing will be incomplete.

Artist or ComposerAlbum TitleYearPhysical Media
DVDBlu‑ray
AshTokyo Blitz2001
Daniel Barenboim Knowledge is the Beginning / The Ramallah Concert 2008
Neujahrskoncert 2009 2009
Europakonzert 10 2010
Mahler Symphony No. 9
The Salzburg Concerts 2011
BlackfieldNYC - Blackfield Live In New York City2007
Dream TheaterLive at Budokan2004
Score2006
David GilmourRemember That Night 2007
Led Zeppelin The Song Remains the Same1999
Led Zeppelin2003
OpethLamentations 2006
The Roundhouse Tapes 2007
Live at the Royal Albert Hall 2010
Orphaned Land The Road to Or Shalem 2011
Porcupine Tree Arriving Somewhere... 2006
Anesthetize 2010
Steven WilsonGet All You Deserve 2012
Yes Symphonic Live2002
YesSpeak2003
Acoustic2004
Live at Montreux 20032007
Youssou N'DourLive at Montreux 19892005

Monday, 16 May 2016

Surround Sound Switch #7: Wrapping Up

Spinning The Room

This is a quick summary of the contents and conclusions reached in my recent series of six articles on the subject of Surround Sound Stage Rotation switch designs and prototypes. The series is about various ways of rotating the sound stage of a surround sound / home cinema audio system, so as to make any chosen wall or corner the focus of the action.

Said action takes place in an arena I've dubbed the octoroom. This is a bit like a normal rectangular room, but with a satellite speaker in every corner, and another in the centre of each wall.

Part 1: The Mother Of all Relay Boxes

I start out by examining the ready-made solutions available in the market. This doesn't take too long, as there are none. The hopelessness of seeking help from the audio kit manufacturers is bemoaned.

I spend most of our session together longing for an earlier time, when things like the MORB-1 were available in shops.

Part 2: Rolling your own Commutator

I detail my personal colour scheme for octoroom wiring, explaining its minor deviations from the relevant standards. Then it's on to another pipe dream, this time involving acres of pristine copper plated (or more likely brass, or other alloy) substrate. An imaginary comb made of brushes is used to illustrate the ideal to which our prototypes can hopefully converge.

I spend most of our session together longing for an earlier time, when such commutators were available in shops.

Part 3: Bulgaria (rotary switches)

The ideal 8-pole commutator can be simulated by helically wiring a suitable stack of wafer switches. I discover 7P8T palladium contact rotaries for sale in Bulgaria, and buy them for research. They turn out to be ex-telecomms system components, too fragile, difficult to wire, and otherwise unsuitable for audio use. But they inspire a passive rotary switch design, which eventually becomes my first successful prototype.

A new feature dubbed Mode 5 is introduced, for the specialist who needs to analyse custom curated surround sound music recordings. It allows a 5.x remix to be "stretched out" over the whole 7.x room, without adding in any sound processing by the receiver.

Now that concrete prototypes are beginning to emerge, I describe a scheme for quickly and conveniently swapping them in and out of the home cinema system. The scheme is based on Bulgin 8-pin, cable- and panel-mounting, plugs and sockets.

Part 4: Group Theory (toggle switches)

The mathematical area of permutations teaches that a single 8PDT switch, suitably wired, can rotate our sound stage through any single angle that's a multiple of 45°. Such rotations can also be composed, or applied one after the other, simply by stringing two or more such switches in series, in any order. So, we can choose a suitable chain of three "basis rotators", say 45°, 90° and 180°, and by selectively turning certain ones on and off, achieve any multiple of the atomic 45° rotation.

Eight pole toggle switches exist, albeit outside the unspoken, hobbyist budgetary scope of this series. But usefully, permutation theory also shows that a safe implementation of the 90° rotation can equally be achieved by splitting our 8PDT switch into two more readily and cheaply available 4PDT units ganged together, and that the 180° can similarly be reached by this means, or even by ganging together four DPDT units.

What is meant by safe in this context, is that under failure conditions, when one or more of the component switches fails to operate, no damage other than a seriously mixed up surround sound image will be caused. Amplifier outputs will not become cross-connected, nor asked to drive two or more loudspeakers in parallel. Sadly, the same can't be said about the 45° rotation stage.

There's a brief, unintelligible diversion, something about binary clocks, I dunno...

I make two more successful passive prototypes based entirely on 4PDT toggle switches - first some big Hong Kong ones with screw terminals, then smaller switches with solder lugs. Each prototype contains a 90° and a 180° rotator, as well as the new Mode 5 feature, which takes up one further 4PDT switch for a total of five. The 45° rotator has been dropped temporarily, as there's no easy way to guarantee that its two associated 4PDT switches will always be operated simultaneously and kept forever out of the potentially destructive one on, one off state.

Part 5: Relayer (electromagnetic relays)

Essentially the same audio circuit can be transcribed from the toggle switches in part 4 to the 4PDT electromagnetic relays in this part. With the addition of a 12V PSU and a 4-bit hexadecimal thumbwheel switch, prototype number 4 - the first active device in the series - is born.

The 45° rotator is reintroduced, since the two 4PDT relays that constitute it can now be guaranteed driven together and kept synchronised. Even under rare fault conditions, e.g. a relay coil burning out, the risk of damage can at least be mitigated by assessing which failure mode - amplifier outputs shorted together, or loudspeakers becoming paralleled up - is the less serious, and wiring the switch contacts accordingly. A free online circuit simulator is used to pre-verify the audio wiring schematic.

I finally have a full 8-position, manually operated, prototype sound stage rotator.

Part 6: Arduino (remote control)

No sooner has it arrived, than the hex thumbwheel switch is replaced by an Arduino Uno, driving the relays and relay pairs through bipolar npn transistors. A wiring self-test program is written, seen operating in a YouTube video. This verifies again that all audio pathways are switched correctly, as the compass orientation rotates, and as Mode 5 is switched on and off.

Home is an MB4 project box
The test wiring is removed, and an IR receiver module is interfaced to the Arduino. Suitable IR codes are obtained by "sniffing" an old Sony BD player remote; these are then embedded into the code, and verified to operate as expected.

Some speculation about future development occurs, but prototype number 5 feels like the logical end of this road. There's life after prototyping, of course. I still have to design a suitable custom PCB, using just the bare ATmega328P chip and a 16MHz crystal, so I can keep my Arduino Uno board for future projects. Still have to stick it all in a box. And so on and on...

Acknowledgements

Thanks to my wife for putting up with (a) so many odd deliveries of random munitions from Amazon, Ebay, Maplin (hi Scott!) and RS Components, not to mention international arms shipments from USA, Hong Kong, Germany and Bulgaria; and (b) the too many hours I spent locked away in the man-cave, playing with screwdrivers, soldering irons, and ticking devices bristling with hundreds of multicoloured wires.

Special mention to Georgi, my Bulgarian rocket scientist colleague, for pushing me to the Arduino limit, and convincing me there would be merit in these investigations. Without his input, I'd have contented myself with a twisting plug and socket manual solution.

The End

Tuesday, 10 May 2016

My Cat Here

Meet our Cleo

Of course the Internet is made of cats, everybody knows that. So here is our latest contribution, and indeed our latest family member: Cleo, aged almost one and a quarter.

Actually she's still at the Scottish SPCA rehoming centre right now, just awaiting a little dental scale and polish, and whatever other surgical interventions might be appropriate (ssshhh). But she has been duly reserved, her new home is ready and waiting, and we've been busy planning and buying her new toys and other worldly chattels.

Cleo strikes you at first as a quiet wee lass - indeed, "A very timid little lady" is the first entry on her vet's record. She's recently lost her owner(s), sadly no longer able to take care of her. And just at this time, with all she's been through and the upset in her life, she can appear a little reluctant to make new friends. But she didn't have to spend too long as a rescue kitty. As soon as she appeared in her temporary accommodation quarters, as soon as she came forward to get tickled, as soon as she miaowed, she was all ours.

Insofar as any cat can ever be said to belong to any of us... anyway.

The very lovely Cleo Kerr, everybody!

Thursday, 5 May 2016

Surround Sound Switch #6: Arduino (remote control)

SparkFun Electronics Arduino Uno R3
Previously:
Mother Of all Relay Boxes
Rolling your own Commutator
Bulgaria (rotary switches)
Group Theory (toggle switches)
Relayer (electromagnetic relays)
Adding remote control to the relay-based prototype can be fairly trivial, since quite often the work has mostly been done for us already by others. One such easy route is via Arduino and infra-red, for which many IR receiver modules are cheaply available. Also available incidentally are WiFi and Bluetooth modules for Arduino, not to mention the fully Wi-Fi integrated MKR1000 and Uno WiFi, so there's no shortage of options. But today, I'll just be looking at IR.

Arduino pins driving transistors driving relays.
The Arduino Interface

Regardless of the connectivity solution adopted, the first requirement is for the Arduino device to take over operation of the four signals controlling the seven relays. At the moment these terminate at the thumbwheel switch, which can selectively operate one or more coils by connecting their lower ends to 0V. In the case of a relay pair, this results in a current of 150mA sinking through the switch contact - much more than an Arduino digital output can either sink or source (20mA continuous recommended, 40mA absolute max).

The solution is to use a transistor, as shown in this circuit diagram, to amplify the current capacity between each Arduino output and its associated relay coil(s). Here I've used my old favourite, the silicon bipolar npn device; MOSFETs are another option. The relay drivers are on pins 2 (45°), 4 (90°), 7 (180°), and 8 (Mode 5). The four so-called freewheeling diodes (e.g. 1N4007), slung across the relay coils in reverse, protect the transistors from the back EMF generated when the highly inductive load is switched. Now when one of these four Arduino outputs goes high (+5V), current flows through a resistor into the transistor base, switching it on. This allows a larger current to flow from the +12Vdc rail through the relay coil(s) and the transistor to 0V. Any general purpose npn transistor with the following specifications will do:
min DC current gain hFE ≥ 40
max DC collector current IC ≥ 200mA
max collector-emitter voltage VCEO ≥ 20V
max total power dissipation Ptot ≥ 100mW
The popular 2N2222 is one example of a suitable component, but note that its frequently cited European "functional equivalent" BC548 is actually ruled out by having too low a maximum collector current (100mA). Now let's choose an appropriate resistor value:
Rmax = Vcc / (Imax / hFE) = 5V / (150mA / 40) = 5V / 3.75mA = 1.3kΩ.
I'd probably recommend using 1kΩ or so for that extra 30% safety margin. If the base resistor value is too high, the base current will be too low to ensure the transistor saturates and remains outside its high dissipation, potentially destructive "linear" mode. By contrast, when in digital mode, the transistor is either fully off (collector current is zero) or fully on (collector-emitter voltage is essentially zero), so in each case, the power P = I * V ≈ 0.

The IR Library

The Arduino microcontroller development system has access to an excellent free IR control library, Arduino IRremote, by Ken Shirriff. Thanks Ken! This code resource both sends and receives infra-red signals. Many people have made use of this, including Jason Poel Smith, who very reasonably asks,
Most of the buttons on a remote control are never used.
So why not use them to control appliances and other electronics around your house?
then goes on to do just that - repurposing any unused command on any of your IR remotes, to control an electrical outlet switch. He even includes a simple and easy-to-use learning mode, whereby a single additional button press is all you need to teach your electronics which new signal it has to respond to.

The Command Set

Our requirements are a little more complicated than controlling the state of a single relay, but not by that much. We have to drive three transistors to control the orientation, and a fourth for Mode 5. So, four digital outputs, rather than one? No big deal.

Now for our UI commands. We'd like buttons to take us directly to a particular orientation, numbered maybe 0-7, maybe 1-8, or maybe mapped to the physical layout of a numeric pad - whatever you prefer. Two more buttons, to rotate from the current orientation by 45° increments, either left or right. A toggle, and/or two separate commands, to engage/disengage Mode 5. A reset button to set the orientation back to 0 and disengage Mode 5.

Sketch

Can't remember the last time the blog known as My Code Here contained any actual computer code, but anyway, here is the full Arduino sketch source for the project:

/*
  RoomSpin
  Audio soundstage rotation switch for 7.x surround sound system with 8 satellites
  http://mycodehere.blogspot.co.uk/2016/05/surround-sound-switch-6-arduino-remote.html
  This code is in the public domain - created 6 March 2016 by John Michael Kerr
*/

#include <irremote.h>
#include <irremoteint.h>

//#define TEST

void setup()
{
  setupRelays();
  #ifdef TEST
    setupTest();
  #else
    setupMain();
  #endif
}

void loop()
{
  #ifdef TEST
    loopTest();
  #else
    loopMain();
  #endif
}

// Main program setup & loop

void setupMain()
{
  setupReceiver();
}

void loopMain()
{
  long code = readReceiver();
  if (code)
    performCode(code);
}

// IR receiver handling

const int pinIR = A5;

IRrecv* receiver;
decode_results code;

void setupReceiver()
{
  Serial.begin(9600);
  receiver = new IRrecv(pinIR);
  receiver->enableIRIn();
}

long readReceiver()
{
  long result = 0;
  if (receiver->decode(&code))
  {
    result = code.value;
    Serial.println(result, HEX);
    receiver->resume();
  }
  return result;
}

// Command codes

const long
  codeDigits[8] =
  {
    0xbeef0000,
    0xbeef0001,
    0xbeef0002,
    0xbeef0003,
    0xbeef0004,
    0xbeef0005,
    0xbeef0006,
    0xbeef0007
  },
  codeLeft = 0xbeef0008,
  codeRight = 0xbeef0009,
  codeMode5_ON = 0xbeef000A,
  codeMode5_OFF = 0xbeef000B,
  codeMode5_TOGGLE = 0xbeef000C,
  codeReset = 0xbeef000D;

// Command codes for Sony BD (RMT-B119P)
//
//const long
//  codeDigits[8] =
//  {
//    0x00090B47, // 0
//    0x00000B47, // 1
//    0x00080B47, // 2
//    0x00040B47, // 3
//    0x000C0B47, // 4
//    0x00020B47, // 5
//    0x000A0B47, // 6
//    0x00060B47  // 7
//  },
//  codeLeft = 0x000DCB47, // Left arrow
//  codeRight = 0x0003CB47, // Right arrow
//  codeMode5_ON = 0x000E0B47, // 8
//  codeMode5_OFF = 0x00010B47, // 9
//  codeMode5_TOGGLE = 0x00066B47, // Blue
//  codeReset = 0x000E6B47; // Red

int compass = 0;
bool mode5 = false;

bool codeToMode(long code)
{
  switch (code)
  {
    case codeMode5_ON:
      return true;
    case codeMode5_OFF:
      return false;
  }
  return !mode5;
}

int performCode(long code)
{
  for (int c = 0; c < 8; c++)
    if (code == codeDigits[c])
      return rotateTo(c);
  switch (code)
  {
    case codeLeft:
      return rotateBy(-1);
    case codeRight:
      return rotateBy(+1);
    case codeMode5_ON:
    case codeMode5_OFF:
    case codeMode5_TOGGLE:
      return setMode5(codeToMode(code));
    case codeReset:
      mode5 = false;
      return rotateTo(0);
  }
  return 0;
}

int rotateBy(int eighths)
{
  return rotateTo(compass + eighths);
}

int rotateTo(int eighths)
{
  compass = eighths & 7;
  setRelays();
  return compass;
}

int setMode5(bool value)
{
  mode5 = value;
  setRelays();
  return 0;
}

// Drive the relays

const int pinCTRL[4] = {7, 8, 12, 13};

void setRelayMask(int pin, int mask)
{
  setPinMask(pin, compass, mask);
}

void setRelays()
{
  for (int p = 0; p < 3; p++)
    setRelayMask(pinCTRL[p], 1 << p);
  setPinIf(pinCTRL[3], mode5);
  delay(100); // Let the relays settle.
}

void setupRelays()
{
  for (int p = 0; p < 4; p++)
    pinMode(pinCTRL[p], OUTPUT);
}

// Low level I/O support

void setPinIf(int pin, bool condition)
{
  digitalWrite(pin, condition ? HIGH : LOW);
}

void setPinMask(int pin, int value, int mask)
{
  setPinIf(pin, (value & mask) != 0);
}

// End of tab

This listing shows placeholders for the actual IR remote codes generated by your remote. Run the program with the Serial Monitor enabled, then blast it with your own remote, making note of the hex code generated by each of your chosen command buttons. Then search my source for the string 0xbeef, and replace these hex constants with your own. The numeric keys (here numbered 0 to 7) are stored in order in the codeDigits array, and the command names following these should be self-explanatory.

I'm currently using this prototype with codes for a Sony BDPS590 Blu-Ray player (remote control model number RMT-B119P), these are the codes in the commented-out section below the placeholders. Known affectionately to my wife and me as as "stubby buttons", this is a well-behaved remote - most buttons generate a single code followed by a stream of 0xFFFFFFFF, as long as they're held down. The only exceptions are volume up/down, mute, and the other TV buttons, whose output depends entirely upon which make & model of TV you've programmed it for. With other remote brands, be prepared to do a little C++ protocol tweaking to handle alternate and/or repeating code complications.

Wire Test

Last time I promised you a fully automated wiring test using just the Arduino Uno with no additional hardware. How are we going to achieve that with only 14 digital I/O pins available on the development board, when there are 19 or 20 terminations on our relay loom? Count them: 4 control inputs, and on the audio side, 7 or 8 inputs plus 8 outputs. Answer: by pressing the Arduino's six analog inputs A0-A5 into service. These work just as well as digital inputs, and bring the available total to exactly plenty. In fact I've already used A5 to interface the IR receiver module (pinIR in the code), rather than the default pin 11.

Say we keep the existing pins 2/4/7/8 attached to the four coil controls, as in the diagram above. Now associate pins 3/5/6/9/10/11/12/13 respectively with the eight audio amplifier outputs. For test purposes these will take the place of the physical amplifier outputs in real life.

Next, for the loudspeaker inputs, associate analog inputs A0-A5, operating in digital mode, with the first six, and pins 0/1 with the remaining two.  The IR receiver module must be disconnected from pin A0 during this test. Now all our test program needs to do is drive the coil controls with every binary pattern from 0 to 15, and for each pattern, walk a single bit (actually a logic zero) from the first audio amplifier output through to the last, checking that it appears only on the expected loudspeaker input pin, if any.

Note the change in I/O terminology here. While designing the relay network, we called the amplifier signals inputs and the loudspeaker destinations outputs. That made sense from the viewpoint of the switch. Now in the Arduino software, from the perspective of the system testing the switch, our ins & outs are swapped around.

Here is the source code for the wire test, which should be added as a new tab to the main code above. Then in the main sketch, remove the double slashes from the line //define TEST. Remember to undo this edit (and reconnect the IR receiver module) once the wire test is complete.

/*
  WireTest
  A wiring test utility for the RoomSpin project
  http://mycodehere.blogspot.co.uk/2016/05/surround-sound-switch-6-arduino-remote.html
  This code is in the public domain - created 6 March 2016 by John Michael Kerr
*/

const int
  pinIN[8] = {A0, A1, A2, A3, A4, A5, 0, 1},
  pinOUT[8] = {3, 5, 6, 9, 10, 11, 12, 13};
  
int
  output,
  expected,
  actual;

void setupTest()
{
  for (int p = 0; p < 8; p++)
  {
    pinMode(pinIN[p], INPUT_PULLUP);
    pinMode(pinOUT[p], OUTPUT);
  }
  writeOutput(0xFF);
}

void loopTest()
{
  for (compass = 0; compass < 8; compass++)
  {
    setRelays();
    for (int mask = 1; mask < 0x100; mask <<= 1)
    {
      writeOutput(mask ^ 0xFF);
      delay(50); // Let the outputs settle.
      readExpected();
      readActual();
      while (actual != expected); // Crash!
    }
    writeOutput(0xFF);
  }
  mode5 = !mode5;
}

void readActual()
{
  actual = 0;
  for (int p = 0, mask = 1; p < 8; p++, mask <<= 1)
    if (digitalRead(pinIN[p]))
      actual |= mask;
    else
      actual &= ~mask;
}

void readExpected()
{
  int mask = output ^ 0xFF;
  if (mode5)
    mask = useMode5(mask);
  mask <<= compass;
  if (mask > 0xFF)
    mask >>= 8;
  expected = mask ^ 0xFF;
}

int useMode5(int mask)
{
  switch (mask)
  {
    case 0x01:
    case 0x40:
      return 0;
    case 0x02:
      return 0x01;
    case 0x20:
      return 0x40;
  }
  return mask;
}

void writeOutput(int value)
{
  output = value;
  for (int p = 0, mask = 1; p < 8; p++, mask <<= 1)
    setPinMask(pinOUT[p], output, mask);
}

// End of tab

There's one headache with using up all 20 I/O pins in this way. Serial communications normally proceed via Arduino pins 0 and 1. With these tied up, how are we to glean any diagnostic information form the wire test?

My simple solution is first to add LEDs with series current limiting resistors to all twelve output pins (four relay drivers and eight audio channels). Now run the test, and jump into an infinite loop as soon as any unexpected result occurs. That's the function of this rather suspect looking line of code, with its barely noticeable empty loop statement:
while (actual != expected); // Crash!
All being well, these LEDs will flash binary patterns and masks, repeating one full test cycle every eight seconds. When the unthinkable happens, the LEDs become frozen, displaying in an unambiguous snapshot the state of all output signals, at the instant of fault detection. Yay diagnostics!

Here's a short video of the wire test in action. It's a bit less dramatic than its title suggests. But if you've read this far, you know that already.



In a past life, I worked with embedded systems and microcontroller projects, based on hardware such as the Motorola MC68HC705 series [pdf], for over 15 years (1980-1995). This is the first time I've used a high level language which I didn't have to design and implement entirely on my own. Okay, it's only C++ with a little preprocessor supplied syntactic sugar, but I'm still impressed. I like your brave new world!

Future Expansion

Hmm, so back into normal operation, and the Arduino Uno still has a bunch of those analog input pins free, eh. It's tempting to drive them with signals derived from the actual audio waveforms, suitably rectified and limited, then perhaps using some custom automatic gain control (AGC) code, translate those input levels to PWM brightnesses feeding a retro ring of eight front panel LEDs. When the audio is quiet, these LEDs could pull double duty by indicating the currently selected orientation.

In fact that was the thinking behind the quirky output pin selections for the relay drivers and the IR receiver module. Since outputs PD3/5/6 and PB1/2/3 are capable of PWM operation, they're reserved for future LED driving duty. I'd be happy enough driving these LEDs in pairs just like the relays, but if you demand one LED per audio channel, you might want to reassign some I/O and use the Arduino Leonardo. That board offers an additional PWM output on pin 13, as well as extending analog input capability to several of the digital I/O pins.

Any other additional features? Maybe we'd also like the switch to revert automatically to the default, powered-down state, after a few hours of inactivity - just so we don't accidentally leave the relay coils needlessly burning up the watts for weeks on end when not in use.

Two Distinct Defaults

Typically a switch like this will spends most of its life in just one particular orientation, with an occasional foray into a second, still less frequently a third, and so on. Obviously it's worth wiring the most frequently used orientation as the default one, which has been called "North" in my descriptions to date, and in which all seven relays are de-energised. Then for most of the time you can simply have the device unplugged or switched off, saving power and component life.

Less obviously, the second most popular switch state might benefit from being stored in non-volatile memory, and selected automatically on power up. That way, whenever movie night, holiday projector time, or whatever other occasion rocks up, you need only power up, and the sound stage rotates instantly to the secondary setting, ready for the evening's entertainment.

Such a fixed "secondary default" could easily be programmed with a few seconds' work. A better solution however might be to introduce a new command, allowing the current switch state to be saved in the Arduino microcontroller's non-volatile EEPROM memory with the press of a button, and subsequently, to be retrieved from there upon power up. Or to automate the process completely, write the state to EEPROM every time it's changed, so the switch effectively remembers its setting through a power cycle. Just be aware of the EEPROM erase/write limit of nominally 100,000 operations.

The EEPROM storage requirements of this design are reasonably low, at one half of a byte.

Next time: wrapping up.