Audio frequency generator: Difference between revisions

Added FreeBASIC
m (typo fix)
(Added FreeBASIC)
 
(7 intermediate revisions by 5 users not shown)
Line 1:
[[Category:Electronics]]
[[Category:Sciences]]
[[Category:Sound]]
[[Category:Temporal media]]
{{draft task}}
[[Category:Electronics]] [[Category:Sciences]]
[[Category:Sound]] [[Category:Temporal media]]
{{omit from|GUISS}}
{{omit from|Lotus 123 Macro Scripting}}
{{omit from|Scala}}
{{omit from|TPP}}
 
An audio [[wp:Signal_generator|frequency generator]] produces a continual audible monotone at a set frequency and level of volume.
There are controls to adjust the frequency and the volume up and down as desired.
Line 29 ⟶ 27:
Languages that provide no facilities for utilizing sound hardware of any kind should be omitted.
 
=={{header|Action!}}==
<syntaxhighlight lang="action!">byte
volu,dist,freq,key=764
 
proc INFO()
position(5,11)
printf("volume:%B freq:%B distortion:%B ",volu,freq,dist)
sound(0,freq,dist,volu)
key=255
return
 
proc INI()
freq=$46
volu=10
dist=10
INFO()
return
 
proc GENERATOR()
byte dmactls=559,cur=752,mar=82
card dlist=560
 
graphics(0) cur=1 mar=8
POKE(709,0) POKE(710,14)
POKEC(DLIST+8,0)
POKEC(DLIST+10,0)
POKEC(DLIST+19,0)
POKEC(DLIST+21,0)
POKEC(DLIST+26,0)
POKE (DLIST+28,0)
 
position(8,1)
printe("Action! sound generator")
printe("")
printe("")
printe("left/right - set volume")
printe("up/down - freq +/-")
printe("space - distorion")
printe("return - default (440 Hz)")
printe("esc - exit")
 
INI()
 
do
if key=28 then exit fi
if key=12 then INI() fi
if key=14 then freq==-1 INFO() fi
if key=15 then freq==+1 INFO() fi
if key=7 then volu==+1 if volu>14 then volu=15 fi INFO() fi
if key=6 then volu==-1 if volu=255 then volu=0 fi INFO() fi
if key=33 then dist==+2 if dist>15 then dist=0 fi INFO() fi
od
 
sndrst() mar=2 graphics(0)
return</syntaxhighlight>
=={{header|Axe}}==
{{untested|Axe}}
<langsyntaxhighlight lang="axe">ClrHome
Disp "FREQ:",i
10→F
Line 44 ⟶ 97:
Output(5,0,F▶Dec)
Freq(F,10000)
End</langsyntaxhighlight>
 
=={{header|FreeBASIC}}==
[https://www.un4seen.com/ Library: BASS]
<syntaxhighlight lang="vbnet">#include "bass.bi"
#include "fbgfx.bi"
 
Dim Shared As Integer freq = 440, volume = 50
Dim Shared As HSTREAM stream
 
Sub CheckKeys()
If Multikey(SC_LEFT) Then freq -= 10
If Multikey(SC_RIGHT) Then freq += 10
If Multikey(SC_UP) Then volume += 5
If Multikey(SC_DOWN) Then volume -= 5
' Limit frequency and volume to reasonable values
If freq < 20 Then freq = 20
If freq > 20000 Then freq = 20000
If volume < 0 Then volume = 0
If volume > 100 Then volume = 100
' Update the stream with the new frequency and volume
BASS_ChannelSetAttribute(stream, BASS_ATTRIB_FREQ, freq)
BASS_ChannelSetAttribute(stream, BASS_ATTRIB_VOL, volume / 100.0)
End Sub
 
' Initialize BASS using the default device at 44.1 KHz.
If (BASS_Init(-1, 44100, 0, 0, 0) = False) Then
Print "Could not initialize audio! BASS returned error " & BASS_ErrorGetCode()
Sleep
End
End If
 
' Create a stream
stream = BASS_StreamCreate(44100, 1, 0, @BASS_STREAMPROC_PUSH, NULL)
If stream = 0 Then
Print "Error creating stream: "; BASS_ErrorGetCode()
BASS_Free
Sleep
End 1
End If
 
' Start the stream
BASS_ChannelPlay(stream, False)
 
Do
CheckKeys
Sleep 10
Loop Until Inkey$ <> ""
 
' Clean up
BASS_StreamFree(stream)
BASS_Free</syntaxhighlight>
 
=={{header|Go}}==
Line 50 ⟶ 156:
 
The duration of the monotone is set in advance (to a small number of seconds) and the application ends when it finishes playing. Consequently, a method to silence it is not required.
<langsyntaxhighlight lang="go">package main
 
import (
Line 118 ⟶ 224:
err := cmd.Run()
check(err)
}</langsyntaxhighlight>
 
 
=={{header|Julia}}==
Uses the PortAudio library.
<langsyntaxhighlight lang="julia">using PortAudio
 
if Sys.iswindows()
Line 236 ⟶ 342:
@async(inputtask(chan))
playtone(ostr)
</syntaxhighlight>
</lang>
 
=={{header|Locomotive Basic}}==
 
<langsyntaxhighlight lang="locobasic">10 mode 1:input "Enter initial frequency in Hz";f:cls
20 if sq(2)<128 then sound 2,62500/f,100
30 a$=inkey$
Line 248 ⟶ 354:
70 locate 1,1:print f"Hz "
80 print:print " Use h and l to adjust frequency;":print " q to quit."
90 goto 20</langsyntaxhighlight>
 
=={{header|Nim}}==
{{trans|Go}}
As in the Go version, we use the Sox "play" command to emulate the audio frequency generator. This version is a faithful translation of the Go version, even if the way things are done is pretty different.
<langsyntaxhighlight Nimlang="nim">import osproc, strutils
 
type Waveform {.pure.} = enum
Line 282 ⟶ 388:
 
let args = ["-n", "synth", $dur, $kind, $freq, "vol", $vol, "dB"]
echo execProcess("play", args = args, options = {poStdErrToStdOut, poUsePath})</langsyntaxhighlight>
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">use strict 'vars';
use feature 'say';
use feature 'state';
Line 319 ⟶ 425:
return $freq;
}
}</langsyntaxhighlight>
 
=={{header|Phix}}==
<!--<langsyntaxhighlight Phixlang="phix">(notonline)-->
<span style="color: #000080;font-style:italic;">-- demo/rosetta/Audio_frequency_generator.exw</span>
<span style="color: #008080;">include</span> <span style="color: #000000;">pGUI</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
Line 384 ⟶ 490:
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #000000;">main</span><span style="color: #0000FF;">()</span>
<!--</langsyntaxhighlight>-->
 
=={{header|Pure Data}}==
Line 584 ⟶ 690:
* Volume level and wave shape are graphically displayed.
* More shapes, even free wave shape modelling could easily be added.
 
=={{header|Raku}}==
{{trans|Go}}
<syntaxhighlight lang="raku" line># 20240130 Raku programming solution
 
my ($kindS, $kind, $freq, $vol, $dur) = 'sine', |(0 xx *);
 
while $freq < 40 || $freq > 10000 {
print "Enter frequency in Hz (40 to 10000) : ";
$freq = prompt().Int;
}
 
while $vol < 1 || $vol > 50 {
print "Enter volume in dB (1 to 50) : ";
$vol = prompt().Int;
}
 
while $dur < 2 || $dur > 10 {
print "Enter duration in seconds (2 to 10) : ";
$dur = prompt().Int;
}
 
while $kind < 1 || $kind > 3 {
print 'Enter kind (1 = Sine, 2 = Square, 3 = Sawtooth) : ';
given $kind = prompt().Int {
when $kind == 2 { $kindS = 'square' }
when $kind == 3 { $kindS = 'sawtooth' }
}
}
 
my @args = "-n", "synth", $dur, $kindS, $freq, "vol", $vol, "dB";
run 'play', @args, :out('/dev/null'), :err('/dev/null');</syntaxhighlight>
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
# Project : Audio frequency generator
 
Line 749 ⟶ 887:
ok
return
</syntaxhighlight>
</lang>
Output:
 
[https://www.dropbox.com/s/jf5uq0bbts40wto/CalmoSoftFrequency.avi?dl=0 Audio frequency generator]
 
=={{header|Sidef}}==
{{trans|Raku}}
<syntaxhighlight lang="ruby">var (kindS = 'sine', kind = 0, freq = 0, vol = 0, dur = 0)
 
while ((freq < 40) || (freq > 10000)) {
freq = (Sys.read("Enter frequency in Hz (40 to 10000) : ", Num) || next)
}
 
while ((vol < 1) || (vol > 50)) {
vol = (Sys.read("Enter volume in dB (1 to 50) : ", Num) || next)
}
 
while ((dur < 2) || (dur > 10)) {
dur = (Sys.read("Enter duration in seconds (2 to 10) : ", Num) || next)
}
 
while ((kind < 1) || (kind > 3)) {
kind = (Sys.read("Enter kind (1 = Sine, 2 = Square, 3 = Sawtooth) : ", Num) || next)
 
given(kind) {
when (1) { kindS = 'sine' }
when (2) { kindS = 'square' }
when (3) { kindS = 'sawtooth' }
}
}
 
var args = ["-n", "synth", dur, kindS, freq, "vol", vol, "dB"]
Sys.run('play', args...)</syntaxhighlight>
 
=={{header|SuperCollider}}==
SuperCollider is a sound programming language, so the task is predictably easy.
 
<syntaxhighlight lang="supercollider">
<lang SuperCollider>
// the server application detects audio hardware.
Server.default.boot;
Line 789 ⟶ 956:
// sound stops on exit
Server.default.quit;
</syntaxhighlight>
</lang>
 
=={{header|Tcl}}==
{{libheader|Snack}}
This does not work on Windows due the use of the external <tt>stty</tt> program.
<langsyntaxhighlight lang="tcl">package require sound
 
set baseFrequency 261.63
Line 856 ⟶ 1,023:
# Stop the sound playing
$sound stop
exit</langsyntaxhighlight>
 
=={{header|Wren}}==
{{trans|Go}}
The ability to call external processes such as ''SoX'' is expected to be added to Wren-cli in the next release. In the meantime, we embed the following Wren script in a C host to complete this task.
<langsyntaxhighlight ecmascriptlang="wren">/* audio_frequency_generatorAudio_frequency_generator.wren */
 
class C {
Line 903 ⟶ 1,070:
 
var args = ["-n", "-V1", "synth", durS, kindS, freqS, "vol", volS, "dB"].join(" ")
C.play(args)</langsyntaxhighlight>
<br>
We now embed this in the following C program, compile and run it.
<langsyntaxhighlight lang="c">#include <stdio.h>
#include <stdio_ext.h>
#include <stdlib.h>
Line 982 ⟶ 1,149:
WrenVM* vm = wrenNewVM(&config);
const char* module = "main";
const char* fileName = "audio_frequency_generatorAudio_frequency_generator.wren";
char *script = readFile(fileName);
WrenInterpretResult result = wrenInterpret(vm, module, script);
Line 998 ⟶ 1,165:
free(script);
return 0;
}</syntaxhighlight>
}</lang>
 
=={{header|ZX Spectrum Basic}}==
Line 1,010 ⟶ 1,177:
There is no volume control on the Spectrum.
 
<langsyntaxhighlight lang="zxbasic">10 REM The crappest signal generator in the world
20 REM We do not check for boundary errors in this simple demo
30 LET n=1
Line 1,018 ⟶ 1,185:
70 PRINT AT 0,0;n," "
80 BEEP 0.1,n: REM beep for 0.1 second at n semitones relative to middle C
90 GO TO 40</langsyntaxhighlight>
{{omit from|GUISS}}
{{omit from|Lotus 123 Macro Scripting}}
{{omit from|Scala}}
{{omit from|TPP}}
2,133

edits