🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

2 total messages Started by Junsei Sugino Thu, 12 Nov 1992 12:27
How to use /dev/audio.
#302
Author: Junsei Sugino
Date: Thu, 12 Nov 1992 12:27
276 lines
6990 bytes
$@$3$s$K$A$O!"?yLn!wF|K\%f%K%7%9$G$9!#$3$3$K!"Ej9F$9$k;~$O$$$D$b<ALd$P$+(J
$@$j$G?=$7Lu$"$j$^$;(J$@$s!#(J

$@:#!"(J/dev/audio $@$r;H$C$F$$$m$$$m2;$r=P$9%W%m%0%i%`$r:n$C$F$$$^$9!#C12;(J
$@$O$-$l$$$K=P$;$k$h$&$K$J$C(J$@$?$N$G$9$,!"$I$&$b!"OB2;$r=P$=$&$H$9$k$H$&$^(J
$@$/$$$-$^$;$s!#C1=c$KJ?6Q$r$H$C$?$@$1$G$OBLL\$_$?$$$G$9!#(J

$@$=$3$G!"(Jman audio $@$r$b$&0lEY8+$F$_$?$i!V?.9f$N6/$5$O(J u-law $@E>495!G=$K(J
$@=>$C$F%3!<%I2=$5$l$^$9!#!W$H$"(J$@$j$^$7$?!#;d$O!"!V$-$C$H%j%K%"$8$c$J$$C1(J
$@=cA}2C4X?t$K0c$$$J$$!#!W$H;W$$!"(Jsqrt() $@$J$I$r;H$C$F$_$?$H$3$m(J$@!"$=$3$=(J
$@$3=P$k$h$&$K$O$J$C$?$N$G$9$,!"$d$O$j!"By$C$?2;$7$+=P$^$;$s!#(J($@$=$j$c!"(J
$@EvA3!*!)(J)

$@$d$O$j!"(Ju-law $@$J$k$b$N$r$-$A$s$HM}2r$7$?$$$H;W$$!"Ej9F$9$k$3$H$r;W$$$D(J
$@$-$^$7$?!#$I$J$?$+!"$4B8CN$NJ}$O$I$&$+65$((J$@$F2<$5$$!#(J
          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

$@$A$J$_$K(J($@By$C$?2;$@$1$G$9$,(J)$@2;3Z$rAU$G(J$@$k%W%m%0%i%`$r$D$$$G$KEj9F$7$^$9!#(J
LDLIBS=-lm $@$G%3%s%Q%$%k$7$F2<$5$$!#;H$$J}$O(J

	playcode code ... > /dev/audio

$@$H$$$&$U$&$K;H$$!#%I%_%=$NOB2;$J$i(J

	playcode cego6c2 rrrc2 rrre2 rrrg2 > /dev/audio

$@$J$I(J$@$H$7$^$9!#%3!<%I$N=q$-J}$O(J BASIC $@$J$I$N(J PLAY $@J8$HF1$8$G$9!#$?$@$7!"(J
$@%F%s%]$N(J t $@$d2;NL$N(J v $@$J$I$O%5%]!<(J$@%H$7$F$$$^$;$s!#;H$($k$N$O(J a-g,o,r,l
$@$@$1$G$9!#(J

$@$=$l$G$O!"$h$m$7$/$*4j$$$7$^$9!#(J

------------------------ playcode.c (start) ------------------------
#include <stdio.h>
#include <math.h>
#define N2S(N) (((-N)&0200)|((~((N<0?-N:N)))&0177))

#define SHz	(8000.0)	/* sampling frequency */
#define AHz	(442.0)		/* Base frequency (sound A) */
#define PAI	(3.14159265358979)

#define	New(type)	((type*)malloc(sizeof(type)))
#define	News(type,n)	((type*)malloc(sizeof(type)*(n)))

/*------------------------ Play ------------------------*/
typedef struct Play {
    int	code;
    int length;
} Play;

typedef struct Plays {
    Play*	play;
    int		len;
} Plays;

#define	REST	(-5000)

Plays*	parsecode( str )
char*	str;
{
    int mode = 1;	/* 0 : char, 1 : number */
    int cmd;
    int val;
    int oct = 5;	/* OCTERV */
    int len = 4;	/* LENGTH */
    int i = 0;
    int* valp;
    Play array[256];
    Plays* ret;

    while ( *str ) {
	int cnt = 0;
	switch ( *str++ ) {
	  case 'B':
	  case 'b': /* cnt == 11 */
	    ++cnt;
	    ++cnt;
	  case 'A':
	  case 'a': /* cnt == 9 */
	    ++cnt;
	    ++cnt;
	  case 'G':
	  case 'g': /* cnt == 7 */
	    ++cnt;
	    ++cnt;
	  case 'F':
	  case 'f': /* cnt == 5 */
	    ++cnt;
	  case 'E':
	  case 'e': /* cnt == 4 */
	    ++cnt;
	    ++cnt;
	  case 'D':
	  case 'd': /* cnt == 2 */
	    ++cnt;
	    ++cnt;
	  case 'C':
	  case 'c': /* cnt == 0 */
	    for (;;) {
		if ( *str == '-' ) {
		    --cnt;
		} else if ( *str == '+' ) {
		    ++cnt;
		} else {
		    break;
		}
		++str;
	    }
	    array[i].code = (oct-5)*12+cnt+3;
	    valp = &val;
	    break;
	  case 'R':
	  case 'r':
	    array[i].code = REST;
	    valp = &val;
	    break;
	  case 'L':
	  case 'l':
	    valp = &len;
	    break;
	  case 'O':
	  case 'o':
	    valp = &oct;
	    break;
	  deafult:
	    fprintf( "unknown command '%c'\n", str[-1] );
	    return NULL;
	}
	for ( *valp = 0; isdigit(*str); ++str ) {
	    *valp *= 10;
	    *valp += *str - '0';
	}
	if ( valp == &val ) {
	    int dot;
	    for ( dot = 1; *str == '.'; ++str ) dot *= 2;
	    if ( !*valp ) *valp = len;
	    array[i].length = 24000 * (dot*2-1) / dot / *valp;
	    ++i;
	}
    }
    ret = New(Plays);
    ret->len = i;
    ret->play = News(Play,i);
    while ( i-- ) {
	ret->play[i] = array[i];
    }
    return ret;
}

/*------------------------ Sound ------------------------*/
typedef int	dtype;

typedef dtype	(*soundFunc)();

typedef struct Sound {
    soundFunc	fn;
} Sound;

#define	PLAY(sound)	(*(sound)->fn)(sound)

/*------------------------ SinData ------------------------*/
typedef struct SinData {
    Sound	sound;
    double	sin_a;
    double	sin_b;
    double	cos_a;
    double	cos_b;
} SinData;

static	dtype	playSinData( self )
SinData*	self;
{
    double sin_x;
    double cos_x;

    int n = self->sin_a;
    sin_x = self->sin_a*self->cos_b + self->cos_a*self->sin_b;
    cos_x = self->cos_a*self->cos_b - self->sin_a*self->sin_b;
    self->sin_a = sin_x;
    self->cos_a = cos_x;
    return (dtype)n;
}

static	Sound*	makeSinData( data )
int	data;	/* 0 : A, 1 : A#, 2 : B, 3 : C ... */
{
    SinData*	ret = New(SinData);

    double step = 2.0*PAI*AHz*pow(2.0,((double)data/12.0))/SHz;
    ret->sin_a = 0.0;
    ret->sin_b = sin(step);
    ret->cos_a = 32767.0;
    ret->cos_b = cos(step);
    ret->sound.fn = playSinData;
    return &ret->sound;
}

/*------------------------ playcode ------------------------*/
int	u_low( x )
dtype	x;
{
    int sign;
    if ( x < 0 ) {
	sign = -1;
	x = -x;
    } else {
	sign = 1;
    }
    x = (int)sqrt( (double)x );	/*$@$3$3$,%/%5%$$o$1$G$9$M!#$O$C$O$C$O!#(J*/
    if ( x > 127 ) x = 127;
    return x*sign;
}

void	playcode( plays, n )
Plays*	plays[];
{
    struct Data {
	Sound*	sound;
	int	j;
	int	k;
    } data[10];

    int		i;

    for ( i = 0; i < n; ++i ) {
	data[i].j = data[i].k = 0;
    }

#define J (data[i].j)
#define K (data[i].k)
    for (;;) {
	dtype x = 0;
	int xn;
	int flag = 0;
	for ( i = 0; i < n; ++i ) {
	    if ( K <= 0 ) {
		if ( J >= plays[i]->len ) continue;
		data[i].sound = makeSinData( plays[i]->play[J].code );
		K = plays[i]->play[J].length;
		++J;
	    }
	    flag = 1;
	    x += PLAY(data[i].sound);
	    /*printf( "[%d:%d:%d]", i, x, plays[i]->len ); fflush(stdout);*/
	    --K;
	}
	if ( !flag ) break;
	/*printf( "%d\n", x );*/
	xn = u_low(x);
	putchar(N2S(xn));
    }
#undef J
#undef K
}

main( argc, argv )
int	argc;
char*	argv[];
{
    Plays* plays[10];
    int ret;
    int l=0;

    for ( ++argv, --argc; argc > 0; ++argv, --argc ) {
	plays[l++] = parsecode( *argv );
    }
    playcode( plays, l );
}
------------------------ playcode.c (end) ------------------------
--
$@?yLn=g@6(J (Junsei Sugino)
$@F|K\%f%K%7%9(J($@3t(J) $@CN<1%7%9%F%`It(J $@3+H/5;=Q2](J
(Nihon Unisys co. Knowledge Systems Development Technology)
TEL 03-5562-1213 FAX 03-5562-1299
(TEL +81-3-5562-1213 FAX +81-3-5562-1299)
Re: How to use /dev/audio.
#305
Author: Junsei Sugino
Date: Fri, 13 Nov 1992 04:02
294 lines
7660 bytes
In article <SUGINO.92Nov12212710@mars.tippler.unisys.co.jp> sugino@tippler.unisys.co.jp (Junsei Sugino) writes:

$@$3$s$K$A$O!"?yLn!wF|K\%f%K%7%9(J$@$G$9!#(J

 >$@:#!"(J/dev/audio $@$r;H$C$F$$$m$$$m2;$r=P$9%W%m%0%i%`$r:n$C$F$$$^$9!#C12;(J
 >$@$O$-$l$$$K=P$;$k$h$&(J$@$K$J$C$?$N$G$9$,!"$I$&$b!"OB2;$r=P$=$&$H$9$k$H$&$^(J
 >$@$/$$$-$^$;$s!#C1=c$KJ?6Q$r$H$C$?$@$1$G$OBLL\$_$?(J$@$$$G$9!#(J
 >
 >$@$=$3$G!"(Jman audio $@$r$b$&0lEY8+$F$_$?$i!V?.9f$N6/$5$O(J u-law $@E>495!G=$K(J
 >$@=>$C$F%3!<%I2=$5(J$@$l$^$9!#!W$H$"$j$^$7$?!#;d$O!"!V$-$C$H%j%K%"$8$c$J$$C1(J
 >$@=cA}2C4X?t$K0c$$$J$$!#!W$H;W$$!"(Jsqrt() $@$J$I$r(J$@;H$C$F$_$?$H$3$m!"$=$3$=(J
 >$@$3=P$k$h$&$K$O$J$C$?$N$G$9$,!"$d$O$j!"By$C$?2;$7$+=P$^$;$s!#(J($@$=$j$c!"(J
 >$@Ev(J$@A3!*!)(J)
 >
 >$@$d$O$j!"(Ju-law $@$J$k$b$N$r$-$A$s$HM}2r$7$?$$$H;W$$!"Ej9F$9$k$3$H$r;W$$$D(J
 >$@$-$^$7$?!#$I$J$?(J$@$+!"$4B8CN$NJ}$O$I$&$+65$($F2<$5$$!#(J

$@$H$$$&<ALd$r$7$?$H$3$m!"(JE-mail $@$GEz$($F$$$?$@$-!"$=$NDL$j$d$j$^(J$@$7$?$i(J
$@$&$^$/$$$-$^$7$?$N$GJs9p$7$^$9!#(J

$@7k6I(J u-law $@$O<!$N$h$&$JJQ49$r$9$l$P$$$$$h$&$G$9!#(J

F(x) = sgn(x) * (ln(1+myu*abs(x))) / ln(1+myu)

$@$3$3$G!"CM$NHO0O$O(J

	myu  : 1.0
$@$N$H$-(J
	x    : -1.0 -> 1.0
	F(x) : -1.0 -> 1.0

$@$G$9$+$i!"$"$H$OE,Ev$KJd@5$r$+$1$l$P$$$$$h$&$G$9!#(J

$@$3$N>pJs$r65$($F$$$?$@$$$?!"0J2<(J$@$NJ}$K46<U$$$?$7$^$9!#(J

	$@4X8}!wElBg>pJsMM(J (cocoa@is.s.u-tokyo.ac.jp)
	$@EDJU!wElBg5!3#MM(J (t20280@mech.t.u-tokyo.ac.jp)

$@$I$&$b!"$"$j$,$H$&$4$6$$$^$7$?!#(J

$@$^$?!"$=$l$rF~$l$?%W%m%0%i%`$rEj9F$7$^$9!#Nc$K$h$C(J$@$F(J v $@$d(J t $@$O%5%]!<%H(J
$@$7$F$$$^$;$s!#;H$$J}$O(J

playcode cg8cg8fa8fa8cg8cg8o4go5d8o4go5d8o4g2. o6l8cegcegcfacfacegcego5bo6dgo5bo6dgc2. >/dev/audio

$@$J$I$H$d$C$F2<$5$$!#(J

------------------------ playcode.c (start) ------------------------
#include <stdio.h>
#include <math.h>
#define N2S(N) (((-N)&0200)|((~((N<0?-N:N)))&0177))

#define SHz	(8000.0)	/* sampling frequency */
#define AHz	(442.0)		/* Base frequency (sound A) */
#define PAI	(3.14159265358979)

#define	New(type)	((type*)malloc(sizeof(type)))
#define	News(type,n)	((type*)malloc(sizeof(type)*(n)))

/*------------------------ Play ------------------------*/
typedef struct Play {
    int	code;
    int length;
} Play;

typedef struct Plays {
    Play*	play;
    int		len;
} Plays;

#define	REST	(-5000)

Plays*	parsecode( str )
char*	str;
{
    int mode = 1;	/* 0 : char, 1 : number */
    int cmd;
    int val;
    int oct = 5;	/* OCTERV */
    int len = 4;	/* LENGTH */
    int i = 0;
    int* valp;
    Play array[256];
    Plays* ret;

    while ( *str ) {
	int cnt = 0;
	switch ( *str++ ) {
	  case 'B':
	  case 'b': /* cnt == 11 */
	    ++cnt;
	    ++cnt;
	  case 'A':
	  case 'a': /* cnt == 9 */
	    ++cnt;
	    ++cnt;
	  case 'G':
	  case 'g': /* cnt == 7 */
	    ++cnt;
	    ++cnt;
	  case 'F':
	  case 'f': /* cnt == 5 */
	    ++cnt;
	  case 'E':
	  case 'e': /* cnt == 4 */
	    ++cnt;
	    ++cnt;
	  case 'D':
	  case 'd': /* cnt == 2 */
	    ++cnt;
	    ++cnt;
	  case 'C':
	  case 'c': /* cnt == 0 */
	    for (;;) {
		if ( *str == '-' ) {
		    --cnt;
		} else if ( *str == '+' ) {
		    ++cnt;
		} else {
		    break;
		}
		++str;
	    }
	    array[i].code = (oct-5)*12+cnt+3;
	    valp = &val;
	    break;
	  case 'R':
	  case 'r':
	    array[i].code = REST;
	    valp = &val;
	    break;
	  case 'L':
	  case 'l':
	    valp = &len;
	    break;
	  case 'O':
	  case 'o':
	    valp = &oct;
	    break;
	  deafult:
	    fprintf( "unknown command '%c'\n", str[-1] );
	    return NULL;
	}
	for ( *valp = 0; isdigit(*str); ++str ) {
	    *valp *= 10;
	    *valp += *str - '0';
	}
	if ( valp == &val ) {
	    int dot;
	    for ( dot = 1; *str == '.'; ++str ) dot *= 2;
	    if ( !*valp ) *valp = len;
	    array[i].length = 24000 * (dot*2-1) / dot / *valp;
	    ++i;
	}
    }
    ret = New(Plays);
    ret->len = i;
    ret->play = News(Play,i);
    while ( i-- ) {
	ret->play[i] = array[i];
    }
    return ret;
}

/*------------------------ Sound ------------------------*/
typedef int	dtype;

typedef dtype	(*soundFunc)();

typedef struct Sound {
    soundFunc	fn;
} Sound;

#define	PLAY(sound)	(*(sound)->fn)(sound)

/*------------------------ SinData ------------------------*/
typedef struct SinData {
    Sound	sound;
    double	sin_a;
    double	sin_b;
    double	cos_a;
    double	cos_b;
} SinData;

static	dtype	playSinData( self )
SinData*	self;
{
    double sin_x;
    double cos_x;

    int n = self->sin_a;
    sin_x = self->sin_a*self->cos_b + self->cos_a*self->sin_b;
    cos_x = self->cos_a*self->cos_b - self->sin_a*self->sin_b;
    self->sin_a = sin_x;
    self->cos_a = cos_x;
    return (dtype)n;
}

static	Sound*	makeSinData( data )
int	data;	/* 0 : A, 1 : A#, 2 : B, 3 : C ... */
{
    SinData*	ret = New(SinData);

    double step = 2.0*PAI*AHz*pow(2.0,((double)data/12.0))/SHz;
    ret->sin_a = 0.0;
    ret->sin_b = sin(step);
    ret->cos_a = 32767.0;
    ret->cos_b = cos(step);
    ret->sound.fn = playSinData;
    return &ret->sound;
}

/*------------------------ playcode ------------------------*/
/*
F(x) = sgn(x) * (ln(1+myu*abs(x))) / ln(1+myu)

F(x) : $@=PNO(J/127
x: $@F~NO(J/32768
myu: $@Dj?t(J255
*/

#define	MYU	255.0
#define	SGN(x)	(((x)<0)?-1:1)
#define ABS(x)	(((x)<0)?(-x):(x))

int	u_law( x )
dtype	x;
{
    double dx = ((double)x)/65536.0;
    return (int)(SGN(x) * 127.0 * log(1.0+MYU*ABS(dx)) / log(1.0+MYU));
}

void	playcode( plays, n )
Plays*	plays[];
{
    struct Data {
	Sound*	sound;
	int	j;
	int	k;
    } data[10];

    int		i;

    for ( i = 0; i < n; ++i ) {
	data[i].j = data[i].k = 0;
    }

#define J (data[i].j)
#define K (data[i].k)
    for (;;) {
	dtype x = 0;
	int xn;
	int flag = 0;
	for ( i = 0; i < n; ++i ) {
	    if ( K <= 0 ) {
		if ( J >= plays[i]->len ) continue;
		data[i].sound = makeSinData( plays[i]->play[J].code );
		K = plays[i]->play[J].length;
		++J;
	    }
	    flag = 1;
	    x += PLAY(data[i].sound);
	    /*printf( "[%d:%d:%d]", i, x, plays[i]->len ); fflush(stdout);*/
	    --K;
	}
	if ( !flag ) break;
	/*printf( "%d\n", x );*/
	xn = u_law((dtype)(x/n));
	putchar(N2S(xn));
    }
#undef J
#undef K
}

main( argc, argv )
int	argc;
char*	argv[];
{
    Plays* plays[10];
    int ret;
    int l=0;

    for ( ++argv, --argc; argc > 0; ++argv, --argc ) {
	plays[l++] = parsecode( *argv );
    }
    playcode( plays, l );
}
------------------------ playcode.c (end) ------------------------
--
$@?yLn=g@6(J (Junsei Sugino)
$@F|K\%f%K%7%9(J($@3t(J) $@CN<1%7%9%F%`It(J $@3+H/5;=Q2](J
(Nihon Unisys co. Knowledge Systems Development Technology)
TEL 03-5562-1213 FAX 03-5562-1299
(TEL +81-3-5562-1213 FAX +81-3-5562-1299)
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads