[Search for users] [Overall Top Noters] [List of all Conferences] [Download this site]

Conference napalm::commusic_v1

Title:* * Computer Music, MIDI, and Related Topics * *
Notice:Conference has been write-locked. Use new version.
Moderator:DYPSS1::SCHAFER
Created:Thu Feb 20 1986
Last Modified:Mon Aug 29 1994
Last Successful Update:Fri Jun 06 1997
Number of topics:2852
Total number of notes:33157

1054.0. "Program for Generating Harmonic Synthesis Waves" by COUGAR::JANZEN (Tom LMO2/O23 DTN296-5421) Thu Dec 10 1987 17:22

PROGRAM wavetable(INPUT,OUTPUT,wave_table,decgraph_file);
{-----------------------------------------------------------------------}
{        Written by Tom Janzen 12-3-1987                                }
{	This is a harmonic-additive wave synthesis program.             }
{	It accepts the name of the wave, and				}
{	the weightings of the harmonics of a wave up to      		}
{	harmonic #8 (overtone 7).  It then builds one cycle of the wave }
{	256 bytes long, and sizes it to fit in 256 2's-complement bytes.}
{	It writes the wave to two different files: 1 for MACRO-11 format}
{	and one in load file format for DECgraph with the name you give}
{	the wave.                                                     }
{	The graph description file, is at ant::std:[janzen]wave.grg}
{_______________________________________________________________________}
CONST
    pi = 3.1415926535;
    time_scale = 1.0/256.0;         
VAR
    dacvalue				    : ARRAY [ 0..255] OF INTEGER;
    harmonic_amplitude			    : ARRAY [1..8] OF REAL;
    amplitude				    : ARRAY [0..255] OF REAL;
    dac_max,
    dac_min,
    factor,
    omega  : REAL := 0.0;
    wave_name : VARYING [6] OF CHAR;
    harmonic_number, time			    : INTEGER := 0;
    wave_table,decgraph_file			    : TEXT;
{----------------------------------------------------------------------}
{                      M A I N   P R O G R A M                         }
{______________________________________________________________________}
BEGIN
    WRITELN('enter wave name: ');
    READ(wave_name);
    FOR harmonic_number := 1 TO 8 DO
    BEGIN
	WRITELN('Enter harmonic amplitude',harmonic_number,' : ');
	READ(harmonic_amplitude[harmonic_number]);
    END;
    FOR time := 0 TO 255 DO
    BEGIN
        amplitude[time]:= 0.0;
	FOR harmonic_number := 1 TO 8 DO
	BEGIN
	    omega := 2.0 * pi * harmonic_number;
	    amplitude[time]:=
	        (harmonic_amplitude[harmonic_number]*SIN(omega*time*time_scale))
		+amplitude[time];
	END; 
	dacvalue[time] :=ROUND(128*amplitude[time]);
	IF dacvalue[time] > dac_max
	THEN
	    dac_max := dacvalue[time]
	ELSE
	    IF dacvalue[time] < dac_min
	    THEN
		dac_min := dacvalue[time];
    END;
    IF ABS(dac_max) > ABS(dac_min)
    THEN
	factor := 126/ABS(dac_max)
    ELSE
	factor := 126/ABS(dac_min);
    OPEN(wave_table, wave_name+'.mac',HISTORY := NEW);
    REWRITE(wave_table);
    WRITELN(wave_table,'        .RADIX  10      ;',wave_name);
    FOR time := 0 TO 255 DO
    BEGIN
	dacvalue[time]:=ROUND(dacvalue[time]*factor);
	IF (time MOD 8) = 0 THEN
        BEGIN
            WRITELN(wave_table);
	    WRITE(wave_table,'        .BYTE   ')
        END
        ELSE
            WRITE(wave_table,',');
	WRITE(wave_table, dacvalue[time]:5);
    END;
    WRITELN(wave_table);
    WRITELN(wave_table,'        .RADIX  8');
    CLOSE(wave_table);
    OPEN(decgraph_file, wave_name+'.GRL',HISTORY := NEW);
    REWRITE(decgraph_file);
    WRITELN(decgraph_file,'!--------------------------------------');
    WRITELN(decgraph_file,'!');
    WRITELN(decgraph_file,'!  DECgraph Load File Format 1');
    WRITELN(decgraph_file,'!');
    WRITELN(decgraph_file,'!--------------------------');
    WRITE(decgraph_file,'TITLE ');
    WRITELN(decgraph_file,wave_name);
    WRITE(decgraph_file,'SUBTITLE ');
    WRITELN(decgraph_file,'256-byte 2''s-complement wave');
    WRITE(decgraph_file,'Y_UNITS ');
    WRITELN(decgraph_file,'ONES');
    WRITE(decgraph_file,'X_UNITS ');
    WRITELN(decgraph_file,'ONES');
    WRITELN(decgraph_file,'X_DATA_TYPE NUMERIC');
    WRITE(decgraph_file,'HORIZONTAL_LABEL ');
    WRITELN(decgraph_file,'Sample Point Number');
    WRITE(decgraph_file,'VERTICAL_LABEL ');
    WRITELN(decgraph_file,'Amplitude');
    WRITELN(decgraph_file);
    FOR time := 0 TO 255 DO
    BEGIN
	WRITE(decgraph_file,' ');
        WRITE(decgraph_file,time);
	WRITE(decgraph_file,' ');
        WRITE(decgraph_file,dacvalue[time]:5);
	WRITE(decgraph_file,' ');
        WRITELN(decgraph_file);
    end;
    CLOSE (decgraph_file);
END.
T.RTitleUserPersonal
Name
DateLines
1054.1Keeping the *COM* in COMMUSICDSSDEV::HALLGRIMSSONThe piano has been thinking...Thu Dec 10 1987 18:017
    Pretty neat, Tom.  If I had a ReGIS terminal, I could use this to
    view the nominal waveform resulting from the additive synthesis
    on my Seiko DS310 module.  Are you building executable programs
    (Macro-11) to drive a DAC?  
    
    	Eirikur