Am 12.07.2011 05:21, schrieb Ian Clark:
> If I have a noun: 194.18
> (the value, in Hz, as it happens, of the 24th octave above the
> "musical note" of the solar day... other planetary periods to be
> substituted)
> does anyone have a simple way of generating a brief audible tone of
> that frequency?
>
> Mac or Unix please, not Win.
>
> Just a verb to emit the sound will be fine for now. Generating a WAV
> file to play conventionally is a likely future requirement.
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
>
>    
Some time ago I played around with wav-Files.
A wav file could be created with

   'freq194.wav' wav_write sinwav 194.18 2.0 8000

I have never testes it on a Mac or unix platform.
Hope it is helpful.

Markus


NB. Evaluation of Microsoft WAV-Audio format
NB. See http://ccrma.stanford.edu/courses/422/projects/WaveFormat
    wav_evaluate =: 3 : 0
d =: 1!:0 <y
if. 0=#d do.
'file does not exist    : ',y
else.
t =:   'Evaluation for WAV-File: ',y
t =:t,:'File size total        : ',": 2{:: ,d
r =: 1!:11 (y);0 44
t =:t, 'Chunk ID (expectd RIFF): ',                4{.    r
t =:t, 'ChunkSize              : ', ":256#.|.a. i. 4{. 4}.r
t =:t, 'Format (expected WAVE) : ',                4{. 8}.r
t =:t, 'SubChunk1ID (exp fmt ) : ',                4{.12}.r
t =:t, 'SubChunk1Size          : ', ":256#.|.a. i. 4{.16}.r [ s =: 20+ 
256#.|.a. i. 4{.16}.r
t =:t, 'AudioFormat (exp 1=PCM): ', ":256#.|.a. i. 2{.20}.r
t =:t, 'NumOfChannels          : ',(":256#.|.a. i. 
2{.22}.r),(<:256#.|.a. i. 2{.22}.r){' (Mono)',:' (Stereo)'
t =:t, 'SampleRate             : ', ":256#.|.a. i. 4{.24}.r
t =:t, 'ByteRate               : ', ":256#.|.a. i. 4{.28}.r
t =:t, 'BlockAlign             : ', ":256#.|.a. i. 2{.32}.r
t =:t, 'BitsPerSample          : ', ":256#.|.a. i. 2{.34}.r
t =:t, 'SubChunk2 starts at    : ', ":s
t =:t, 'SubChunk2ID (exp data) : ',                4{. s}.r
t =:t, 'SubChunk2Size          : ', ":256#.|.a. i. 4{.(s+4)}.r
end.
)

NB. return _1 no such File,
NB. _99 not RIFF, _98 not WAVE, _97 not PCM, _96 not data, _95 unknown 
parameter
    wav_read =: 3 : 0
d =: 1!:0 <y  NB. Datei anzeigen lassen
if. 0=#d do. _1 return. end.
r=. 1!:1 <y   NB. Datei lesen
if. -.'RIFF' -: 4{. r do. _99 return. end.
if. -.'WAVE' -: _4{. 12{.r do. _98 return. end.
if. -. 1 -: 256#.|.a. i. _2{.22{.r do. _97 return. end.  NB. PCM
s =. 20+ 256#.|.a. i. _4{.20{.r  NB. offset Subchunk2
if. 'data' ~: _4 {. r {.~ 4+s do. _96 return. end.
nchannel =. 256#.|.a. i. _2{.24{.r
bitssampl =. 256#.|.a. i. _2{.36{.r
if. (nchannel=1)*.(bitssampl=8) do.
a. i. (8+s)}. r
elseif. (nchannel=2)*.(bitssampl=8) do.
|: _2 ] \ a. i. (8+s)}. r
elseif. (nchannel=1)*.(bitssampl=16) do.
(]+ _65536&*@:(32767&<))+/"1 ]1 256  * "1 ] _2 ] \ a. i. (8+s)}. r
elseif. (nchannel=2)*.(bitssampl=16) do.
|:_2]\(]+ _65536&*@:(32767&<))+/"1 ] 1 256 *"1 ] _2 ] \ a. i. (8+s)}. r
elseif. 1 do.
_95
end.
)

NB.  Eine Glättung:  plot  2 (%&2)@:+/\"1^:2 ] 4000{. "1 w


NB. inverse umrechnung mit  a. {~|.256 256 256 256#:  nummer


wav_header =: 3 : 0
t =: 'RIFF'
t =: t, ,a. {~|.256 256 256 256#: 36+#y
t =: t,'WAVE'
t =: t,'fmt '
t =: t, ,a. {~|.256 256 256 256#: 16
t =: t, ,a. {~|.        256 256#: 1
t =: t, ,a. {~|.        256 256#: 1
t =: t, ,a. {~|.256 256 256 256#: 44100
t =: t, ,a. {~|.256 256 256 256#: 44100
t =: t, ,a. {~|.        256 256#: 1
t =: t, ,a. {~|.        256 256#: 8
t =: t,'data'
t =: t, ,a. {~|.256 256 256 256#: #y
)

NB. Umrechnung von Buchstaben-Note
NB. y ist ein String mit Note wie:  a  b  h  c cis d  es e  f fis g  as
NB. x ist eine Oktavlage (Default: 0), negativ tiefer, positiv höher
note2freq =: 3 : 0
n=. <;. _1' a ais h c cis d dis e f fis g gis b des es ges as'
note =.'abcdefghisabcdefghis '{"0 1~'abcdefghisABCDEFGHIS'i."1 0 y
scale =. 9 10 11 0 1 2 3 4 5 6 7 8 10 1 3 6 8  {~ n i.<,note
freq =. (220 *2^%4)*(2^%12)^scale
:
(2^x)*note2freq y
)

NB. creates a wave for y: freq, duration, sampling rate
NB. scaling is between 1 and _1
sinwav =: 3 : 0
'f d s'=. y
1 o. o. (2*f%s) * i. >.s*d
)

NB. Normiert die Werte auf das in x angegebene Intervall und rundet
NB. falls nur ein Wert angegeben ist der zweite Wert 0
norm =: 4 : 0
int =. (>./ , <./ ) 2$x,0
maxmin =. (>./ , <./ ) y
quot =. (=/maxmin)+-/maxmin
<.(0.5+({:int)-( ({:maxmin)*(-/int)%quot))+((-/int)%quot)*y
)

NB. Maximum und Minimum von y
extrema =: >./@, , <./@,


wav_write =: 4 : 0
((wav_header y), (a. {~ 0 255 norm y)) overwrite <x
)

tonreihe =: 3 : 0
   , sinwav "1 y,"0 1 ] 0.25 44100
)

overwrite =: 4 : 0
if. 0<#1!:0 y do.  1!:55 y end.
x 1!:2 y
)


NB. creates a wave for y: freq, duration, sampling rate
NB. scaling is between 1 and _1
sinwav =: 3 : 0
'f d s'=. y
1 o. o. (2*f%s) * i. >.s*d
)


NB. creates a wave for y: freq, duration, sampling rate, decline rate
NB. scaling is between 1 and _1
decline_sinwav =: 3 : 0
'f d s dc'=. y
(^@*&(-dc) * 1&o.@*&(f*2p1))  (%s) * i. >.s*d
)

NB. creates a wave for y: freq, duration, sampling rate, decline rate, 
vib-ampli, vib-freq
NB. scaling is between 1 and _1
decline_vibwav =: 3 : 0
'f d s dc a fm'=. y
k =. i.>. s*d
NB. (f)*^a*1 o.(2p1*fm%s)*k
(^(-dc%s)*k)* 1 o.((f*2p1%s)*k) -a*1 o.(2p1*fm%s)*k
)
NB. Beispiel  e =: decline_vibwav 440 10 44100 0 10 8

----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to