Sponsored Content
Full Discussion: A metronome...
Operating Systems OS X (Apple) A metronome... Post 302946022 by wisecracker on Friday 5th of June 2015 05:28:09 PM
Old 06-05-2015
A metronome...

As you all know I hit the hardware and do strange things with the HW using shell scripting.

This is yet another one...

Well computer audio systems have two flaws, this code exploits one of them and the other I found with AudioScope.sh.
There are others so minor I will not pursue them any further.
Ignoring the second as it would not matter to the absolute vast majority of users I will decsribe the first.
All sound systems suffer with a click if the sound card is accessed by other SW.

As this occurs on EVERY PC I have used I decided to exploit it.

So I decided to test out this anomoly by creating a metronome.
In the case of this MBP the maximum beats per minute I could obtain was 180 so this became the upper limit.

The code is a fun one as I decided to make the click a tick and a tock... ;o)

The code is error proofed as far as is possible and any errors fix the BPM, (beats per minute), to 90 or 120.

It is called from anywhere you put it after changing the permissions to your requirements, as, './tick <BPM>[RETURN/ENTER]' without the quotes.

I don't think this has been done before...

Enjoy...
Code:
#!/bin/bash
# tick <bpm from 30 to 180>
# A simple metronome for kids...
# Issued as Public Domain at www.unix.com by B.Walker, G0LCU.
# MBP 13 inch, circa August 2012, OSX 10.7.5, default bash terminal.
clear
echo "Simple fun metronome for kids usage."
echo "Press Ctrl C to stop."
TIME=0.166
TIMER=0.000
BPM=$1
case $BPM in
	*[!0-9]*)
		BPM=120
		echo "User error, set the metronome to $BPM beats per minute..."
		;;
	*)
		BPM=$1
		;;
esac
if [ $BPM -lt 30 ] || [ $BPM -gt 180 ]
then
	echo "Usage: tick <bpm from 30 to 180>"
	BPM=90
	echo "User error, set the metronome to $BPM beats per minute..."
fi
# Generate the tick.wav and tock.wav files.
> /tmp/tick.wav
> /tmp/tock.wav
printf "\x52\x49\x46\x46\x2C\x00\x00\x00\x57\x41\x56\x45\x66\x6D\x74\x20\x10\x00\x00\x00\x01\x00\x01\x00\x40\x1F\x00\x00\x40\x1F\x00\x00\x01\x00\x08\x00\x64\x61\x74\x61\x40\x1F\x00\x00" >> /tmp/tick.wav
cp /tmp/tick.wav /tmp/tock.wav 
printf "\x00\xFF\x00\xFF\x00\xFF\x00\xFF" >> /tmp/tick.wav
printf "\x00\x00\xFF\xFF\x00\x00\xFF\xFF" >> /tmp/tock.wav
# Playback the tick tock pair to set up the TIMER variable.
echo "Testing 'tick'..."
afplay /tmp/tick.wav
echo "Testing 'tock'..."
TIMER=( $(time (afplay /tmp/tock.wav) 2>&1 1>/dev/null) )
TIMER="${TIMER[1]:2:5}"
TIME=$(echo "scale=3;((60/$BPM)-$TIMER)" | bc)
tock()
{
	afplay /tmp/tick.wav
	sleep $TIME
	afplay /tmp/tock.wav
	sleep $TIME
}
echo "Now running the metronome at $BPM beats per minute..."
while true
do
	tock
done

This User Gave Thanks to wisecracker For This Post:
 
soundstretch(1) 					      General Commands Manual						   soundstretch(1)

NAME
soundstretch - audio processing utility SYNOPSIS
soundstretch infile.wav outfile.wav [options] DESCRIPTION
SoundStretch is a simple command-line application that can change tempo, pitch and playback rates of WAV sound files. This program is intended primarily to demonstrate how the "SoundTouch" library can be used to process sound in your own program, but it can as well be used for processing sound files. USAGE
SoundStretch Usage syntax: "infile.wav" Name of the input sound data file (in .WAV audio file format). Give "stdin" as filename to use standard input pipe. "outfile.wav" Name of the output sound file where the resulting sound is saved (in .WAV audio file format). This parameter may be omitted if you don't want to save the output (e.g. when only calculating BPM rate with '-bpm' switch). Give "stdout" as filename to use standard output pipe. [options] Are one or more control options. OPTIONS
Available control options are: -tempo=n Change the sound tempo by n percents (n = -95.0 .. +5000.0 %) -pitch=n Change the sound pitch by n semitones (n = -60.0 .. + 60.0 semitones) -rate=n Change the sound playback rate by n percents (n = -95.0 .. +5000.0 %) -bpm=n Detect the Beats-Per-Minute (BPM) rate of the sound and adjust the tempo to meet 'n' BPMs. When this switch is applied, the " -tempo" switch is ignored. If "=n" is omitted, i.e. switch " -bpm" is used alone, then the BPM rate is estimated and displayed, but tempo not adjusted according to the BPM value. -quick Use quicker tempo change algorithm. Gains speed but loses sound quality. -naa Don't use anti-alias filtering in sample rate transposing. Gains speed but loses sound quality. -license Displays the program license text (LGPL) NOTES
* To use standard input/output pipes for processing, give "stdin" and "stdout" as input/output filenames correspondingly. The standard input/output pipes will still carry the audio data in .wav audio file format. * The numerical switches allow both integer (e.g. " -tempo=123") and decimal (e.g. " -tempo=123.45") numbers. * The " -naa" and/or " -quick" switches can be used to reduce CPU usage while compromising some sound quality * The BPM detection algorithm works by detecting repeating bass or drum patterns at low frequencies of <250Hz. A lower-than-expected BPM figure may be reported for music with uneven or complex bass patterns. EXAMPLES
Example 1 The following command increases tempo of the sound file "originalfile.wav" by 12.5% and stores result to file "destinationfile.wav": soundstretch originalfile.wav destinationfile.wav -tempo=12.5 Example 2 The following command decreases the sound pitch (key) of the sound file "orig.wav" by two semitones and stores the result to file "dest.wav": soundstretch orig.wav dest.wav -pitch= -2 Example 3 The following command processes the file "orig.wav" by decreasing the sound tempo by 25.3% and increasing the sound pitch (key) by 1.5 semitones. Resulting .wav audio data is directed to standard output pipe: soundstretch orig.wav stdout -tempo= -25.3 -pitch=1.5 Example 4 The following command detects the BPM rate of the file "orig.wav" and adjusts the tempo to match 100 beats per minute. Result is stored to file "dest.wav": soundstretch orig.wav dest.wav -bpm=100 Example 5 The following command reads .wav sound data from standard input pipe and estimates the BPM rate: soundstretch stdin -bpm NOTES
Converted from the README.html that comes with SoundTouch. soundstretch(1)
All times are GMT -4. The time now is 01:51 PM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy