A Function To Create A 1 Second Sinewave WAVE Beep File In Python.


 
Thread Tools Search this Thread
Top Forums Programming A Function To Create A 1 Second Sinewave WAVE Beep File In Python.
# 1  
Old 12-07-2014
A Function To Create A 1 Second Sinewave WAVE Beep File In Python.

sinebeep.py

Creating an audio WAVE file called...

beep.wav

...that can be played using almost ANY audio player available.

This simple DEMO snippet of code generates a 1 second sinewave WAVE file. It IS saved inside the CURRENT drawer so that you can find it... ;o)

Note that the waveform itself is created in pure text mode, that is from decimal 32, (space), to decimal 126, (~)... This makes it possible to create a lot of arbitrary RAW
waveforms any length inside any suitable text editor to _at_least_ 6 bit depth AND IF the full range of decimal 0 to 127 is used, 7 bit depth.

This works on:-

Classic stock AMIGA A1200, using Python 1.4.0.
WinUAE and E-UAE, AmigaOS 3.0.x using Python 1.4.0 to 2.0.1.
Windows, to at least 7, using Python 2.0.1 to 3.3.2.
Various Linux flavours using Python 2.4.6 to 3.2.2.
Apple OSX 10.7.x and above using Python 2.5.6 to 3.4.1.

The file size is 8044 bytes and _IF_ you need to it can be palyed directly without a player on some Linux flavours that have the /dev/dsp device. It is an 8 bit, unsigned integer,
mono, 8000Hz sampling speed 8000 byte RAW file with the WAVE header added.

It will still work with PulseAudio and OSS using...

cat /full/path/to/beep.wav > /dev/dsp

...but with a momenatry click due to the 44 header bytes; but hey it is a beep alternative...

This took a while to work out how to make it Version AND Platform independent but this is the result...

Enjoy finding simple solutions to often very difficult problems.
Code:
# sinebeep.py
#
# This creates a file named beep.wav.
#
# (C)2014, B.Walker, G0LCU.
# Issued under the MIT licence.
#
# Works on:-
# The Classic AMIGA A1200, WinUAE and E-UAE from Python 1.4.0 to 2.0.1.
# Windows Vista and 7 from Python 2.0.1 to 3.3.2.
# Linux flavours from Python 2.4.2 to 3.2.2.
# Apple OSX 10.7.5 and above from Python 2.5.6 to 3.4.1.
#
# _Compile_ a 1 second, 1KHz, mono, sinewave burst, ('beep.wav'), for general use.
# IMPORTANT!!! This WILL be saved inside the CURRENT drawer/folder/directory so be aware!
def sinebeep():
	header=[ 82, 73, 70, 70, 100, 31, 0, 0, 87, 65, 86, 69, 102, 109, 116, 32, 16, 0, 0, 0, 1, 0, 1, 0, 64, 31, 0, 0, 64, 31, 0, 0, 1, 0, 8, 0, 100, 97, 116, 97, 64, 31, 0, 0 ]
	waveform=[ 79, 45, 32, 45, 79, 113, 126, 113 ]
	wavefile=open("beep.wav", "w+")
	for hdr in range(0, 44, 1):
		wavefile.write(chr(header[hdr]))
	for sample in range(0, 1000, 1):
		for wf in range(0, 8, 1):
			wavefile.write(chr(waveform[wf]))
	wavefile.close()
# Uncomment the next line to create it on the fly.
# sinebeep()
# Use any standard audio player to hear it...
# For example, the generic 'aplay' for Linux ALSA machines.

The chr() function is common to ALL versions of Python for HEX character values from 0x00 to 0x7F, decimal 0 to 127 inclusive. It COULD be considered eqivalent to bytes
inside these two limits.

As these two limits are effectively 7 bits in size then creating almost any wave shape is possible withing limits of the HW in use and the 7 bit depth.

This is a hack, so......

......therefore it is easily possible to juggle the header to stay inside 7 bits per byte and create ALMOST any 7 bit waveform, any length, mono or stereo at any
standard sampling speed.

It is NOT practically possible to do 16 bit signed values that satisfies ALL Python versions, BUT, it IS if there are two versions, one to suit pre-version 3.0.0 and the other to suit
post-version 3.0.0...

Bazza...
This User Gave Thanks to wisecracker For This Post:
# 2  
Old 01-07-2015
Reminds me of an early C project I wrote myself 21 yrs. ago, which does a pure 440 hz sine wave with one byte samples and low sample rate:

Code:
 
a440.c
======
 
#include <stdio.h>
#ifdef BORLAND
#include <stdlib.h>
#endif
#include <math.h>
char hdr[]={'R', 'I', 'F', 'F', 0, 0, 0, 0, 'W', 'A', 'V', 'E', 'f', 'm', 't', 32, 16, 0, 0, 0, 1, 0, 1, 0, 17, '+', 0, 0, 17, '+', 0, 0, 1, 0, 8, 0, 'd', 'a', 't', 'a', 0, 0, 0, 0};
FILE * f ;
main(argc,argv)
int argc;
char**argv;
{
  #define SAMPLES 600L
  #define FREQ 440
  #define SPS 11025
  #define PI 3.1415927
  long i ;
  float w, x ;
  if ( argc < 2 )
  {
    fprintf( stderr, "Usage is '%s filename'\n", argv[0] ) ;
    exit( -1 ) ;
  }
  if ( !( f = fopen( argv[1], "wb" ) ) )
  {
    fprintf( stderr, "Can't open '%s' to write\n", argv[1] ) ;
    exit( -2 ) ;
  }
  w = 2 * PI * FREQ / SPS ;
  i = SAMPLES + 36 ;
  hdr[4] = i % 256 ;
  hdr[5] = ( i / 256 ) % 256 ;
  hdr[6] = ( i / 65536L ) % 256 ;
  hdr[7] = i / 16777216L ;
  i = SAMPLES ;
  hdr[40] = i % 256 ;
  hdr[41] = ( i / 256 ) % 256 ;
  hdr[42] = ( i / 65536L ) % 256 ;
  hdr[43] = i / 16777216L ;
  for( i = 0L ; i < sizeof(hdr) ; i++ )
  {
    putc( hdr[i], f ) ;
  }
  i = 0 ;
  while ( ++i <= SAMPLES )
  {
    putc( (char)( 128.0 + 127.999 * sin( w * i ) ), f ) ;
  }
  fclose( f ) ;
  exit( 0 ) ;
}


Last edited by DGPickett; 01-07-2015 at 05:46 PM..
This User Gave Thanks to DGPickett For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Programming

Create a C source and compile inside Python 1.4.0 to 3.7.0 in Python for ALL? platforms...

Hi all... As you know I like making code backwards compatible for as many platforms as possible. This Python script was in fact dedicated for the AMIGA A1200 using Pythons 1.4.0, 1.5.2, 1.6.0, 2.0.1, and 2.4.6 as that is all we have for varying levels of upgrades from a HDD and 4MB FastRam... (1 Reply)
Discussion started by: wisecracker
1 Replies

2. Shell Programming and Scripting

Python etree.ElementTree findall function

Hi everyone. I'm trying to learn python as it relates to parsing xml, and I thought I would start by trying to create an easy (or I thought would be easy) function to match on a certain attribute in an xml file and print out it's related attribute. Here's an example to hopeful make sense of... (0 Replies)
Discussion started by: timj123
0 Replies

3. Shell Programming and Scripting

Python - Function print vs return - whats wrong

All, I have a basic buzz program written in python with return function. If i change return with print,it works fine but i want to know whats wrong with return statement.Can anyone help me whats wrong with this #!/usr/bin/python def div4and6(s,e): for i in range(s,e+1): if... (5 Replies)
Discussion started by: oky
5 Replies

4. Shell Programming and Scripting

Create function

I would like to make a perl function , this function could send mail via SMTP and also could import a text file into mail content , that mean I have a text file , want to use this function to send mail via SMTP , the mail content is the text file , would advise how to write this script ? thanks (1 Reply)
Discussion started by: ust3
1 Replies

5. Windows & DOS: Issues & Discussions

A SOX 1KHz Sinewave Generator Using A Batch File...

Hi all... I don't think this has been done before but I am open to being corrected... This batch file generates a 65536 byte binary file to give 8 seconds of pure sinewave at the earphone/speaker output(s)... It uses ONLY a default Windows 32 bit installation, to Windows 7, except for the... (0 Replies)
Discussion started by: wisecracker
0 Replies

6. Shell Programming and Scripting

How to create .txt file by using function?

My Calling script is like below: for file in `echo $LIST_OF_FILES` --listing filenames eg, xyz_meta_20110501_00000789.tar do file_name=`basename $file` <call a function to create .txt file in below format> done Want to generate a .txt file that contains below data in ksh: ... (3 Replies)
Discussion started by: vedanta
3 Replies

7. 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

8. Shell Programming and Scripting

How to create SQRT function in catenate file

HI, I have a file which i catenate and using the fields in the file, I would like to get sqrt of it. I tried to man the function but it normally would need an echo as well as bc. What I am intending to find out is catenate a file where let say cat a.txt| awk ' { t= h*($3+$2); t=... (7 Replies)
Discussion started by: ahjiefreak
7 Replies

9. Programming

about wave file integrating.

Now I have two wave file(*.wav) at Tru64 Unix machine. I want to make a new wave file including the two wave file. how I should finish this programmer. If you know, can you give me the format of the wave file(*.wav) and Sun au file(*.au). Thank you. (1 Reply)
Discussion started by: livic
1 Replies
Login or Register to Ask a Question