SparrowOSTS_121127.ISO
This commit is contained in:
1 parent
0e9364ff4c
commit
e57428affb
1218 files changed
+247142
-165507
No files matched your search
Binary file not shown.
@@ -0,0 +1,68 @@
|
||||
Bool beat_done;
|
||||
I64 start_buf_num;
|
||||
U0 (*fp_task_end_cb)();
|
||||
U0 (*fp_old_fill_buf)(SND_OUT_CONTAINER *buf,I64 buf_num)=NULL;
|
||||
|
||||
F64 freq1,freq2;
|
||||
|
||||
U0 BeatFillBuf(SND_OUT_CONTAINER *buf,I64 buf_num)
|
||||
{ //Gets called by HD Audio task -- $LK,"HDAudioTask","MN:HDAudioTask"$().
|
||||
I64 j,m;
|
||||
F64 t;
|
||||
if (beat_done) return;
|
||||
t=ToF64((buf_num-start_buf_num)*(SND_BUF_LEN/SND_OCHANNELS))/SND_SAMPLE_RATE;
|
||||
j=0;
|
||||
while (j<SND_BUF_LEN) {
|
||||
m=MAX_I32*(Sin(freq1*(2*ã)*t)+Sin(freq2*(2*ã)*t));
|
||||
|
||||
//Samples are 24-bit, placed in upper 24 bits of an I32.
|
||||
m*=snd_vol;
|
||||
buf[j++]=ToI64(m)&0xFFFFFF00; //Left
|
||||
buf[j++]=ToI64(m)&0xFFFFFF00; //Right
|
||||
|
||||
t+=1.0/SND_SAMPLE_RATE;
|
||||
}
|
||||
}
|
||||
|
||||
U0 BeatTaskEndCB()
|
||||
{
|
||||
beat_done=TRUE;
|
||||
fp_snd_fill_buf=fp_old_fill_buf;
|
||||
if (fp_task_end_cb)
|
||||
(*fp_task_end_cb)();
|
||||
else
|
||||
Exit;
|
||||
}
|
||||
|
||||
U0 BeatFreq()
|
||||
{
|
||||
if (snd_dev!=SD_HD_AUDIO) {
|
||||
"Only works for HD Audio.\n";
|
||||
return;
|
||||
}
|
||||
freq1=600.0;
|
||||
freq2=601.0;
|
||||
beat_done=FALSE;
|
||||
fp_task_end_cb=Fs->task_end_cb;
|
||||
Fs->task_end_cb=&BeatTaskEndCB; //Catch <CTRL-ALT-X> or Kill() task
|
||||
start_buf_num=snd_obuf_num;
|
||||
fp_old_fill_buf=fp_snd_fill_buf;
|
||||
fp_snd_fill_buf=&BeatFillBuf;
|
||||
try {
|
||||
"Pick two frequencies within a few Hz of each other to hear beats.\n"
|
||||
"Pick two frequencies a multiple of two for an octave harmonic.\n"
|
||||
"$$FG,GREEN$$<CTRL-ALT-C>$$FG$$ to exit.\n";
|
||||
while (TRUE) {
|
||||
freq1=PmtF64("Freq #1 (%0.2fHz):",freq1,20,20000);
|
||||
freq2=PmtF64("Freq #2 (%0.2fHz):",freq2,20,20000);
|
||||
}
|
||||
} catch { //Catch <CTRL-ALT-C>, but pass it on to next higher handler.
|
||||
fp_snd_fill_buf=fp_old_fill_buf;
|
||||
Fs->task_end_cb=fp_task_end_cb;
|
||||
}
|
||||
beat_done=TRUE;
|
||||
fp_snd_fill_buf=fp_old_fill_buf;
|
||||
Fs->task_end_cb=fp_task_end_cb;
|
||||
}
|
||||
|
||||
BeatFreq;
|
||||
@@ -0,0 +1,96 @@
|
||||
Bool echo_done;
|
||||
|
||||
U0 (*fp_task_end_cb)();
|
||||
U0 (*fp_old_fill_buf)(SND_OUT_CONTAINER *buf,I64 buf_num)=NULL;
|
||||
U0 (*fp_old_copy_buf)(SND_IN_CONTAINER *buf,I64 buf_num)=NULL;
|
||||
|
||||
#define NUM_BUF 8
|
||||
SND_IN_CONTAINER my_buf[SND_BUF_LEN*NUM_BUF];
|
||||
|
||||
I64 my_ibuf_ptr,my_obuf_ptr;
|
||||
|
||||
U0 EchoFillBuf(SND_OUT_CONTAINER *buf,I64)
|
||||
{
|
||||
I64 j;
|
||||
if (echo_done) return;
|
||||
j=0;
|
||||
while (j<SND_BUF_LEN) {
|
||||
buf[j++]=ToI64(snd_vol*my_buf[my_obuf_ptr++ &(SND_BUF_LEN*NUM_BUF-1)])<<16&0xFFFFFF00;
|
||||
buf[j++]=ToI64(snd_vol*my_buf[my_obuf_ptr++ &(SND_BUF_LEN*NUM_BUF-1)])<<16&0xFFFFFF00;
|
||||
}
|
||||
}
|
||||
|
||||
U0 EchoCopyBuf(SND_IN_CONTAINER *buf,I64)
|
||||
{
|
||||
I64 j;
|
||||
if (echo_done) return;
|
||||
j=0;
|
||||
while (j<SND_BUF_LEN) {
|
||||
my_buf[my_ibuf_ptr++ &(SND_BUF_LEN*NUM_BUF-1)]=buf[j++];
|
||||
my_buf[my_ibuf_ptr++ &(SND_BUF_LEN*NUM_BUF-1)]=buf[j++];
|
||||
}
|
||||
}
|
||||
|
||||
U0 EchoTaskEndCB()
|
||||
{
|
||||
echo_done=TRUE;
|
||||
HDStop(TRUE,FALSE);
|
||||
fp_snd_fill_buf=fp_old_fill_buf;
|
||||
fp_snd_copy_buf=fp_old_copy_buf;
|
||||
if (fp_task_end_cb)
|
||||
(*fp_task_end_cb)();
|
||||
else
|
||||
Exit;
|
||||
}
|
||||
|
||||
U0 DrawIt(CTask *task,CDC *dc)
|
||||
{
|
||||
SND_IN_CONTAINER *buf=_hda->istr0_buf[0];
|
||||
I64 i,x1,y1,x2=0,y2=0,
|
||||
cy=task->win_pixel_height>>1;
|
||||
dc->color=BLUE;
|
||||
for (i=0;i<SND_BUF_LEN;i++) {
|
||||
x1=i*task->win_pixel_width/SND_BUF_LEN;
|
||||
y1=cy-buf[i]*cy/MAX_I16;
|
||||
GrLine(dc,x2,y2,x1,y1);
|
||||
x2=x1;
|
||||
y2=y1;
|
||||
}
|
||||
}
|
||||
|
||||
U0 EchoDemo()
|
||||
{
|
||||
if (snd_dev!=SD_HD_AUDIO) {
|
||||
"Only works for HD Audio.\n";
|
||||
return;
|
||||
}
|
||||
SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$
|
||||
HDRun(TRUE,TRUE);
|
||||
echo_done=FALSE;
|
||||
fp_task_end_cb=Fs->task_end_cb;
|
||||
Fs->task_end_cb=&EchoTaskEndCB; //Catch <CTRL-ALT-X> or Kill() task
|
||||
my_ibuf_ptr=(NUM_BUF/2)*SND_BUF_LEN;
|
||||
my_obuf_ptr=0;
|
||||
fp_old_fill_buf=fp_snd_fill_buf;
|
||||
fp_old_copy_buf=fp_snd_copy_buf;
|
||||
fp_snd_fill_buf=&EchoFillBuf;
|
||||
fp_snd_copy_buf=&EchoCopyBuf;
|
||||
DocCursor;
|
||||
DocClear;
|
||||
Fs->draw_it=&DrawIt;
|
||||
try
|
||||
GetChar;
|
||||
catch { //Catch <CTRL-ALT-C>, but pass it on to next higher handler.
|
||||
fp_snd_fill_buf=fp_old_fill_buf;
|
||||
fp_snd_copy_buf=fp_old_copy_buf;
|
||||
Fs->task_end_cb=fp_task_end_cb;
|
||||
}
|
||||
echo_done=TRUE;
|
||||
HDStop(TRUE,FALSE);
|
||||
fp_snd_fill_buf=fp_old_fill_buf;
|
||||
fp_snd_copy_buf=fp_old_copy_buf;
|
||||
Fs->task_end_cb=fp_task_end_cb;
|
||||
SettingsPop;
|
||||
}
|
||||
|
||||
EchoDemo;
|
||||
@@ -0,0 +1,181 @@
|
||||
#define M_DASH_THRESHOLD 0.140
|
||||
#define M_SPACE_THRESHOLD 0.300
|
||||
|
||||
U8 *morse_list=
|
||||
|
||||
"A.-\0"
|
||||
"B-...\0"
|
||||
"C-.-.\0"
|
||||
"D-..\0"
|
||||
"E.\0"
|
||||
"F..-.\0"
|
||||
"G--.\0"
|
||||
"H....\0"
|
||||
"I..\0"
|
||||
"J.---\0"
|
||||
"K-.-\0"
|
||||
"L.-..\0"
|
||||
"M--\0"
|
||||
"N-.\0"
|
||||
"O---\0"
|
||||
"P.--.\0"
|
||||
"Q--.-\0"
|
||||
"R.-.\0"
|
||||
"S...\0"
|
||||
"T-\0"
|
||||
"U..-\0"
|
||||
"V...-\0"
|
||||
"W.--\0"
|
||||
"X-..-\0"
|
||||
"Y-.--\0"
|
||||
"Z--..\0"
|
||||
|
||||
"1.----\0"
|
||||
"2..---\0"
|
||||
"3...--\0"
|
||||
"4....-\0"
|
||||
"5.....\0"
|
||||
"6-....\0"
|
||||
"7--...\0"
|
||||
"8---..\0"
|
||||
"9----.\0"
|
||||
"0-----\0"
|
||||
|
||||
"/-..-.\0"
|
||||
"+.-.-.\0"
|
||||
"..-.-.-\0"
|
||||
",--..--\0"
|
||||
"?..--..\0"
|
||||
"(-.--.\0"
|
||||
")-.--.-\0"
|
||||
"--....-\0"
|
||||
"\".-..-.\0"
|
||||
"_..--.-\0"
|
||||
"'.----.\0"
|
||||
":---...\0"
|
||||
";-.-.-.\0"
|
||||
"=-...-\0";
|
||||
|
||||
U0 MorseTable()
|
||||
{
|
||||
U8 *st;
|
||||
I64 i=0;
|
||||
for (i=0;i<13;i++ ) {
|
||||
if (st=ListEntryPt(i,morse_list))
|
||||
"$$FG,RED$$%C$$FG$$ %-7s ",*st,st+1;
|
||||
if (st=ListEntryPt(i+13,morse_list))
|
||||
"$$FG,RED$$%C$$FG$$ %-7s ",*st,st+1;
|
||||
if (st=ListEntryPt(i+26,morse_list))
|
||||
"$$FG,RED$$%C$$FG$$ %-7s ",*st,st+1;
|
||||
if (st=ListEntryPt(i+39,morse_list))
|
||||
"$$FG,RED$$%C$$FG$$ %-7s ",*st,st+1;
|
||||
NewLine;
|
||||
}
|
||||
NewLine;
|
||||
}
|
||||
|
||||
F64 m_start,m_end,dt_down,dt_up;
|
||||
Bool space_sent;
|
||||
|
||||
U8 *MorseTimes(CDoc *,CDocEntry *,CTask *mem_task)
|
||||
{
|
||||
U8 *st=MAlloc(64,mem_task);
|
||||
SPrintF(st,"Down:%10.6f Up:%10.6f",dt_down,dt_up);
|
||||
return st;
|
||||
}
|
||||
|
||||
|
||||
I64 MorseWaitKey()
|
||||
{
|
||||
I64 ch;
|
||||
F64 dt;
|
||||
while (TRUE) {
|
||||
if (m_start) {
|
||||
GetMsg(NULL,NULL,1<<MSG_KEY_UP);
|
||||
m_end=tP;
|
||||
Snd(0);
|
||||
dt_down=m_end-m_start;
|
||||
m_start=0;
|
||||
space_sent=FALSE;
|
||||
if (dt_down<M_DASH_THRESHOLD)
|
||||
return '.';
|
||||
else
|
||||
return '-';
|
||||
} else {
|
||||
if (!space_sent) {
|
||||
while (!ScanMsg(&ch,NULL,1<<MSG_KEY_DOWN)) {
|
||||
dt=tP-m_end;
|
||||
if (dt>=M_SPACE_THRESHOLD) {
|
||||
space_sent=TRUE;
|
||||
return CH_SPACE;
|
||||
}
|
||||
Yield;
|
||||
}
|
||||
} else
|
||||
ch=GetChar(NULL,FALSE);
|
||||
m_start=tP;
|
||||
Snd(1000);
|
||||
if (ch==CH_SHIFT_ESC || ch==CH_ESC) {
|
||||
NewLine;
|
||||
Snd(0);
|
||||
ThrowBreak; //exit program
|
||||
}
|
||||
dt_up=m_start-m_end;
|
||||
if (!space_sent && dt_up>=M_SPACE_THRESHOLD) {
|
||||
space_sent=TRUE;
|
||||
return CH_SPACE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
U0 Morse()
|
||||
{
|
||||
Bool old_preempt;
|
||||
CDocEntry *doc_e;
|
||||
U8 buf[8],*dst,ch,*src;
|
||||
|
||||
MorseTable;
|
||||
m_start=0;
|
||||
m_end=tP;
|
||||
dt_down=0;
|
||||
dt_up=0;
|
||||
space_sent=TRUE;
|
||||
|
||||
"$$FG,GREEN$$";
|
||||
|
||||
//We don't want the tag call back
|
||||
//called before we set it, so preempt off.
|
||||
old_preempt=Preempt(OFF);
|
||||
doc_e=DocPutS(DocCur,"$$TX+TC,\" \"$$");
|
||||
doc_e->tag_cb=&MorseTimes;
|
||||
Preempt(old_preempt);
|
||||
|
||||
"$$FG$$\n";
|
||||
|
||||
dst=buf;
|
||||
while (TRUE) {
|
||||
ch=MorseWaitKey;
|
||||
if (ch==CH_SPACE) {
|
||||
*dst=0;
|
||||
src=morse_list;
|
||||
while (*src) {
|
||||
if (!StrCmp(src+1,buf)) {
|
||||
"$$FG,GREEN$$%C$$FG$$",*src;
|
||||
break;
|
||||
} else
|
||||
src+=StrLen(src)+1;
|
||||
}
|
||||
'' CH_SPACE;
|
||||
dst=buf;
|
||||
} else {
|
||||
if (dst-buf<sizeof(buf)-1) {
|
||||
'' ch;
|
||||
*dst++=ch;
|
||||
}
|
||||
}
|
||||
}
|
||||
Snd(0);
|
||||
}
|
||||
|
||||
Morse;
|
||||
@@ -0,0 +1,41 @@
|
||||
U0 Song()
|
||||
{ //Song by Terry A. Davis
|
||||
Fs->task_end_cb=&SndTaskEndCB;
|
||||
MusicSettingsRst;
|
||||
try //Catch <CTRL-ALT-C> exit
|
||||
while (!ScanChar) {
|
||||
Play("4hEqDCBCDhE",
|
||||
"God \0is \0a \0g\0od \0of \0love.\n\0");
|
||||
Play("3GqFEFhG4E",
|
||||
" \0 \0 \0 \0 \0He \0");
|
||||
Play("qDCBCDhE3G",
|
||||
"wat\0ches \0us \0from \0a\0bove.\n\0 \0");
|
||||
Play("qFEFhG4BqC",
|
||||
" \0 \0 \0 \0Our \0world \0");
|
||||
Play("DhCeDChB3G",
|
||||
"is\0n't \0al\0ways \0nice.\n\0 \0");
|
||||
Play("qFEFhG4EqD",
|
||||
" \0 \0 \0 \0Be\0fore \0");
|
||||
Play("CBCDhE3G",
|
||||
"you \0gr\0ipe \0think \0twice.\n\0 \0");
|
||||
Play("qFEFhG4EqD",
|
||||
" \0 \0 \0 \0He \0wat\0");
|
||||
Play("CBCDhE3G",
|
||||
"ches \0us \0from \0a\0bove.\n\0 \0");
|
||||
Play("qFEFhG4EqD",
|
||||
" \0 \0 \0 \0He'll \0smack \0");
|
||||
Play("CBCDhE3G",
|
||||
"you \0with \0out \0a \0glove.\n\0 \0");
|
||||
Play("qFEFhG4BqC",
|
||||
" \0 \0 \0 \0Our \0world \0");
|
||||
Play("DhCeDChB3G",
|
||||
"is\0n't \0al\0ways \0nice.\n\0 \0");
|
||||
Play("qFEFhG");
|
||||
}
|
||||
catch
|
||||
CatchAll;
|
||||
NewLine;
|
||||
Snd(0);
|
||||
}
|
||||
|
||||
Song;
|
||||
@@ -0,0 +1,98 @@
|
||||
Bool poly_done;
|
||||
I64 start_buf_num;
|
||||
U0 (*fp_task_end_cb)();
|
||||
U0 (*fp_old_fill_buf)(SND_OUT_CONTAINER *buf,I64 buf_num)=NULL;
|
||||
|
||||
U0 PolyFillBuf(SND_OUT_CONTAINER *buf,I64 buf_num)
|
||||
{ //Gets called by HD Audio task -- $LK,"HDAudioTask","MN:HDAudioTask"$().
|
||||
|
||||
//Note: the buffer is in uncached memory
|
||||
//so you might want to avoid multiple
|
||||
//accesses due to slow speed. (If you were
|
||||
//to add a bunch of waveforms together, you
|
||||
//might want to do it in a cached buffer
|
||||
//and copy it once.)
|
||||
|
||||
I64 j,m,r;
|
||||
F64 t,d;
|
||||
if (poly_done) return;
|
||||
t=ToF64((buf_num-start_buf_num)*(SND_BUF_LEN/SND_OCHANNELS))/SND_SAMPLE_RATE;
|
||||
j=0;
|
||||
while (j<SND_BUF_LEN) {
|
||||
d=0.5*Sin(1.0*(2*ã)*t)+0.5; //Stereo pos from 0.0-1.0
|
||||
r=RandI32;
|
||||
m=0;
|
||||
|
||||
m+=0.2*MAX_I32*Caw(t,0.25)*Sin(220.0*(2*ã)*t);
|
||||
m+=0.2*MAX_I32*Caw(t,0.25)*Sin(222.0*(2*ã)*t);
|
||||
m+=0.2*MAX_I32*Caw(t,0.25)*Sin(880.0*(2*ã)*t);
|
||||
m+=0.2*MAX_I32*Caw(t,0.25)*Sin(884.0*(2*ã)*t);
|
||||
m+=0.4*r*Caw(t,.125);
|
||||
if (Caw(t-.25,0.5)<=0.05)
|
||||
m+=0.3*r*Caw(t,0.05);
|
||||
if (t>4.0) {
|
||||
if (0.90<Caw(t,1.0))
|
||||
m+=0.6*MAX_I32*Caw(t,0.1)*FullCaw(t,0.001);
|
||||
if (t>8.0) {
|
||||
if (0.70<Caw(t,1.0)<0.90)
|
||||
m+=0.4*MAX_I32*Caw(t-.7,0.5)*FullCaw(t,0.00075);
|
||||
if (t>12.0) {
|
||||
if (0.30<Caw(t,1.0)<0.40)
|
||||
m+=0.4*MAX_I32*Sin(100.0/(1.1-Saw(t,0.01)));
|
||||
if (t>16.0)
|
||||
m+=0.3*MAX_I32*Caw(t,1.0/6)*Sin(440.0*(2*ã)*t);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Samples are 24-bit, placed in upper 24 bits of an I32.
|
||||
m*=snd_vol;
|
||||
buf[j++]=ToI64(m*d)&0xFFFFFF00; //Left
|
||||
buf[j++]=ToI64(m*(1.0-d))&0xFFFFFF00; //Right
|
||||
|
||||
t+=1.0/SND_SAMPLE_RATE;
|
||||
}
|
||||
}
|
||||
|
||||
U0 PolyTaskEndCB()
|
||||
{
|
||||
poly_done=TRUE;
|
||||
fp_snd_fill_buf=fp_old_fill_buf;
|
||||
if (fp_task_end_cb)
|
||||
(*fp_task_end_cb)();
|
||||
else
|
||||
Exit;
|
||||
}
|
||||
|
||||
U0 PolyPhonic()
|
||||
{
|
||||
if (snd_dev!=SD_HD_AUDIO) {
|
||||
"Only works for HD Audio.\n";
|
||||
return;
|
||||
}
|
||||
poly_done=FALSE;
|
||||
fp_task_end_cb=Fs->task_end_cb;
|
||||
Fs->task_end_cb=&PolyTaskEndCB; //Catch <CTRL-ALT-X> or Kill() task
|
||||
start_buf_num=snd_obuf_num;
|
||||
fp_old_fill_buf=fp_snd_fill_buf;
|
||||
fp_snd_fill_buf=&PolyFillBuf;
|
||||
try
|
||||
#if IncludeDepth<2
|
||||
PressAKey;
|
||||
#else
|
||||
View;
|
||||
#endif
|
||||
catch { //Catch <CTRL-ALT-C>, but pass it on to next higher handler.
|
||||
fp_snd_fill_buf=fp_old_fill_buf;
|
||||
Fs->task_end_cb=fp_task_end_cb;
|
||||
}
|
||||
poly_done=TRUE;
|
||||
fp_snd_fill_buf=fp_old_fill_buf;
|
||||
Fs->task_end_cb=fp_task_end_cb;
|
||||
}
|
||||
|
||||
//This is so I can use this file stand alone
|
||||
//or as a component of a program.
|
||||
#if IncludeDepth<2
|
||||
PolyPhonic;
|
||||
#endif
|
||||
@@ -0,0 +1,120 @@
|
||||
Bool record_stop,record_done;
|
||||
|
||||
U0 (*fp_old_copy_buf)(SND_IN_CONTAINER *buf,I64 buf_num)=NULL;
|
||||
|
||||
#define RECORD_BUF_SIZE (SND_BUF_LEN*0x100)
|
||||
|
||||
SND_IN_CONTAINER *record_buf[2];
|
||||
I64 record_buf_iptr,record_ibuf_num,record_obuf_num;
|
||||
|
||||
U0 RecordCopyBuf(SND_IN_CONTAINER *buf,I64)
|
||||
{
|
||||
I64 j;
|
||||
SND_IN_CONTAINER *_s=record_buf[record_ibuf_num&1];
|
||||
j=0;
|
||||
while (j<SND_BUF_LEN) {
|
||||
_s[record_buf_iptr++]=buf[j++];
|
||||
j++; //Record in mono
|
||||
}
|
||||
if (record_buf_iptr>=RECORD_BUF_SIZE) {
|
||||
record_buf_iptr=0;
|
||||
record_ibuf_num++;
|
||||
}
|
||||
}
|
||||
|
||||
U0 DrawIt(CTask *task,CDC *dc)
|
||||
{
|
||||
SND_IN_CONTAINER *buf=_hda->istr0_buf[0];
|
||||
I64 i,x1,y1,x2=0,y2=0,
|
||||
cy=task->win_pixel_height>>1;
|
||||
dc->color=BLUE;
|
||||
for (i=0;i<SND_BUF_LEN;i++) {
|
||||
x1=i*task->win_pixel_width/SND_BUF_LEN;
|
||||
y1=cy-buf[i]*cy/MAX_I16;
|
||||
GrLine(dc,x2,y2,x1,y1);
|
||||
x2=x1;
|
||||
y2=y1;
|
||||
}
|
||||
dc->color=RED;
|
||||
}
|
||||
|
||||
U0 RecordTaskEndCB()
|
||||
{
|
||||
fp_snd_copy_buf=fp_old_copy_buf;
|
||||
HDStop(TRUE,FALSE);
|
||||
Free(record_buf[0]);
|
||||
Free(record_buf[1]);
|
||||
record_done=TRUE;
|
||||
Exit;
|
||||
}
|
||||
|
||||
U0 RecordTask(U8 *filename)
|
||||
{
|
||||
Bool old_io_snd;
|
||||
U8 *fname=StrNew(filename),*fname2;
|
||||
TaskInitExt; //needed for disk access
|
||||
record_buf[0]=CAlloc(RECORD_BUF_SIZE*sizeof(SND_IN_CONTAINER));
|
||||
record_buf[1]=CAlloc(RECORD_BUF_SIZE*sizeof(SND_IN_CONTAINER));
|
||||
FileExtRem(fname);
|
||||
record_buf_iptr=0;
|
||||
record_ibuf_num=0;
|
||||
record_obuf_num=0;
|
||||
record_done=FALSE;
|
||||
Fs->task_end_cb=&RecordTaskEndCB;
|
||||
fp_old_copy_buf=fp_snd_copy_buf;
|
||||
fp_snd_copy_buf=&RecordCopyBuf;
|
||||
HDRun(TRUE,FALSE);
|
||||
if (!IsSysDeterministic)
|
||||
Preempt(ON);
|
||||
old_io_snd=IOSnd(OFF);
|
||||
while (!record_stop) {
|
||||
if (record_ibuf_num>record_obuf_num) {
|
||||
fname2=MSPrintF("%s%04d.SNZ",fname,record_obuf_num);
|
||||
SndFileWrite(fname2,record_buf[record_obuf_num&1],RECORD_BUF_SIZE);
|
||||
record_obuf_num++;
|
||||
Free(fname2);
|
||||
}
|
||||
Sleep(1);
|
||||
}
|
||||
fname2=MSPrintF("%s%04d.SNZ",fname,record_obuf_num);
|
||||
SndFileWrite(fname2,record_buf[record_obuf_num&1],record_buf_iptr);
|
||||
record_obuf_num++;
|
||||
Free(fname2);
|
||||
Free(fname);
|
||||
IOSnd(old_io_snd);
|
||||
record_done=TRUE;
|
||||
}
|
||||
|
||||
U0 RecordDemo(U8 *filename="HOME/Record.SNZ")
|
||||
{
|
||||
if (snd_dev!=SD_HD_AUDIO) {
|
||||
"Only works for HD Audio.\n";
|
||||
return;
|
||||
}
|
||||
record_done=FALSE;
|
||||
record_stop=FALSE;
|
||||
Spawn(&RecordTask,filename,"Record .SNZ",Fs);
|
||||
SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$
|
||||
Preempt(OFF);
|
||||
DocCursor;
|
||||
DocClear;
|
||||
Fs->draw_it=&DrawIt;
|
||||
try
|
||||
GetChar;
|
||||
catch //Catch <CTRL-ALT-C>, but pass it on to next higher handler.
|
||||
record_stop=TRUE;
|
||||
record_stop=TRUE;
|
||||
while (record_done)
|
||||
Yield;
|
||||
SettingsPop;
|
||||
while (TRUE) {
|
||||
"\n\nPlay ";
|
||||
if (YorN)
|
||||
SndFilePlaySeq(filename,record_obuf_num);
|
||||
else
|
||||
break;
|
||||
}
|
||||
NewLine(2);
|
||||
}
|
||||
|
||||
RecordDemo;
|
||||
@@ -0,0 +1,46 @@
|
||||
U0 DrawIt(CTask *task,CDC *dc)
|
||||
{
|
||||
SND_OUT_CONTAINER *buf=_hda->ostr0_buf[0];
|
||||
I64 i,x1,y1,x2,y2,
|
||||
cy=task->win_pixel_height>>1;
|
||||
|
||||
dc->color=BLUE;
|
||||
x2=0;y2=cy;
|
||||
for (i=0;i<SND_BUF_LEN;i+=2) {
|
||||
x1=i*task->win_pixel_width/SND_BUF_LEN;
|
||||
y1=cy-buf[i]*cy/snd_vol/MAX_I32;
|
||||
GrLine(dc,x2,y2,x1,y1);
|
||||
x2=x1;y2=y1;
|
||||
}
|
||||
|
||||
dc->color=GREEN;
|
||||
x2=0;y2=cy;
|
||||
for (i=1;i<SND_BUF_LEN;i+=2) {
|
||||
x1=i*task->win_pixel_width/SND_BUF_LEN;
|
||||
y1=cy-buf[i]*cy/snd_vol/MAX_I32;
|
||||
GrLine(dc,x2,y2,x1,y1);
|
||||
x2=x1; y2=y1;
|
||||
}
|
||||
}
|
||||
|
||||
U0 SndScope()
|
||||
{
|
||||
if (snd_dev!=SD_HD_AUDIO) {
|
||||
"Only works for HD Audio.\n";
|
||||
return;
|
||||
}
|
||||
SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$
|
||||
SetWinHorz(1,18);
|
||||
SetWinVert(15,TEXT_ROWS-2);
|
||||
DocCursor;
|
||||
DocClear;
|
||||
Fs->draw_it=&DrawIt;
|
||||
GetChar;
|
||||
SettingsPop;
|
||||
}
|
||||
|
||||
//This is so I can use this file stand alone
|
||||
//or as a component of a program.
|
||||
#if IncludeDepth<2
|
||||
SndScope;
|
||||
#endif
|
||||
@@ -0,0 +1,280 @@
|
||||
#define M_WAVEFORM 0
|
||||
#define M_FREQUENCY 1
|
||||
#define M_ENVELOPE 2
|
||||
|
||||
#define M_NUM_MODES 3
|
||||
|
||||
I64 mode;
|
||||
Bool my_ip_down;
|
||||
I64 last_x,last_y;
|
||||
|
||||
Bool synth_done;
|
||||
|
||||
U0 (*fp_task_end_cb)();
|
||||
U0 (*fp_old_fill_buf)(SND_OUT_CONTAINER *buf,I64 buf_num)=NULL;
|
||||
|
||||
#define NUM_BUF 8
|
||||
SND_OUT_CONTAINER my_buf[SND_BUF_LEN*NUM_BUF];
|
||||
|
||||
#define WF_BUF_LEN 2048
|
||||
#define WF_Y_SCALE 2048.0
|
||||
I64 waveform_buf[WF_BUF_LEN];
|
||||
|
||||
#define FQ_BUF_LEN 2048
|
||||
#define FQ_Y_SCALE 2048.0
|
||||
I64 frequency_buf[FQ_BUF_LEN];
|
||||
F64 fq_scale;
|
||||
|
||||
#define EL_BUF_LEN 2048
|
||||
#define EL_Y_SCALE 2048.0
|
||||
I64 envelope_buf[EL_BUF_LEN];
|
||||
F64 el_scale;
|
||||
|
||||
U0 SynthFillBuf(SND_OUT_CONTAINER *buf,I64 buf_num)
|
||||
{
|
||||
I64 i,j,l,k0,k1,k2,k3;
|
||||
F64 d;
|
||||
static F64 k=0;
|
||||
if (synth_done) return;
|
||||
j=0;
|
||||
k0=buf_num*(SND_BUF_LEN/SND_OCHANNELS);
|
||||
while (j<SND_BUF_LEN) {
|
||||
k1=WF_BUF_LEN*k/(SND_BUF_LEN/SND_OCHANNELS);
|
||||
k2=fq_scale*FQ_BUF_LEN*k0/(SND_BUF_LEN/SND_OCHANNELS);
|
||||
k3=el_scale*EL_BUF_LEN*k0/(SND_BUF_LEN/SND_OCHANNELS);
|
||||
|
||||
d=envelope_buf[k3%EL_BUF_LEN]/EL_Y_SCALE;
|
||||
d*=snd_vol;
|
||||
d*=MAX_I32*waveform_buf[k1%WF_BUF_LEN]/WF_Y_SCALE;
|
||||
i=ToI64(d)&0xFFFFFF00;
|
||||
|
||||
for (l=0;l<SND_OCHANNELS;l++)
|
||||
buf[j++]=i;
|
||||
|
||||
d=frequency_buf[k2%FQ_BUF_LEN]/FQ_Y_SCALE; // [0.0,1.0]
|
||||
d=(SND_BUF_LEN/SND_OCHANNELS)*Exp(5.0*d+4)/SND_SAMPLE_RATE;
|
||||
k+=d;
|
||||
k0++;
|
||||
}
|
||||
}
|
||||
|
||||
U0 SynthTaskEndCB()
|
||||
{
|
||||
synth_done=TRUE;
|
||||
HDStop(TRUE,FALSE);
|
||||
fp_snd_fill_buf=fp_old_fill_buf;
|
||||
if (fp_task_end_cb)
|
||||
(*fp_task_end_cb)();
|
||||
else
|
||||
Exit;
|
||||
}
|
||||
|
||||
Bool WFPlot(U8 *,I64 x,I64 y,I64)
|
||||
{
|
||||
if (0<=x<=WF_BUF_LEN)
|
||||
waveform_buf[x]=y;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
Bool FQPlot(U8 *,I64 x,I64 y,I64)
|
||||
{
|
||||
if (0<=x<=FQ_BUF_LEN)
|
||||
frequency_buf[x]=AbsI64(y);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
Bool ELPlot(U8 *,I64 x,I64 y,I64)
|
||||
{
|
||||
if (0<=x<=EL_BUF_LEN)
|
||||
envelope_buf[x]=AbsI64(y);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
U0 DrawIt(CTask *task,CDC *dc)
|
||||
{
|
||||
I64 i,x1,y1,x2,y2,
|
||||
cy=task->win_pixel_height>>1,
|
||||
h_max=task->win_pixel_width-1;
|
||||
|
||||
if (!win_show_menu) {
|
||||
if (ip_lb) {
|
||||
if (my_ip_down)
|
||||
switch (mode) {
|
||||
case M_WAVEFORM:
|
||||
Line(NULL,
|
||||
(last_x-task->win_pixel_left-task->win_scroll_x)*WF_BUF_LEN/h_max,
|
||||
WF_Y_SCALE*(cy-last_y+task->win_pixel_top+task->win_scroll_y)/cy,0,
|
||||
( ipx-task->win_pixel_left-task->win_scroll_x)*WF_BUF_LEN/h_max,
|
||||
WF_Y_SCALE*(cy-ipy+task->win_pixel_top+task->win_scroll_y)/cy,0,
|
||||
&WFPlot);
|
||||
break;
|
||||
case M_FREQUENCY:
|
||||
Line(NULL,
|
||||
(last_x-task->win_pixel_left-task->win_scroll_x)*FQ_BUF_LEN/h_max,
|
||||
FQ_Y_SCALE*(cy-last_y+task->win_pixel_top+task->win_scroll_y)/cy,0,
|
||||
( ipx-task->win_pixel_left-task->win_scroll_x)*FQ_BUF_LEN/h_max,
|
||||
FQ_Y_SCALE*(cy-ipy+task->win_pixel_top+task->win_scroll_y)/cy,0,
|
||||
&FQPlot);
|
||||
break;
|
||||
case M_ENVELOPE:
|
||||
Line(NULL,
|
||||
(last_x-task->win_pixel_left-task->win_scroll_x)*EL_BUF_LEN/h_max,
|
||||
EL_Y_SCALE*(cy-last_y+task->win_pixel_top+task->win_scroll_y)/cy,0,
|
||||
( ipx-task->win_pixel_left-task->win_scroll_x)*EL_BUF_LEN/h_max,
|
||||
EL_Y_SCALE*(cy-ipy+task->win_pixel_top+task->win_scroll_y)/cy,0,
|
||||
&ELPlot);
|
||||
break;
|
||||
}
|
||||
my_ip_down=TRUE;
|
||||
last_x=ipx;
|
||||
last_y=ipy;
|
||||
} else
|
||||
my_ip_down=FALSE;
|
||||
}
|
||||
|
||||
x2=-1;
|
||||
if (mode==M_WAVEFORM && Blink(,tNP)) {
|
||||
dc->color=ROPF_DITHER+WHITE<<16+RED;
|
||||
GrPutS(dc,0,cy-FONT_HEIGHT,"Set Waveform.");
|
||||
} else
|
||||
dc->color=RED;
|
||||
for (i=0;i<WF_BUF_LEN;i++) {
|
||||
x1=i*task->win_pixel_width/WF_BUF_LEN;
|
||||
y1=cy-cy*waveform_buf[i]/WF_Y_SCALE;
|
||||
if (x2>=0)
|
||||
GrLine(dc,x2,y2,x1,y1);
|
||||
x2=x1;
|
||||
y2=y1;
|
||||
}
|
||||
|
||||
x2=-1;
|
||||
if (mode==M_FREQUENCY && Blink(,tNP)) {
|
||||
dc->color=ROPF_DITHER+WHITE<<16+BLUE;
|
||||
GrPutS(dc,0,cy-FONT_HEIGHT,"Set Frequency.");
|
||||
} else
|
||||
dc->color=BLUE;
|
||||
for (i=0;i<FQ_BUF_LEN;i++) {
|
||||
x1=i*task->win_pixel_width/FQ_BUF_LEN;
|
||||
y1=cy-cy*frequency_buf[i]/FQ_Y_SCALE;
|
||||
if (x2>=0)
|
||||
GrLine(dc,x2,y2,x1,y1);
|
||||
GrLine(dc,x2,cy-(y2-cy),x1,cy-(y1-cy));
|
||||
x2=x1;
|
||||
y2=y1;
|
||||
}
|
||||
|
||||
x2=-1;
|
||||
if (mode==M_ENVELOPE && Blink(,tNP)) {
|
||||
dc->color=ROPF_DITHER+WHITE<<16+GREEN;
|
||||
GrPutS(dc,0,cy-FONT_HEIGHT,"Set Envelope.");
|
||||
} else
|
||||
dc->color=GREEN;
|
||||
for (i=0;i<EL_BUF_LEN;i++) {
|
||||
x1=i*task->win_pixel_width/EL_BUF_LEN;
|
||||
y1=cy-cy*envelope_buf[i]/EL_Y_SCALE;
|
||||
if (x2>=0)
|
||||
GrLine(dc,x2,y2,x1,y1);
|
||||
GrLine(dc,x2,cy-(y2-cy),x1,cy-(y1-cy));
|
||||
x2=x1;
|
||||
y2=y1;
|
||||
}
|
||||
|
||||
dc->color=BLACK;
|
||||
GrLine(dc,0,cy,task->win_pixel_width,cy);
|
||||
}
|
||||
|
||||
U0 SetMenu()
|
||||
{
|
||||
MenuEntryFind(Fs->cur_menu,"Mode/Waveform")->checked=mode==M_WAVEFORM;
|
||||
MenuEntryFind(Fs->cur_menu,"Mode/Frequency")->checked=mode==M_FREQUENCY;
|
||||
MenuEntryFind(Fs->cur_menu,"Mode/Envelope")->checked=mode==M_ENVELOPE;
|
||||
}
|
||||
|
||||
U0 Init()
|
||||
{
|
||||
my_ip_down=FALSE;
|
||||
mode=M_WAVEFORM;
|
||||
MemSetU64(&waveform_buf[0] ,-0.5 *WF_Y_SCALE,WF_BUF_LEN/2);
|
||||
MemSetU64(&waveform_buf[WF_BUF_LEN/2] , 0.5 *WF_Y_SCALE,WF_BUF_LEN/2);
|
||||
MemSetU64(frequency_buf , 0.25*FQ_Y_SCALE,FQ_BUF_LEN);
|
||||
MemSetU64(envelope_buf , 0.75*EL_Y_SCALE,EL_BUF_LEN);
|
||||
fq_scale=0.02;
|
||||
el_scale=0.02;
|
||||
SetMenu;
|
||||
}
|
||||
|
||||
U0 Synth()
|
||||
{
|
||||
I64 p1,p2;
|
||||
if (snd_dev!=SD_HD_AUDIO) {
|
||||
"Only works for HD Audio.\n";
|
||||
return;
|
||||
}
|
||||
|
||||
SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$
|
||||
Preempt(OFF);
|
||||
MenuPush(
|
||||
"File {"
|
||||
" New(,CH_NEW_LINE);"
|
||||
" Abort(,CH_SHIFT_ESC);"
|
||||
" Exit(,CH_ESC);"
|
||||
"}"
|
||||
"Mode {"
|
||||
" Waveform(,'1');"
|
||||
" Frequency(,'2');"
|
||||
" Envelope(,'3');"
|
||||
"}"
|
||||
);
|
||||
WordStat;
|
||||
WinMax;
|
||||
WinBorder;
|
||||
Fs->win_inhibit=WIF_ALL-WIF_MENU;
|
||||
|
||||
Init;
|
||||
|
||||
synth_done=FALSE;
|
||||
fp_task_end_cb=Fs->task_end_cb;
|
||||
Fs->task_end_cb=&SynthTaskEndCB; //Catch <CTRL-ALT-X> or Kill() task
|
||||
fp_old_fill_buf=fp_snd_fill_buf;
|
||||
fp_snd_fill_buf=&SynthFillBuf;
|
||||
DocCursor;
|
||||
DocClear;
|
||||
Fs->draw_it=&DrawIt;
|
||||
try {
|
||||
while (TRUE) {
|
||||
switch (GetMsg(&p1,&p2,1<<MSG_KEY_DOWN+1<<MSG_IP_R_DOWN)) {
|
||||
case MSG_KEY_DOWN:
|
||||
switch (p1) {
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
mode=p1-'1';
|
||||
SetMenu;
|
||||
break;
|
||||
case CH_NEW_LINE:
|
||||
Init;
|
||||
break;
|
||||
case CH_SHIFT_ESC:
|
||||
case CH_ESC:
|
||||
goto sy_done;
|
||||
}
|
||||
break;
|
||||
case MSG_IP_R_DOWN:
|
||||
if (++mode==M_NUM_MODES)
|
||||
mode=0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
sy_done:
|
||||
GetMsg(,,1<<MSG_KEY_UP);
|
||||
} catch { //Catch <CTRL-ALT-C>, but pass it on to next higher handler.
|
||||
fp_snd_fill_buf=fp_old_fill_buf;
|
||||
Fs->task_end_cb=fp_task_end_cb;
|
||||
}
|
||||
synth_done=TRUE;
|
||||
fp_snd_fill_buf=fp_old_fill_buf;
|
||||
Fs->task_end_cb=fp_task_end_cb;
|
||||
SettingsPop;
|
||||
}
|
||||
|
||||
Synth;
|
||||
Binary file not shown.
Reference in new issue
Block a user