Variable frequency audio generator...

 
Thread Tools Search this Thread
Operating Systems OS X (Apple) Variable frequency audio generator...
# 1  
Old 08-13-2016
Variable frequency audio generator...

Hi all...

I intend to do an Audio Function Generator using Awk, (already started thanks to Don), but the biggest thing I have struggled with was variable frequency.

I was going to generate differing sized waveforms on the fly but that would that would mean the frequencies are dependent on any even number of bytes as odd numbered bytes could never create a symmetrical waveform like a sinewave or alternatively have a pre calculated look up table of lots of waveforms and sizes...

Then VOILA, a little lateral thinking created this idea; how about using a back door and forcing a .WAV file to use a different RATE inside its header.

Well it WORKS! WOOHOO...

This is a bash DEMO and has no error checking.
It suffers from aliasing at LF and minor frequency error on HF with and 8 byte sinewave set of values as because of the sampling frequency used.
Code:
#!/bin/bash
# VariFreq.sh
# NOTE:- This DEMO is only for 8 bit depth, unsigned integer, mono wave samnples.
# Other depths, stereo and signed 16 bit integers are equally posiible but this is all I need.
# Creative Commons Licence CC0. (Public Domain). First Upload to https://www.unix.com.
#
HEADER_START="\\x52\\x49\\x46\\x46\\x24\\x00\\x08\\x00\\x57\\x41\\x56\\x45\\x66\\x6d\\x74\\x20\\x10\\x00\\x00\\x00\\x01\\x00\\x01\\x00"
# bit 'RATE' and byte 'rate' default settings at 8000 SPS, 8 bit depth, mono, unsigned integer.
RATE="\\x40\\x1f\\x00\\x00\\x40\\x1f\\x00\\x00"
HEADER_END="\\x01\\x00\\x08\\x00\\x64\\x61\\x74\\x61\\x00\\x00\\x08\\x00"
DATA="\\x80\\x26\\x00\\x26\\x7F\\xD9\\xFF\\xD9"
FREQ=1000
SAMPLE=8000
BURST=10
#
clear
#
audio_signal()
{
	# Generate the 512KB file.
	printf "%b" "$HEADER_START" > /tmp/sinewave.wav
	printf "%b" "$RATE" >> /tmp/sinewave.wav
	printf "%b" "$HEADER_END" >> /tmp/sinewave.wav
	for waveform in {0..15}
	do
	        DATA=$DATA$DATA
	done
	printf "%b" "$DATA" >> /tmp/sinewave.wav
}
#
while true
do
	printf "\nEnter frequency between 250 and 6000, Ctrl-C to stop:- "
	read -r FREQ
	echo ""
	# Limited error checking here as it is a DEMO.
	if [ "$FREQ" = "" ]
	then
		FREQ=1000
	fi
	SAMPLE=$(( 8 * FREQ ))
	if [ "$FREQ" -gt 6000 ] || [ "$FREQ" -lt 250 ]
	then
		# Reset to 1KHz.
		SAMPLE=8000
	fi
	SAMPLE=$( printf "%04x" "$SAMPLE" )
	RATE="\\x${SAMPLE:2:2}\\x${SAMPLE:0:2}\\x00\\x00\\x${SAMPLE:2:2}\\x${SAMPLE:0:2}\\x00\\x00"
	DATA="\\x80\\x26\\x00\\x26\\x7F\\xD9\\xFF\\xD9"
	audio_signal
	# OSX command line player.
	afplay -t $BURST -d /tmp/sinewave.wav
	# ALSA command line player.
	# aplay -d $BURST -v /tmp/sinewave.wav
done

Results, MBP OSX 10.7.5, default bash terminal.
Code:
Enter frequency between 250 and 6000, Ctrl-C to stop:- 1357

Playing file: /tmp/sinewave.wav
Playing format: AudioStreamBasicDescription:  1 ch,  10856 Hz, 'lpcm' (0x00000008) 8-bit unsigned integer
Buffer Byte Size: 16384, Num Packets to Read: 16384

Enter frequency between 250 and 6000, Ctrl-C to stop:- 577

Playing file: /tmp/sinewave.wav
Playing format: AudioStreamBasicDescription:  1 ch,   4616 Hz, 'lpcm' (0x00000008) 8-bit unsigned integer
Buffer Byte Size: 16384, Num Packets to Read: 16384

Enter frequency between 250 and 6000, Ctrl-C to stop:- 5781

Playing file: /tmp/sinewave.wav
Playing format: AudioStreamBasicDescription:  1 ch,  46248 Hz, 'lpcm' (0x00000008) 8-bit unsigned integer
Buffer Byte Size: 23124, Num Packets to Read: 23124

Enter frequency between 250 and 6000, Ctrl-C to stop:- 234

Playing file: /tmp/sinewave.wav
Playing format: AudioStreamBasicDescription:  1 ch,   8000 Hz, 'lpcm' (0x00000008) 8-bit unsigned integer
Buffer Byte Size: 16384, Num Packets to Read: 16384

Enter frequency between 250 and 6000, Ctrl-C to stop:- 6001

Playing file: /tmp/sinewave.wav
Playing format: AudioStreamBasicDescription:  1 ch,   8000 Hz, 'lpcm' (0x00000008) 8-bit unsigned integer
Buffer Byte Size: 16384, Num Packets to Read: 16384

Enter frequency between 250 and 6000, Ctrl-C to stop:- ^C
AMIGA:barrywalker~/Desktop/Code/Shell> _

Enjoy finding simple solutuons to often bery difficult problems...

Bazza.
# 2  
Old 08-18-2016
Interesting solution! I'm surprised it can tell the diff between 6000 and 6001 hz, most audio devices run at fixed frequencies and most players don't bother correcting. Using your much-beloved sox utility on a fixed-rate raw file might give you more reliable and portable control -- resample it to one rate and force it to output at another rate.

Something like:

Code:
printf "\x01\xff" > file0 # Square wave
printf "" > file1

# Double the number of wavelengths 2^8 i.e. 256 times
for N in 1 2 3 4 5 6 7 8
do
        cat file0 >> file1
        cat file1 >> file0
done

while true
do
        cat file0 file1
done | sox ...

rm -f file0 file1

# 3  
Old 08-19-2016
Hi Corona688...

Files are not needed if you are using SOX and piping.
An ultra simple string piped into sox without the need for files at all...
But I am NOT using SOX here but the very, very limited afplay audio player for OSX.
afplay cannot replay raw files only a few basic formats of which .WAV is one.
Code:
#!/usr/local/bin/dash
square="    ~~~~"
for n in 1 2 3 4 5 6 7 8 9 10
do
	square=$square$square
done
echo "$square" | sox -b 8 -c 1 -e unsigned-integer -t raw -r 8000 - -d

Results:-
Code:
Last login: Fri Aug 19 10:08:28 on ttys000
AMIGA:barrywalker~> cd Desktop/Code/Shell
AMIGA:barrywalker~/Desktop/Code/Shell> chmod 755 sox_pipe.sh
AMIGA:barrywalker~/Desktop/Code/Shell> ./sox_pipe.sh

-: (raw)

  Encoding: Unsigned PCM  
  Channels: 1 @ 8-bit    
Samplerate: 8000Hz       
Replaygain: off         
  Duration: unknown      

In:0.00% 00:00:01.02 [00:00:00.00] Out:45.2k [======|======] Hd:1.3 Clip:0    
Done.
AMIGA:barrywalker~/Desktop/Code/Shell> _

Just change the sample speed inside SOX from 8000 to anything you like within limits.
Login or Register to Ask a Question

Previous Thread | Next Thread

8 More Discussions You Might Find Interesting

1. OS X (Apple)

A simple variable frequency sinewave audio generator.

Hi all... Well I have not been inactive but working out how to make OSX 10.14.x command line audio player have a variable sample rate. This is a back door as afplay does not have a sample rate flag unlike aplay for ALSA, in Linux flavours. This is a DEMO only but a derivative of it will... (2 Replies)
Discussion started by: wisecracker
2 Replies

2. OS X (Apple)

An Audio Function Generator...

Ok guys, gals and geeks... As from today I am starting to learn awk in earnest doing something totally different. I am going to create a pseudo-Audio_Function Generator centred around OSX 10.11.x minimum. The code below is a tester to see what the possibilities are. All waveforms will be... (11 Replies)
Discussion started by: wisecracker
11 Replies

3. OS X (Apple)

A Bash Audio Sweep Generator...

This is a small program as a tester for a basic sweep generator for bandwidth testing of AudioScope.sh. This DEMO is only capable of 4KHz down to about 85Hz and back due to the low bit rate, but it is proof of concept for a much wider variant using a much higher bit rate. The file generated... (4 Replies)
Discussion started by: wisecracker
4 Replies

4. Slackware

Problems with audio recording in Audacity 2.0.5. Slackware64 14.1; Intel HD Audio.

I'm trying to record audio using Audacity 2.0.5 installed from SlackBuilds. My system is 64-bit Slackware 14.1 and a sound card is Intel HD Audio. I didn't change my sound system to OSS. (Default sound system in Slackware 14.1 is ALSA, isn't it?) First, I set Internal Microphone slider in KMix... (2 Replies)
Discussion started by: qzxcvbnm
2 Replies

5. Shell Programming and Scripting

A Crude 1KHz Audio Sinewave Generator Demo...

A very simple crude sinewave generator. The file required is generated inside the code, is linear interpolated and requires /dev/audio to work. Ensure you have this device, if not the download oss-compat from your OS's repository... It lasts for about 8 seconds before exiting and saves a... (5 Replies)
Discussion started by: wisecracker
5 Replies

6. Programming

Python, Platform Independent, Pure Audio Sinewave Generator...

IKHz_SW_OSX.py A DEMO mono _pure_ sinewave generator using standard text mode Python 2.6.7 to at least 2.7.3. This code is EASILY modifyable to Python version 3.x.x... This DEMO kids level 1KHz generator is mainly for a MacBook Pro, (13 inch in my case), OSX 10.7.5 and above. See below...... (0 Replies)
Discussion started by: wisecracker
0 Replies

7. Shell Programming and Scripting

Bash - Same frequency

Hi, Could anyone help me with the following question, if I have two colums (names and frequency) as follows in a file called name.txt Michael 1 Jones 1 Ben 2 Rebeca 4 David 1 and I want to use bash script called freqnames.sh that takes one argument (name) and the output should be... (3 Replies)
Discussion started by: jboy
3 Replies

8. Solaris

out of frequency

:cool: after installing solaris 10 5/08/09 directory the computer rebooting then the massage "out of frequency" appear.i want a solution first second my main board is GA-MA780G UD3H (14 Replies)
Discussion started by: medo2008
14 Replies
Login or Register to Ask a Question