sound with Dyalog APL
6 posts
• Page 1 of 1
sound with Dyalog APL
Dear All,
How to stress the speaker of computer and generate the beep with a frequency defined ?
to start, i dont search necessarly tu produce sound of specific instrument.
my personnal goal is to play persian music, with quater of tone.
i suppose indian music is not very different.
For chinese and japanese, scale of tune are not similare of occidental music.
korean too.
but range of frequency are the same.
all yours help are welcome.
Yves
How to stress the speaker of computer and generate the beep with a frequency defined ?
to start, i dont search necessarly tu produce sound of specific instrument.
my personnal goal is to play persian music, with quater of tone.
i suppose indian music is not very different.
For chinese and japanese, scale of tune are not similare of occidental music.
korean too.
but range of frequency are the same.
all yours help are welcome.
Yves
- Yves
- Posts: 39
- Joined: Mon Nov 30, 2015 11:33 am
Re: sound with Dyalog APL
A starting point could be to check this message on this same forum: https://forums.dyalog.com/viewtopic.php?f=12&t=1044&start=10
The code, especially the one in the github repo mentioned further down the thread, looks ready to be used, though I have not tried it.
I have had success with similar techniques in the past but I seem to have misplaced my workspaces.
I have also experimented with NAudio (https://github.com/naudio/NAudio) but I had to write some glue code in C# which makes the whole business a bit tricky.
Another approach could be to communicate with an external synthesizer: I know that in a lot of projects people gravitate towards SuperCollider which, among the other ways, can be driven from external programs using a simple TCP based protocol called OSC. https://en.wikipedia.org/wiki/Open_Sound_Control
https://doc.sccode.org/Guides/OSC_communication.html
This is a far cry from the simplicity of []SOUND in APL*PLUS but will give you much more in the long term.
As far as computing the frequencies... Well, as you know, in equal temperament, the audible range is divided in octaves, each octave being a doubling in frequency. Conventionally, a certain note (A of the 4th octave, aka A4) is said to have frequency 440Hz. A5 will be 880Hz. How about the 12 semitones in between? Each one is obtained by multiplying (https://en.wikipedia.org/wiki/Equal_temperament) the previous by the 12th root of 2 which is approximately 1.059463. So A#4 will have frequency 466.16, B4 will vibrate at 493.88 and so on.
I hardly know anything about other tuning systems but I assume they will all have their mathematical rules which have been extensively studied, so that should be easy.
Best of luck and if you come up with something cool, I'd love to hear what you have done!
The code, especially the one in the github repo mentioned further down the thread, looks ready to be used, though I have not tried it.
I have had success with similar techniques in the past but I seem to have misplaced my workspaces.
I have also experimented with NAudio (https://github.com/naudio/NAudio) but I had to write some glue code in C# which makes the whole business a bit tricky.
Another approach could be to communicate with an external synthesizer: I know that in a lot of projects people gravitate towards SuperCollider which, among the other ways, can be driven from external programs using a simple TCP based protocol called OSC. https://en.wikipedia.org/wiki/Open_Sound_Control
https://doc.sccode.org/Guides/OSC_communication.html
This is a far cry from the simplicity of []SOUND in APL*PLUS but will give you much more in the long term.
As far as computing the frequencies... Well, as you know, in equal temperament, the audible range is divided in octaves, each octave being a doubling in frequency. Conventionally, a certain note (A of the 4th octave, aka A4) is said to have frequency 440Hz. A5 will be 880Hz. How about the 12 semitones in between? Each one is obtained by multiplying (https://en.wikipedia.org/wiki/Equal_temperament) the previous by the 12th root of 2 which is approximately 1.059463. So A#4 will have frequency 466.16, B4 will vibrate at 493.88 and so on.
I hardly know anything about other tuning systems but I assume they will all have their mathematical rules which have been extensively studied, so that should be easy.
Best of luck and if you come up with something cool, I'd love to hear what you have done!
-
StefanoLanzavecchia - Posts: 113
- Joined: Fri Oct 03, 2008 9:37 am
Re: sound with Dyalog APL
Stefano in his response included a link to some work I did some years back. I have now updated the work from dealing with one ".WAV" file per TONE, to a single ".WAV" files with whole tunes including cords in stereo.
The new code has a function to create sine waves at any (audible) frequency, albeit from a function for western scales with 12 semi-tones per octave. Quarter tones should however be no problem.
My code is available on https://github.com/RayCannon/Wave
The main difficulty I have had was relating to unwanted "Snaps and Pops" that occurred when changing the notes/codes part way thru a wave-length. These discontinuities resulted in the unwanted noise. I have managed to reduce most of the discontinuities, but not completely.
TestTune can be run to produce small "keep" files that Dyalog's "Chart Wizard" can display showing how effective my efforts have been.
Here is the result of TestTune creating a file with equal notes of silence, 20.8Hz, silence, 66.666Hz, 28.27433Hz, silence and 50.7Hz.(My code automatically adds a trailing silence to prevent a final "pop at the music's end.)
While here is a close-up of the change 66.666Hz and 28.27433Hz.
The new code has a function to create sine waves at any (audible) frequency, albeit from a function for western scales with 12 semi-tones per octave. Quarter tones should however be no problem.
My code is available on https://github.com/RayCannon/Wave
The main difficulty I have had was relating to unwanted "Snaps and Pops" that occurred when changing the notes/codes part way thru a wave-length. These discontinuities resulted in the unwanted noise. I have managed to reduce most of the discontinuities, but not completely.
TestTune can be run to produce small "keep" files that Dyalog's "Chart Wizard" can display showing how effective my efforts have been.
Here is the result of TestTune creating a file with equal notes of silence, 20.8Hz, silence, 66.666Hz, 28.27433Hz, silence and 50.7Hz.(My code automatically adds a trailing silence to prevent a final "pop at the music's end.)
While here is a close-up of the change 66.666Hz and 28.27433Hz.
Ray Cannon
Please excuse any smelling pisstakes.
Please excuse any smelling pisstakes.
-
ray - Posts: 238
- Joined: Wed Feb 24, 2010 12:24 am
- Location: Blackwater, Camberley. UK
Re: sound with Dyalog APL
To remove the clicks, which are due to discontinuities in the sample waveform, I recommend fading all the notes: fade in (less important because you always start from 0), and fade out (so that the last sample of each note is a 0). You can simply apply a linear ramp which goes from 1 to 0 in the last fraction of millisecond. Example of (Python) code in exactly the same context: https://stackoverflow.com/a/42310911.
You can also apply a low pass filter to your signal (which is the same as integrating) because the filter adds "inertia", so to speak, to the original signal, removing the discontinuities. A simple digital low pass filter can be implemented as a moving average of the signal.
You can also apply a low pass filter to your signal (which is the same as integrating) because the filter adds "inertia", so to speak, to the original signal, removing the discontinuities. A simple digital low pass filter can be implemented as a moving average of the signal.
-
StefanoLanzavecchia - Posts: 113
- Joined: Fri Oct 03, 2008 9:37 am
Re: sound with Dyalog APL
Thanks for the information Stefano. I have solved the problem of clicks and pops by the used of overlapping voices.
My latest code is now available on GitHub at https://github.com/RayCannon/Toccata which now contains the the code to produce the full Toccata from Bach's Toccata and Fugue in D-minor.
Since WAV files are huge, (Toccata.wav is 36Mb) the GitHub has an MP3 version (produced from the WAV version) at only 2Mb.
Within the code, I have augmented the simple sine waves with multiple harmonics with varying loudness levels. These harmonics attempt to simulate various organ pipes characteristics, such as "Closed pipes" having mainly odd harmonic numbers unlike "Open pipes" having both odd and even. In some pipes, the fundamental is not the loudest harmonic, which greatly surprised me!
The values returned by "SelectPipe" are <harmonics> and <volumes>.
<harmonics> is multiplied with the fundamental frequency to produce the frequency of all the harmonics being produced. The resulting samples values are then multiplied by the <volumes> to adjust the relative loudness of each harmonic.
In addition to the harmonics, I have added reverberation, to attempt to simulate a large hall. (60db drop after 2 seconds.)
Note that the original left and right channels end in extensive silence, so the delay is produced by rotation of some of this silence from the end to the start.
I have attempted to add the MP3 file to this reply, but the forum limits file sizes:
"The file is too big, maximum allowed size is 256 KiB."
My latest code is now available on GitHub at https://github.com/RayCannon/Toccata which now contains the the code to produce the full Toccata from Bach's Toccata and Fugue in D-minor.
Since WAV files are huge, (Toccata.wav is 36Mb) the GitHub has an MP3 version (produced from the WAV version) at only 2Mb.
Within the code, I have augmented the simple sine waves with multiple harmonics with varying loudness levels. These harmonics attempt to simulate various organ pipes characteristics, such as "Closed pipes" having mainly odd harmonic numbers unlike "Open pipes" having both odd and even. In some pipes, the fundamental is not the loudest harmonic, which greatly surprised me!
- Code: Select all
(harmonics volumes)←loud SelectPipe pipe;Hnums;ratios;powers
⍝ set up the harmonics for any "set of pipes"
⍝ See http://www.colinpykett.org.uk/observations-on-organ-pipe-sounds-frequency-spectra.htm#Refs
:Select pipe
:Case 'Q' ⍝ Silence
harmonics←,1
volumes←,loud
:Case 'D' ⍝ Open Diapason both odd and even harmonics
ratios←1 4 8 8 8 8 10 32 64
harmonics←1+⍳≢ratios
powers←2×harmonics
volumes←loud÷powers{⍵,(≢⍵)↓⍺}ratios
:Case 'F' ⍝ closed Flute mainly odd numbered harmonics
ratios←1 8 2 16 8 32
harmonics←1+⍳≢ratios
powers←2×harmonics
volumes←loud÷powers{⍵,(≢⍵)↓⍺}ratios
:Case 'R' ⍝ Reed pipe
ratios←1.5 1.6 1 2.2 2.5 3 6 12 24 48
harmonics←1+⍳≢ratios
powers←2×harmonics
volumes←loud÷powers{⍵,(≢⍵)↓⍺}ratios
:Case 'S' ⍝ open String Pipe
ratios←(3⍴1.5),1,(⌽2+2÷1+⍳6),(8+4×⍳8)
harmonics←1+⍳≢ratios
powers←2×harmonics
volumes←loud÷powers{⍵,(≢⍵)↓⍺}ratios
:Else
ratios←1+⍳11
harmonics←1+⍳≢ratios
powers←2×harmonics
volumes←loud÷powers{⍵,(≢⍵)↓⍺}ratios
:End
The values returned by "SelectPipe" are <harmonics> and <volumes>.
<harmonics> is multiplied with the fundamental frequency to produce the frequency of all the harmonics being produced. The resulting samples values are then multiplied by the <volumes> to adjust the relative loudness of each harmonic.
In addition to the harmonics, I have added reverberation, to attempt to simulate a large hall. (60db drop after 2 seconds.)
- Code: Select all
Echo;a;i;⎕IO;delay;j;echo;delayecho
⍝ aim for 2 seconds for reverb to drop by 60db
⎕IO←1
j←2
:For i :In 2↓2*⍳8 ⍝ 6 steps each of 10 db loss
echo←G.(left+right)÷i ⍝ an echo is in mono but reduced in amplituide
j+←1 ⍝ shorten the delay each time round the loop seems to help
delay←-⌊G.rate÷j ⍝ initial delay 1/3 of a second
delayecho←delay⌽echo ⍝ add a delay
G.left+←delayecho ⍝ add the echo to the initial sound
G.right+←delayecho ⍝ to both channels
:End
Note that the original left and right channels end in extensive silence, so the delay is produced by rotation of some of this silence from the end to the start.
I have attempted to add the MP3 file to this reply, but the forum limits file sizes:
"The file is too big, maximum allowed size is 256 KiB."
Ray Cannon
Please excuse any smelling pisstakes.
Please excuse any smelling pisstakes.
-
ray - Posts: 238
- Joined: Wed Feb 24, 2010 12:24 am
- Location: Blackwater, Camberley. UK
Re: sound with Dyalog APL
Out of interest, here are some ChartWizard plots of various "pipes"
Ray Cannon
Please excuse any smelling pisstakes.
Please excuse any smelling pisstakes.
-
ray - Posts: 238
- Joined: Wed Feb 24, 2010 12:24 am
- Location: Blackwater, Camberley. UK
6 posts
• Page 1 of 1
Who is online
Users browsing this forum: No registered users and 1 guest
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group