SayMore Version 0.45 © 1997 By Kenton A. Groombridge Quick note: I have ordered ClassAct about a month and a half ago. I still have not received it, but when I do, I will start working on some major changes to the program. Until then, it will be just simple bug fixes and enhancements. I like ClassAct, because unlike MUI, it costs you, the user, nothing. The use of this program requires: Workbench 2.04+ narrator.device V37+ found on Workbench 2.04/2.05 and translator.library V43+ found on Aminet as: util/libs/translator42.lha util/libs/Tran43pch.lha Introduction: SayMore is a program designed to replace Say. Say was fine for Workbench 1.3, but the Say program included with 2.0X did not have the ability to change most of the options in the new narrator.device. This is a prerelease version of SayMore. It is not far from being completed, but I want to make this program the best I can. Please look over the interface and features and tell me what you like and dislike. You know I have been saying it is not far from being completed, but it is taking me forever to finish it. Also I am thinking of all kinds of stuff to add to it so this is turing into a never ending project. Hopefully someday it will be completed. At least I have been spending about 5 to 10 hours per week on it. That is a lot more hours than I use to spend on it. There are a couple programs similar to SayMore currently on Aminet. These programs have severe memory leaks and are not system friendly. A considerable amount of time and effort has gone into SayMore to ensure that it is safe. It is near impossible for me to test all the limits of SayMore, but all test have proven that it is completely 100% OS friendly and has no memory leaks. If you find a program on Aminet that has features that SayMore doesn't have and is not listed in the "To Do" list, let me know and I will work hard to implement those. Disclaimer: The use of this program is on your own risk. There is no liability or responsibility for any damage caused by the program. Copyright: SayMore is free to be spread on public-domain and shareware disks, as long as they are sold for a reasonable charge. Use of the program: SayMore is my gift to the Amiga community. I do not charge money for the use of SayMore, but I have coined the term caveatware. Caveatware means that you may use the program just by reading the following. You don't have to abide by them, just read and consider them. 1. If English is your native language, please try to speak it correctly. I know that my English is not always correct, but I am trying to improve it. Some of by pet peeves are using the word "gender" when you mean "sex." As one person said, gender is the attribute of a word and not a person. This all has to do with political correctness which I despise. 2. Write a program for the Amiga. It seems like every time I read usenet news, there is somebody wishing there was a program that did this or that. Do something about it, and write a program. I use to write programs with the public domain/freeware a68k and blink. Although painful, I did write some pretty nifty programs. 3. If you write Amiga software, and charge a fee for what you write, please consider discounts for other Amiga software authors. I feel that this would increase the amount of software for the Amiga. 4. Send a message to me letting me know that you use the program. I would greatly appreciate some input on what you would like to see added or changed to the program. 5. If you do find a bug with the program. Please let me know as soon as possible. This will make future versions of the program better for you and other users. 5. Bug Amiga International to include narrator.device and translator.library with future releases of Workbench. 6. More to follow. Required: As far as I know, this program requires Workbench 2.04+, but it has not been tested on all platforms. It was written on an Amiga 2000/GVP 040/Workbench 3.1 and an Amiga 4000/040/Workbench 3.1. Remember that it requires the new narrator.device included with Workbench 2.0X, and V43 of translator.library found on Aminet. Reporting errors: I have put in some code to help determine the cause of errors. When a detectable error occurs in this program, a requester will pop up with some text indicating the error that occurred and the approximate amount of CHIP RAM and FAST RAM. If either of these numbers are small, you may be running out of memory. Try to free some memory and try again. Read the message. If the message says "Can not open translator.library V43 or above," check to see that you have that library and it is the correct version. The only problem that will not display an error, is if intuition.library V37 or above could not be opened. This is because the requester requires intuition.library to be opened to operate. If you can not determine the cause of the error or the program fails without a detectable error, please send me the configuration of your system, other programs that were running at the time, and any other information you feel is important. Contacting the author: e-mail kgroombr@interquest.de Kenton.Groombridge@wpc.af.mil snail-mail Kenton Groombridge PSC 3 Box 1766 APO AE 09021 USA -OR- Kenton Groombridge PSC 3 Box 1766 D:67661 Kapaun Flugplatz Germany Acknowledgments: The first SayMore program was written using HiSoft DevPac Assembler 3.04. I have sent several messages to HiSoft as how to upgrade to the most recent version of the program, but have never received a response. If you know who to contact about upgrading this program, please let me know. This version of the program is written using SAS/C 6.58. SAS/C is a great program, and I hope that they continue support for the Amiga. Thanks to the SAS/C Amiga developers for the four patches written after Commodore's death. Thanks to Gateway 2000 for saving the Amiga's future. For the folks at Gateway, if you are looking for a quality individual with years of experience in sales, programming, quality control, and the dozen other jobs I have done in the military, look me up. I can sell the Amiga. To do: 1. Refine the tool types. 2. File requester to speak files. 3. Make the command line operation compatable with Say and add extra features. 4. Switch characters compatable with say, so that the voice can change while speaking and add extra features. 5. Rewind, Fast Forward, Stop, and Pause buttons. 6. Sizeable main window. 7. Menu with items such as "Open", "About", "Quit, etc." 8. Font sensitivity. 9. Localization. 10. More face types. /* Any ideas out there? */ 11. Refine the GUI. 12. Save options, with the ability to save multiple setups. 13. Enhance sentence parsing routines or do a plugin so users can define their own. 14. Multiple selection of icons. 15. Progress indicator. 16. Pretty icons of my own design or if you have some, I will include them and give you credit in my docs. 17. Better documentation in AmigaGuide format. I got to work on this one! 18. Voice database, and the ability to save multiple voices. 19. Multiple faces at one time. 20. The ability to not use translator.library and type in the translated text directly. 21. Any feasible user request. 0.10B Written in assembler. It was not user friendly, but it worked. 0.20 Ported to C and made several enhancements. 0.25 Fixed a bug in error reporting. It reported that it could not create the console message port when it could not open translator.library and vice-versa. Included the correct documentation. 0.30 Fixed bug with the console_task that caused messages to get passed to the wrong instance of the program when two or more instances of the program were loaded. Changed translate_buffer's size to account for the largest possible translate string (I hope). Discovered a bug in translator.library. When it handles large strings of consecutive numbers, it will skip numbers every 100 numbers it processes. The tranlate_buffer's size accounts for the largest string possible when or if this bug is ever fixed. Found a bug with the creation of the console_task. If console_task tried to find it's parents message port before the port was added to the system list, it would crash with a Guru 80000008. I could not find a way to completely fix this bug. I did make it where the parent's message port is added to the system list way before the spawned task should ask for it. The only way I know to fix this is to have only one instance of SayMore running at a time. If at anytime you get this error, please let me know, and I will work harder to try to eliminate this bug. Added "Face" window. It is ugly, but it is a start. 0.33 Changed code so that only one instance of SayMore can run at a time. There really is no reason for two instances since only one narrator.device can be open at any one time. Fixed "Face" window so that it works with different size borders. Eliminated the GimmeZeroZero window for face so less system resources are needed. Sped up Face routine significantly. Now uses EasyRequest() to print error messages. This is good news for those who are using monitors that don't sync down to 15KHz. "Face" window now uses a diamond mouth. Don't worry, future version will have user configurable mouths. This is just for testing since I am certian that the round mouth is functional. 0.41 Fixed bug with the code that determined if another instance of saymore was running. It used to assign a name to the node of the process. The problem was, if the program was run from the shell, it would change the process node of the shell to "SayMore". If the program was exited and an attempt was made to run it again, it would not run because the shell still had the name "SayMore". It would only run again if the shell was exited. Make sense? Now it uses a message port to send and recieve it's messages when starting up. Added one of my "To Do" items about a requester for "CONTINUE" or "BRING TO FRONT". It can't bring the "SayMore Input" and "SayMore Output" windows to front because they are actually CON:. Depending on the difficulty and the time I have, I will try to change CON: to windows and attach the console.device. The current method is easiest since CON: already has cut/paste and history built in. Fixed the spelling of my name in the title bar. When I was doing a search and replace, I killed the two o's in Groombridge. Oh well, it didn't affect the running and it actually saved a couple bytes. Added a couple optimizations that save a few bytes and sped up the code a bit. SayMore is now translator.library V43+ only. I did this because it is free, and it overcomes the shortcommings and the bugs found in V37 translator.library. It also has many features which make it a must have. The docs say that V42 has bugs, but I never came across them. Since the V43 patch is free, I made SayMore V43 only. Command line operation. Although not complete, you can specify a file name to speak. The length of the filename does have a limit, but future versions will overcome this. At the moment, this is under testing. To read a file back type: Saymore "path:file", where "path:file" is the absolute or relative path and file name. If it can't find the file, SayMore will appear to start up and then exit without a message. A future version will open a file requester when this happens. Added tool types. At the moment there is no way to save the current configuration, but this is due to change. To change their values, use the Icons->Information... from the Workbench menus and add/delete/edit the tools. 0.42 Fixed some stupid bugs in the file read routines. Although the windows would open, no text was rendered in them. Also the windows sometimes would not close when the program was finished speaking the file. Fixed the "EYE" types so that they are all the same width and height no matter what eye type is used. The "BOX" eye used to be rendered slightly larger. Changed the tooltype values for "EYES" and "MOUTH". "SQUARE" is now "BOX", and "ROUND" is now "OVAL". I did this for three reasons. It saves several bytes in the code, it makes the program faster, and they are more accurate terms. 0.43 Added Noses. Altered the tooltypes routines so that the values can be either upper or lower case. Before they were case sensitive and had to be upper case. Messed around with the face/eye/mouth routines some more and cut the code down by about 200 bytes and sped up the routines about 10%. Changed the internal icon to a smaller one so that the code is a lot smaller. Optimized a few pieces of code here and there. Changed the code so that that gadgets in the main window are no longer ghosted. Instead, it gives a busy pointer when clicking in the main window. I like it better this way except that if you use an interlace pointer with 3.X then you will get the big ugly watch pointer. I may start two versions, one for 2.X and one for 3.X. Now supports INPUTBUFFER and OUTPUTBUFFER tooltypes. Rewrote the spawned task routines. Now more memory efficient and faster. Fixed a bug in the if(signal_recieved & console_sigbit) It would GetMsg and ReplyMsg even though there may not be a message. Added if(GetMsg(..)). I am surprised I didn't find this one sooner. 0.44 (12 Sep 97) Major reconstruction of the spawned tasks that reads input from the keyboard and from a file. I combined the two routines into one routine since they were almost identicle and rewrote much of it. It is a lot smaller and faster than the previous version and should also fix a bug when pasting using Powersnap. Rewrote much of the tooltype reading section so that defaults are set up first and any user override will set those desired. This resulted in about 1KB smaller code. 0.45 (15 Sep 97) Don't ask about 0.44. It was a mess. Actually the code was clean except for two lines of code. The weird thing is it worked on my machine, but not on most others. The way I had it written would cause the machine to crash on many machines because of timing. I fixed those two lines, and added a couple optimizations. I am still waiting for ClassAct. I need to get out my bank statement to see if they cashed my check and when. For all I know they haven't received my payment. I am a U.S. service member stationed in Germany, and sometimes the mail isn't exactly reliable. Final Word: Do not use 0.44! It probably harm your system, but it is guaranteed to crash at some time. Tool types currently supported are: String Value ----------------------------------------------------------------- NOFACE Boolean: use if you do not want the face window. FACEX= Any positive value within the screen limits. FACEY= Any positive value within the screen limits. FACEWIDTH= Any positive value greater than 50 and within the screen limits. FACEHEIGHT= Any positive value greater than 75 and within the screen limits. NOMAIN Boolean: use if you do not want the main window. MAINX= Any positive value within the screen limits. MAINY= Any positive value within the screen limits. NOINPUT Boolean: use if you do not want the input window. INPUTX= Any positive value within the screen limits. INPUTY= Any positive value within the screen limits. INPUTWIDTH= Any positive value within the screen limits. INPUTHEIGHT= Any positive value within the screen limits. NOOUTPUT Boolean: use if you do not want the output window. OUTPUTX= Any positive value within the screen limits. OUTPUTY= Any positive value within the screen limits. OUTPUTWIDTH= Any positive value within the screen limits. OUTPUTHEIGHT=Any positive value within the screen limits. EYES= DIAMOND, BOX, OVAL NOSELEFT Boolean. Use if you want a left pointing nose. Use along with NOSERIGHT to make a triangle nose. NOSERIGHT Boolean. Use if you want a right pointing nose. Use along with NOSELEFT to make a triangle nose. MOUTH= DIAMOND, BOX, OVAL INPUTBUFFER= The size of the input buffer for file reading. OUTPUTBUFFER=The size of the output buffer for the text conversion. * NOTICE * Be careful with these six. If the number is too small, you will be rendering in the window borders and you can go outside the rastport. This can crash the system. Leave these out to default to a safe value. EYESPACING= Any positive value. The bigger the number the closer the spacing of the eyes. EYEWIDTH= Any positive value. The bigger the number the smaller the width. EYEHEIGHT= Any positive value. The bigger the number the smaller the height. NOSELENGTH= Any positive value. The bigger the number the smaller the nose. MOUTHWIDTH= Any positive value. The bigger the number the smaller the mouth. MOUTHHEIGHT= Any positive value. The bigger the number the smaller the mouth. * NOTICE * * These will be supported when the Sizeable main window is finished. * MAINWIDTH= Any positive value within the screen limits. MAINHEIGHT= Any positive value within the screen limits. Last bit of info: You all may wonder what happens to versions that are not listed above. They do exist, but are versions that I test and debug. They are not released to the general public. If you want to receive beta programs, actually they are all beta, send me an email or retrieve them from my web site. All I ask is that you test them thoroughly and send me notes letting me know the problems you find. For those that don't want these unreleased beta's, I have not received any reports of major bugs in the beta's except for version 0.44. Version 0.44 is a different beast all together. I will try never to do that again. Anyway, I try to release quality software. I run SayMore every day on large text files while programming. Like I said before, there is no way for me to debug it completely. That is why I appreciate your input. Get the latest version on my web page at: http://www.interquest.de/~kgroombr/