Fanfare for St Cecilia’s Hall played by Sonic Pi

Last week my Wife and I had the privilege of attending the official opening ceremony of St. Cecilia’s Hall in Edinburgh. This music hall, the oldest in Scotland, was purchased by Edinburgh University on 1959, and my Father, who was then Professor of Music at the Univerisity was instrumental (forgive the pun) i negotiating the housing of a collection of early musical keyboard instruments made by Raymond Russell. The Hall was opened in 1968 following this refurbishment.Since then the number of instruments in the Collection has increased, most notably by the acquisition of the Rodger Mirrey Collection of Early Keyboard Instruments. In January 2004 the decision was taken to add the Reid Concert Hall Museum of Instruments (the John Donaldson Collection of Musical Instruments).belonging to the University, and  major refurbishment program was started to give a fitting new home for all of the instruments. This took three years to complete, and the Hall was closed for over two years whilst the changes took place. It was opened again for use earlier this year, and last week was officially opened in a ceremony by H.R.H. The Princess Royal.

As part of that ceremony a musical Fanfare composed by Andrew Blair, Masters Student in Composition at the Reid School of Music in the University. He graciously gave me permission to take the score and transcribe the music for Sonic Pi to play. I typed the notes in by hand, as printed for two Bb trumpets, and applied a transposition of -2 semitones to give the correct concert pitch, and first produced a version using the built in :tri synth on Sonic Pi. With the addition of some reverb this produced a very acceptable performance. However in an effort to make it sound more authentic, I then tried using the trumpet samples from the Sonatina Symphonic Orchestra, for which I had previously written code which I have used extensively to produce sample based instruments for Sonic Pi. However in this case, I found that the samples didn’t work very well, particularly on some of the lower notes. I did some experimentation using the music program MuseScore 2. First I modified the Sonic Pi code to use midi commands instead of play commands, and I fed the output into MuseScore 2 setting up two instrument tracks with trumpet instruments. This gave a much better rendition, but was rather unwieldy.

I decided to generate my own trumpet samples from MuseScore 2. To do this, I chose the same notes as for the samples in the Sonatina Symphonic Library, namely
a#3,a#4,a#5,c#3,c#4,c#5,c#6,e3,e4,e5,e6,g3,g4,g5 (all concert pitch)
From these all other notes are produced by playing samples more slowly or faster. Using these pitches, I could use the samples with my existing code to handle the Sonatina Symphonic Samples. I set up a “score” to play single long notes for each of these pitches, with rests in between, and then played them in MuseScore 2, recording the output in Audacity. I then diced them up in audacity, producing individual .wav files for each of the pitches, and normalising them before saving the files. I tried the resulting samples with my Sonatina code and it worked perfectly.
So I produced the second version, using these samples which sounds very realistic.

You can download the code for both versions from my gist site here

You can hear what they sound like on soundcloud here

The opening of the Hall was a very moving experience for me, and ti was enhanced with Andrew’s brass fanfare, and with other music played on a Virginal from the collection, made by Stephen Keene in London in 1668

Two of the early keyboard instruments in the collection (plus my Wife in the distance!)

If you like musical instruments, and are visiting Edinburgh, I would encourage you to visit the Hall and the Museum. Their website is http://www.stcecilias.ed.ac.uk/ There is also an app which lets you explore the collection of instruments Apple version      Android version

You can read about the history of the hall on this site (It also contains pictures from the first refurbishment of the Hall in the 1960s).

Advertisements

LightshowPi drives a sensehat using Sonic Pi

Two years ago I produced a video showing the then Sonic Pi 2.7 driving the leds on a sense-hat using hacked lightshowPi software using the then current version. I didn’t write up the software which was quite complex, but merely posted a video of the system operating on youtube. Recently I was asked on twitter if I could share the code, as some students in California wanted to try it out. I managed to located the SD card containing the software, and fired it up on a Raspberry Pi2 using the then prevalent Sonic Pi and operating system and got it working. I then decided to see if I could update it to run on the latest OS on a Pi3 and with a later version of Sonic PI. I have now managed to do this and am publishing the code so that others can try it out.

The system also requires an external USB audio card, to give an audio input that can be used by LightshowPi. I used a sabrent usb module which I obtained on Amazon (UK) which is also available in the states here Three other pieces of hardware are required (apart from a sensehat!). A two way stereo audio splitter lead (3.5mm jack to 2 3.5mm sockets), a stereo 3.5mm jack to jack lead, and a short usb extender lead as the Sabrent audio card is a little fat to plug into the Pi directly.

System overview
PLug the sensehat into a Pi3 running Raspbian Stretch, set the default audio to the built in bcm2835 ALSA card using Prefereces=> Audio Device Settings on the Pi main menu. Click Select Controls if you can’t see the Playback slider, and make sure it is active and at maximum, before clicking OK and start Sonic Pi running. Use a “punchy” piece like my sparkling tom-toms for best effect. The audio output from this is fed to a two way splitter plugged into the audio out 3.5mm socket on the Pi. One of these outputs goes to an external audio amp so you can hear the sound, the other is fed to the microphone input on the Sabrent USB audio card. This supplies an audio feed to the modified lightshowpi code. You can see the wiring below. The dual splitter plugged into the 3.5mm audio out socket, with a red lead going to an audio amplifier and speakers (out of the photo) and the white lead fed back into the microphone input to the Sabrent usb audio card which is plugged into the Pi via a short extender lead, as it is rather fat to plug in directly. Other leads are to the hdmi monitor, the power supply and to a usb keyboard and usb mouse (all out of the picture).


Install the current version of lightshowpi using the instructions at http://lightshowpi.org/download-and-install/

Download my modified code for lightshowpi from here  and copy the file to the top level of the lightshowpi folder. Right-click the file lsp_sensehat.tar.gz (in the gui) and select extract here, and two folders will be created, py_sensehat and sensehat_config These contain the modified files set up to utilise the sense hat rather than individual leds connected to the gpio pins. Essentially this is based on an earlier version of lightshowpi. The reason for installing the latest version is to install the various background files and utilities used by the lightshowpi files. You can see the contents of the lightshowpi folder with the two additional folders from the lsp_sensehat.tar.gz file below.
Before starting to use the system, you should check that the microphone input sensitivity is setup. to do this select Audio Device Settings from Preferences on the Raspberry Pi main menu. Select the USB Audio Device (Alsa mixer) from the Sound Card list at the top, click Select Controls and select Speaker and Microphone from the list (NOT Microphone Capture). Click Close, and adjust the Microphone slider to maximum, and make sure it is enabled in the box below the slider. You can disable the Speaker output in the left hand box below the two Speaker sliders as we are not using audio output via the USB card. Then close the Audio Device Settings window. NB make sure that bcm2835 ALSA is still marked as default, as shown in the FIRST Audio Device Settings picture above. Below you can see the settings for the USB Audio card.
To start lsp running do the following from a terminal:

cd ~
cd lightshowpi/py_sensehat
sudo python synchronized_lights.py

You should see the message Running in audio-in mode, use Ctrl+C to stop on the screen. All being well, if you start Sonic Pi playing then after a pause of a few seonds as audio samples are built up by lightshowpi the sensehat leds should start flashing in response to the music You need quite loud music for it to work.

How does it all work?
I’m not going to go into great detail, as it would take too long, but I can give one or two pointers. Lightshowpi is a system which can take an audio input from an audio input or from a music file eg .wav, .mp3 and analyse it using fast fourier transforms to produce a series of outputs for different ranges in the audio spectrum. These can then be channeled to control LEDs connected to the gpio pins on the raspberry pi. What I have done is to hack the code that channels the outputs to the gpio pins, and instead send them to a python program testled.py within the py_sensehat folder which contains a series of function which can control LEDs on the sense hat. In the program I use columns of LEDs coloured with a rainbow, which can be switched on or off. using turn_on_light(num) and turn_off_light(num). These two commands are used in the hacked hardware_controller.py program in the py_sensehat folder, replacing calls to wiringpi which are commented out. The configuration settings for using the sensehat are contained in the sensehat_config folder. In particular the overrides.cfg file in that folder is worth looking at. As supplied the columns in the sensehat are triggered by different frequency ranges starting from low at one side of the sensehat up to high at the other. In the last line of the overrides.cfg file there is a commented out line which allows a different channel mapping which gives a symmetrical output which you may find preferable. To try it out uncomment the line and restart the synchronized_lights program. Notice also the details of the audio card which has the internal name ‘Device’ which you can see if you type aplay -l in a terminal.
The only update I had to do to my hacked files to work with the latest lightshowpi was to replace a reference to import wiringpi2 as wiringpi with import wiringpi as wiringpi as this module appears to have changed its names between versions, and is installed by the latest lightshowpi.
If I had more time, further work on integrating the sensehat to lightshowpi could be done, so that it would fit into the latest and any subsequent version, but I leave that to any other interested party to take on.

Finally, if you like this project you may also be interested in a project to flash the lights on the PiHat Christmas Tree which I have recently described here