VoiceClock V1.0 - Avigo Voice Clock 
Copyright (C) 2001 Jean-michel Bunouf 

The program is freely distributable.  
This means that you have permission to use, copy or distribute 
this software and its documentation.  You do not have permission 
to charge anything other than a duplication fee for distributing 
copies of this software.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  


Special thanks to :
-------------------

Gerard Vermeulen for his Freeware SDK,
Charles Randy Gill and Kai Nothdurft for AVIGO GUI Library,
PMS SYSTEM SOFTWARE, the GREAT site for Avigo fans,
And to all Avigo developers/owners.


...The first voice clock... on Avigo !

Show to others PDA users (Palm, Visor, Psion, Pocket PC ...) that 
Avigo is not out-of-date and has unsuspected possibilities ! The 
built-in buzzer can do something else than a boring beep....

Avigo Voice Clock says time with the following way : "it is 5/10/
15/20/25 to/past 1/2/3/4/5/6/7/8/9/10/11/12/midnight ante/post 
meridiem". The 8Khz sampled voice is mine (sorry for the bad 
english accent). Time -12h or 24h mode- and date -dd/mm/yyyy or 
mm/dd/yyyy- are displayed with a large LCD-style font. A high-tech 
clock in only 32Kbytes...

C Source code included.

Well, don't expect too much. The buzzer can't reproduce amplitude 
variations of a waveform (read comments below)...

SAWA !(*)

Jean-michel Bunouf
2 avril 2001.
E-mail: jeanmichel.bunouf@oreka.com 

(*) Support AVIGO by Writting Applications!



Comments on Voice Clock Technique :
-----------------------------------

The buzzer on the Avigo and its associated driver circuitry is quite
simple and crude, having been designed primarily for creating single 
square-wave tones of various audio frequencies. This buzzer is driven
directly by the output of a chip gate. This results in only two 
possibilities of voltage across the buzzer : 0 volts and full voltage. 
Any sound to be reproduced by this system must be reduced to an 
approximation in the form of a stream of constant-amplitude, variable
-width rectangular pulses.

Examination of a speech waveform on an oscilloscope display quickly 
tells us that it is not going to be possible to even remotely mimic this 
waveform under the above restrictions. Much of the information contained 
in the waveform is in the form of amplitude variations, and this is the 
one attribute we cannot reproduce. 

It is initially tempting to try to use the technique of the "class D" 
amplifier to create the waveform, using high-speed pulse width modulation 
and depending on the mechanical characteristics of the buzzer and those of 
the human ear to provide the missing low-pass filtering. The problem comes 
when I try to play back the sound. It was necessary to time the pulses with 
high resolution. Avigo was not CPU powered enough.

The search for simpler (but still usable) and less CPU-intensive methods of
reproducing speech leads to the question of what information in the waveform
we can discard without an unacceptable loss of intelligibility. Knowing that 
the buzzer cone cannot move instantaneously and serves as an approximation to 
a mechanical integrator at high audio frequencies leads to the idea of 
differentiating the input waveform. This accomplishes the following result: 
the direction of movement of the buzzer corresponds to the direction of
movement (derivative) of the waveform. Amplitude information is lost. As it
turns out, this is sufficiently understandable to be worth.



Files included in voiceclock.ZIP :
----------------------------------

readme.txt ..... this information file
source.zip...... source files  (*)SEE BELOW
voiceclock.app.. compiled version

(*) Files included in source.zip :
----------------------------------

readme.txt ..... This information file

makefile........ \ for Freeware SDK compilation
voiceclock.def.. /
voiceclock.h.... include files
voiceclock.c.... C main file

n##.c(x14)...... say number ASM function
it_is........... say "it_is" ASM function
am.c............ say "ante meridiem" ASM function
pm.c............ say "post meridiem" ASM function
midnight.c...... say "midnight" ASM function
half.c.......... say "half" ASM function
past.c.......... say "past" ASM function
to.c............ say "to" ASM function

icon.bmp........ icon application
bmp#.bmp(x10)... LCD font for time
bmpam.bmp....... "AM" bitmap
bmppm.bmp....... "PM" bitmap
s#.bmp(x10)..... LCD font for date



