[Search for users]
[Overall Top Noters]
[List of all Conferences]
[Download this site]
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 14: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.R | Title | User | Personal Name | Date | Lines |
---|
1054.1 | Keeping the *COM* in COMMUSIC | DSSDEV::HALLGRIMSSON | The piano has been thinking... | Thu Dec 10 1987 15:01 | 7 |
| 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
|