Hi all...
Well guys and gals, I jumped in at the deep end and found things that PERL cannot do by default.
Many tricky terminal escape codes are not catered for so I had to create workarounds.
I didn't try the Perl builtin 'printf' as 'print' DID support terminal colours, so I made an assumption that 'printf' wouldn't plot either.
I will experiment with plotting using 'printf' and get back to you.
If I get stuck and plotting is still unable to be done then I will come back on here for solutions.
TIA.
EDIT:
Well a cold start with the builtin 'print' DOES work but believe me, I tried for hours with hard coded valus as well is variables and I kept getting an major 'scalar' error report finally ending up saying it couldn't complie the code - hence reverting to the 'system' command.
I honestly do not know why I kept getting major errors when now it is working..
Here is the original test code i couldn't get working, but it is actually calling me a liar now.
Code:
#!/usr/bin/perl
# plotter.pl
use warnings;
use strict;
# Centre of terminal window.
my $horiz=34;
my $vert=11;
my $plotter="\033["."$vert".";"."$horiz"."fHello World.\n";
print "$plotter";
And finally I am in the process of using 4 capture modes, DEMO, DSP, ALSA and QT, (DEMO is obviously working using the builtin random number generator but the final cut will create a raw 'noise' file using /dev/urandom).
I have already done the section to create the AppleScript and call it, but not done the binary file to byte sized decmial array or list yet but I am working on it...
Last edited by wisecracker; 08-20-2019 at 03:58 PM..
Reason: See EDIT:
Hopefully this will not attach itsekf to the previous.
I will let this go as it is so far, to show I am not being idle with it...
Code:
#!/usr/bin/perl
# #########################################################
# Audio Oscillograph, (uncalibrated AF Oscilloscope).
# NOTE: Many terminal escape codes are not supported, so workarounds ARE needed.
# Oscillograph.pl
#
# This is perl 5, version 18, subversion 2 (v5.18.2) built for darwin-thread-multi-2level
# (with 2 registered patches, see perl -V for more detail
# #########################################################
# Needed!
use warnings;
use strict;
# #########################################################
# Global variables...
my $horiz=9;
my $vert=9;
my $plot="";
# Manually alter the variable below to suit your system, DEMO, DSP, ALSA or QT.
my $capture_mode='DEMO';
# #########################################################
# Clear the screen and reset the terminal.
sub clrscn
{
my $clearscn=1;
print "\x1B[0m\x1Bc";
for($clearscn=1; $clearscn<=25; $clearscn=$clearscn+1)
{
print " \n";
}
print "\x1B[1;1f";
}
# #########################################################
# This generates a shell script that runs an applescript to access QuickTime Player.
sub QT_script
{
system("echo '/usr/bin/osascript << AppleSampler
tell application \"QuickTime Player\"
activate
set savePath to \"Macintosh HD:tmp:Untitled.m4a\"
set recording to new audio recording
set visible of front window to false
delay 2
start recording
delay 2
stop recording
export document \"Untitled\" in file savePath using settings preset \"Audio Only\"
close (every document whose name contains \"Untitled\") saving no
tell application \"System Events\" to click menu item \"Hide Export Progress\" of menu \"Window\" of menu bar 1 of process \"QuickTime Player\"
delay 1
quit
end tell
AppleSampler' > /tmp/qt.scpt");
}
# #########################################################
# Screen DISPLAY setup function. For a terminal size of 80 x 24.
sub display
{
# Set foreground and background graticule colours and foreground and background other window colours.
print "\x1B[H\x1B[0;36;44m +-------+-------+-------+---[\x1B[1;37;44mDISPLAY\x1B[0;36;44m]---+-------+-------+--------+
| | | | + | | | | \x1B[0;31;44mMAX\x1B[0;36;44m
| | | | + | | | |
| | | | + | | | |
\x1B[0;31;44m+ve\x1B[0;36;44m +-------+-------+-------+-------+-------+-------+-------+--------+
| | | | + | | | |
| | | | + | | | |
| | | | + | | | |
\x1B[1;32;44m0\x1B[0;36;44m +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+--+ \x1B[1;32;44mREF\x1B[0;36;44m
| | | | + | | | |
| | | | + | | | |
| | | | + | | | |
\x1B[0;30;44m-ve\x1B[0;36;44m +-------+-------+-------+-------+-------+-------+-------+--------+
| | | | + | | | |
| | | | + | | | |
| | | | + | | | |
| | | | + | | | | \x1B[0;30;44mMIN\x1B[0;36;44m
+-------+-------+-----[\x1B[1;37;44mAUDIO OSCILLOGRAPH\x1B[0;36;44m]-----+-------+--------+ \x1B[0m\n\n";
}
# #########################################################
# Capture methods, '/dev/urandom', '/dev/dsp', '/usr/bin/arecord' and 'QuickTime Player'.
sub capture
{
# IMPORTANT! None are used yet and NOT tested inside Perl.
if ("$capture_mode" eq 'DEMO')
{
# DEMO mode that requires no HW access.
system("/bin/dd if=/dev/urandom of=/tmp/waveform.raw bs=1 count=8000 > /dev/null 2>&1");
sleep(1);
}
if ($capture_mode eq 'DSP')
{
# DSP mode for the likes of old Linux boxes and CygWin, (OSS or PulseAudio).
system("/bin/dd if=/dev/dsp of=/tmp/waveform.raw bs=1 count=8000 > /dev/null 2>&1");
}
if ($capture_mode eq 'ALSA')
{
# ALSA mode for Linux boxes that have 'arecord'. !!! Not tested yet. !!!
system("/usr/bin/arecord -d 1 -c 1 -f U8 -r 8000 -t raw /tmp/waveform.raw > /dev/null 2>&1");
}
if ($capture_mode eq 'QT')
{
# A crucifyingly SSLLOOWW mode for Apple, OSX Mojave.
# Conversion to RAW file not done yet...
system("/bin/sh", "/tmp/qt.scpt");
}
}
# #########################################################
# Plot the points in the terminal window.
sub plotter
{
for($horiz=9; $horiz<=72; $horiz=$horiz+1)
{
# Simulate an 8 bit grab and divide by 16 to give 4 bit depth.
# Add offset of 2 to allow for missing the top graticule line.
# IMPORTATNT! Using the builtin random number generator at present for DEMO.
$vert=int(rand(256/16)+2);
$plot="\x1B["."$vert".";"."$horiz"."f\x1B[1;37;44m*";
print "$plot";
}
}
# #########################################################
# Initiation and main loop.
clrscn;
if ($capture_mode eq 'QT')
{
print "Setting up QT for first time (re)run!";
QT_script;
system("/bin/sh", "/tmp/qt.scpt");
}
display;
while(1)
{
capture;
display;
plotter;
print "\x1B[21;1f\x1B[0m$capture_mode mode, press Ctrl-C to stop! ";
}
And the listing so for:
Code:
AMIGA:amiga~/Desktop/Code/Perl> ls -l /tmp/
total 80
drwx------ 4 root wheel 128 16 Nov 2018 PKInstallSandbox.MMTz8b
-rw-r--r--@ 1 amiga wheel 26312 20 Aug 20:38 Untitled.m4a
drwx------ 3 amiga wheel 96 20 Aug 18:15 com.apple.launchd.Dk0vVDZ1G8
drwx------ 3 amiga wheel 96 20 Aug 18:15 com.apple.launchd.y5Rib6CVUt
drwxr-xr-x 2 root wheel 64 20 Aug 18:14 powerlog
-rw-r--r-- 1 amiga wheel 591 20 Aug 20:33 qt.scpt
-rw-r--r-- 1 amiga wheel 8000 20 Aug 20:50 waveform.raw
AMIGA:amiga~/Desktop/Code/Perl> cat /tmp/qt.scpt
/usr/bin/osascript << AppleSampler
tell application "QuickTime Player"
activate
set savePath to "Macintosh HD:tmp:Untitled.m4a"
set recording to new audio recording
set visible of front window to false
delay 2
start recording
delay 2
stop recording
export document "Untitled" in file savePath using settings preset "Audio Only"
close (every document whose name contains "Untitled") saving no
tell application "System Events" to click menu item "Hide Export Progress" of menu "Window" of menu bar 1 of process "QuickTime Player"
delay 1
quit
end tell
AppleSampler
AMIGA:amiga~/Desktop/Code/Perl> _
NOTE:
'Untitled.m4a' and 'qt.scpt' are related to QT, DO NOT USE THIS MODE YET!
Last edited by wisecracker; 08-20-2019 at 05:23 PM..
Reason: Correct copt and paste error.
Modified greatly and now captures real bytes from '/dev/urandom' and displays the plots.
Removed system() function calls where possible, (compare with post #1).
Saves a 'config' file to the current directory and loads on program restart, it just saves the capture mode on quitting at the moment.
As this is just an exercise in me learning the basics of Perl then this will not go anywhere near as sophisticated as AudioScope[.sh].
It is also ONLY capturing 64 bytes and running at maximum speed of 1mS per division as this is just a personal learning exercise.
Commented out the RANDOM line for the vertical axis FTTB.
Code:
#!/usr/bin/perl
# #########################################################
# Audio Oscillograph, (uncalibrated AF Oscilloscope).
# NOTE: Many terminal escape codes are not supported, so workarounds ARE needed.
# Oscillograph.pl
#
# This is perl 5, version 18, subversion 2 (v5.18.2) built for darwin-thread-multi-2level
# (with 2 registered patches, see perl -V for more detail
# #########################################################
# Needed!
use warnings;
use strict;
# #########################################################
# Make sure a bare config file exists in the current directory.
unless(-e "Oscillograph.config")
{
my $config='$capture_mode="DEMO";
1;
';
open(my $config_file, '>', 'Oscillograph.config');
print $config_file "$config";
close($config_file);
}
# #########################################################
# Global variables...
my $blankline=" ";
my $horiz=9;
my $vert=9;
my $plot="";
my @hexdump_array=();
our $capture_mode="DEMO";
require 'Oscillograph.config';
# #########################################################
# Clear the screen and reset the terminal.
sub clrscn
{
print "\x1B[0m\x1Bc\x1B[2J\x1B[H";
}
# #########################################################
# Basic command processing...
sub commands
{
print "\x1B[23;1f\x1B[0m$blankline";
print "\x1B[23;1f\x1B[0mEnter 'QUIT'<CR> to quit or <CR> to [Re-]Run:- ";
my $command=<STDIN>;
chomp $command;
if ( $command eq 'QUIT' )
{
my $config='$capture_mode="'."$capture_mode".'";
1;
';
open(my $config_file, '>', 'Oscillograph.config');
print $config_file "$config";
close($config_file);
&clrscn();
print "Saved Oscillograph.config and resetting the terminal to the default state.\n";
exit(0);
}
if ( $command eq 'DEMO' )
{
$capture_mode='DEMO';
}
if ( $command eq 'DSP' )
{
$capture_mode='DSP';
}
if ( $command eq 'ALSA' )
{
$capture_mode='ALSA';
}
if ( $command eq 'QT' )
{
$capture_mode='QT';
&QT_script();
system("/bin/sh", "/tmp/QT.scpt");
}
}
# #########################################################
# This generates a shell script that runs an applescript to access QuickTime Player.
sub QT_script
{
my $AppleScript='/usr/bin/osascript << AppleSampler
tell application "QuickTime Player"
activate
set savePath to "Macintosh HD:tmp:Untitled.m4a"
set recording to new audio recording
set visible of front window to false
delay 2
start recording
delay 2
stop recording
export document "Untitled" in file savePath using settings preset "Audio Only"
close (every document whose name contains "Untitled") saving no
tell application "System Events" to click menu item "Hide Export Progress" of menu "Window" of menu bar 1 of process "QuickTime Player"
delay 1
quit
end tell
AppleSampler
';
open(my $QuickTime, '>', '/tmp/QT.scpt');
print $QuickTime "$AppleScript";
close($QuickTime);
}
# #########################################################
# Screen DISPLAY setup function. For a terminal size of 80 x 24.
sub display
{
# Set foreground and background graticule colours and foreground and background other window colours.
print "\x1B[H\x1B[0;36;44m +-------+-------+-------+---[\x1B[1;37;44mDISPLAY\x1B[0;36;44m]---+-------+-------+--------+
| | | | + | | | | \x1B[0;31;44mMAX\x1B[0;36;44m
| | | | + | | | |
| | | | + | | | |
| | | | + | | | |
\x1B[0;31;44m+ve\x1B[0;36;44m +-------+-------+-------+-------+-------+-------+-------+--------+
| | | | + | | | |
| | | | + | | | |
| | | | + | | | |
\x1B[1;32;44m0\x1B[0;36;44m +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+--+ \x1B[1;32;44mREF\x1B[0;36;44m
| | | | + | | | |
| | | | + | | | |
| | | | + | | | |
\x1B[0;30;44m-ve\x1B[0;36;44m +-------+-------+-------+-------+-------+-------+-------+--------+
| | | | + | | | |
| | | | + | | | |
| | | | + | | | | \x1B[0;30;44mMIN\x1B[0;36;44m
+-------+-------+-----[\x1B[1;37;44mAUDIO OSCILLOGRAPH\x1B[0;36;44m]-----+-------+--------+ \x1B[0m
Commands available: QUIT, DEMO, DSP, ALSA and QT.\n\n\n";
}
# #########################################################
# Capture methods, '/dev/urandom', '/dev/dsp', '/usr/bin/arecord' and 'QuickTime Player'.
sub capture
{
# IMPORTANT! None are used yet and NOT tested inside Perl.
if ("$capture_mode" eq 'DEMO')
{
# DEMO mode that requires no HW access.
system("/bin/dd if=/dev/urandom of=/tmp/waveform.raw bs=1 count=64 > /dev/null 2>&1");
sleep(1);
}
if ($capture_mode eq 'DSP')
{
# DSP mode for the likes of old Linux boxes and CygWin, (OSS or PulseAudio).
system("/bin/dd if=/dev/dsp of=/tmp/waveform.raw bs=1 count=8000 > /dev/null 2>&1");
}
if ($capture_mode eq 'ALSA')
{
# ALSA mode for Linux boxes that have 'arecord'. !!! Not tested yet. !!!
system("/usr/bin/arecord -d 1 -c 1 -f U8 -r 8000 -t raw /tmp/waveform.raw > /dev/null 2>&1");
}
if ($capture_mode eq 'QT')
{
# A crucifyingly SSLLOOWW mode for Apple, OSX Mojave.
# Conversion to RAW file not done yet...
system("/bin/sh", "/tmp/QT.scpt");
}
@hexdump_array=`/usr/bin/hexdump -v -e '1/1 "%u\n"' /tmp/waveform.raw`;
}
# #########################################################
# Plot the points in the terminal window.
sub plotter
{
for($horiz=9; $horiz<=72; $horiz=$horiz+1)
{
# Simulate an 8 bit grab and divide by 16 to give 4 bit depth.
# Add offset of 2 to allow for missing the top graticule line.
# IMPORTATNT! Using the builtin random number generator at present for DEMO.
# $vert=int(rand(255/16)+2);
chomp(${hexdump_array[($horiz-9)]});
$vert="${hexdump_array[($horiz-9)]}";
$vert=int(($vert/16)+2);
# invert the signal. I'll let you work out why...
$vert=(19-$vert);
$plot="\x1B["."$vert".";"."$horiz"."f\x1B[1;37;44m*";
print "$plot";
}
}
# #########################################################
# Initialisation and main loop.
&clrscn();
&display();
if ($capture_mode eq 'QT')
{
# Initialise Quicktime Player when 'QT' is selected.
&QT_script();
system("/bin/sh", "/tmp/QT.scpt");
}
while(1)
{
&capture();
&display();
&plotter();
&commands();
}
Of the 1000+ scripts we have almost 300 are in perl:
Code:
44 awk-[gmn]awk-native
( ... )
280 perl
( ... )
176 sh
1182 total
For example, to trim things:
Code:
clenfi CLip ENds from FIle, n,m or --top=n --bottom=m; trim, omit.
pll Print long-line, section, trim, shorten to width as necessary.
trim Remove strings of whitespace at beginning and end of lines.
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)
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)
Hi I recently installed BT 5 Gnome on my Asus laptop running on Intel HD graphics.
I've been having problems with audio, at first I experienced the basic problem that was solved by adding pulse audio to the starting programs. This allowed me to open Sound preferences but I still have no sound.... (0 Replies)
Hello all,
Could anyone help to me :as to how can i record an audio file in unix and convert it into a text . Or anything with audio recording to get started would help .
thanks, (3 Replies)
Hi all,
I play audio through the web browser and it plays ok on windows. When i try the same thing on unix i get the error message "sh: /usr/local/bin/sox: not found. I've tried 'locate sox' and can't seem to find it. Is there some way I can change the browser settings so they play the audio... (3 Replies)
I know about next to nothing, and I am trying to play an audio file on HP-UX 10.2 (743i) every time I try to use the ‘/opt/audio/bin/AudioCP &' command I get an error message that says “Unable to access audio hardware.” I checked the man page on audio, and both Aserver and rpcd are running. Am I... (4 Replies)