Esse artigo é voltado para quem deseja ver o dosvox de dentro para fora.


Se você deseja saber como programar para dosvox, o que o faz funcionar,
quais as peças que o compõe,

então esse artigo é para você.


Nada de apostilas massantes, nem de textos longos.


Sempre que possível, eu vou trazer textos não muito grandes, mostrando a
arte de escrever programas para essa tão querida plataforma que é o
sistema dosvox.


Quem me acompanha, certamente já ouviu falar no curso de programação
para dosvox.


Mas eu sei que nem todos podem fazer, ou nem todos querem.


Não, não estou aqui para vender nada, nem vou incomodar ninguém pedindo
pelo amor de Deus para fazer o curso.


Esse trabalho é um presente meu para você.

Tanto que essa é a única vez que falarei dele, dentro dessa série de textos.


É simples assim:

se o assunto te interessar, você lê os textos e pratica o que eu mostro
nele.

Se isso mexer com você, ou se você quiser ainda mais, você me contacta
em privado e peça o curso.

E o que é o "mais"?


Acompanhamento a todo tempo, por whatsapp ou email, para você tirar suas
dúvidas.

Exercícios práticos de scripvox, um pouco de pascal para dosvox e troca
de ideias sobre coisas que você não vai ver na

sua aula de informática.

Não, não é autovalorização.

É muito provável que você se surpreenda com o que você pode fazer com
seu dosvox, ainda que ele tenha diversas limitações.


E diferente do que costumam fazer por aí, comigo você decora muito pouco
e aprende bem mais do que decora.


Pergunta pra quem fez o curso comigo, quantas vezes eu dizia: "Não me
lembro bem o atalho" ou... "a linha é quase essa"...

Uma hora dessas, você deve estar pensando:

"ué, então você não ensina nada"?

Sim.

Só que ao envés de formar apertadores de botão e decoradores de atalhos 
e códigos, procuro a ensinar o como é, como funciona, para que serve, 
onde fica, como se chega lá, como se constrói, como se modifica...

Percebeu?

Atalhos a gente anota para consulta quando precisar. Com o tempo,  eles 
vão ficar gravados na sua mente.

Agora, conceitos, se tivermos alguém que nos ajude a entendê-los, e se 
tiversmos compromisso e dedicação no aprendisado, decorebas serão cada 
vez menos necessárias e, certamente, saímos na frente de uma porção de 
gente que não sabe sequer o botão que acabou de apertar.


Bom... dito isso tudo aí, chega de lerolero e vamos ao texto de hoje!

*


[0] Índice
1. Um pouco de história;
2. Instalando o delphi
3. escrevendo e compilando meu primeiro programa para dosvox
4. Variáveis;
4.1 Declarando uma variável;
4.2 Tipos de variáveis;
5. Obtendo valores digitados pelo usuário;
5.1 SintRead e Sintreadln;
5.2 Read e readln;
5.3 Sintreadint;

[1] Um pouco de história;
Desde suas versões iniciais, o dosvox era escrito em pascal.
Antes, era compilado com um compilador chamado turbo pascal.
Depois, veio o windows 95, e com ele, muitos avanços, que o dosvox não 
conseguia
acompanhar.
Como nessa época, mesmo tendo windows, a instalação do ms dos era 
obrigatória,
o dosvox não deixava de funcionar, porém, só funcionava no ms dos.

Mais tarde, veio o windows 98.
O ms dos ainda se fazia presente, mas já estava com seus dias contados.
Foi aí que surgiu o primeiro dosvox para windows.

Mas como continuar escrevendo o sistema em pascal, se o pascal rodava 
apenas em
ms dos?

     A borland, empresa que produzia o compilador borland pascal, lançou 
na época
da chegada do windows, uma ide chamada delphi.

O delphi incluía um ambiente de edição de código, um depurador e um 
compilador,
além de mais uma série de acessórios, como por exemplo, vários componentes
gráficos para colocar nos programas, como botões, caixas de diálogo, tudo
já pronto, era apenas arrastar para a janela e depois editar o código para
aquele componente.

A linguagem usada no ambiente delphi era o object pascal, que nada mais era
do que o antigo pascal com orientação a objetos.

Mas isso, mesmo sendo algo muito poderoso, ainda mais para aquela época 
(1995),
não se encaixava bem para o dosvox.

foi criada então uma biblioteca que simulava o ambiente do antigo pascal,
trazendo de volta todas as funções e procedimentos do pascal, que já era 
usado
no dosvox, para dentro do delphi.
E assim, foi possível reescrever o dosvox para windows, mudando 
praticamente nada
no código dos utilitários.
Essa biblioteca chama-se dvcrt, e está no dosvox até hoje.

Então, podemos dizer que, hoje em dia, o dosvox é escrito em pascal e 
compilado
com delphi 6 ou delphi7.


[2] Instalando o delphi;

Para ter o delphi em sua máquina, pronto para compilar programas para o 
ambiente dosvox,
siga estes passos:
1. Baixe o delphi portátil deste endereço:
http://www.sanfersite.com.br/testes/delphi6_portatil.rar

2. Descompacte o pacote rar em qualquer local de sua máquina, sugerimos 
a raíz
do disco c (c:\)
     Pronto, você já tem o delphi e pode compilar seus programas para 
dosvox!

[3] Escrevendo e compilando meu primeiro programa para dosvox

Antes de começar, recomendamos que você crie uma pasta para seu projeto.
Isso vai te ajudar a se organizar, pois assim, todos os arquivos 
pertencentes
ao seu projeto ficam num lugar separado para eles.

Criada a pasta, vamos começar.
Abra seu edivox e crie um arquivo chamado olamundo.dpr

Digite o código abaixo:
program olamundo;
uses dvcrt, dvwin;

begin
     sintinic (0, '');
     sintWriteln ('Olá mundo!');
     sintWriteln ('Este é meu primeiro programa em pascal para dosvox!');
sintfim;
end.

O programa acima escreve na tela as mensagens:
Olá mundo!
Este é meu primeiro programa em pascal para dosvox!

Vamos ver linha a linha do código:

Na primeira linha temos:
program olamundo;
Todo programa em pascal começa com a palavra program, um espaço, seguido 
de um
nome para seu programa e finalizando a linha com ponto e vírgula (;)

O nome do programa não pode conter espaços nem acentos.
Também não pode conter símbolos especiais a não ser o sublinhado.

Toda instrução em pascal deve, obrigatoriamente, terminar com ponto e 
vírgula.
Não há distinção entre maiúsculas e minúsculas, como existe na linguagem 
c por exemplo.
Na próxima linha:
uses dvcrt, dvwin;

A cláusula uses serve para que possamos incluir units em nosso programa.
Podemos pensar nas units como um pacote de funções prontas para serem usadas
nos programas.
Aqui estamos incluindo duas units:
Dvcrt, que é uma unit do dosvox.
Ela é uma das units mais importantes num programa para dosvox, pois é nela
que estão as funções que emulam o antigo ambiente pascal.
Dvwin: outra unit importantíssima do dosvox.
Nela contém praticamente todas as funções de voz do sistema.
Funções de baixo nível para o sintetizador nativo, soletração, campo de 
edição
falado, etc... estão na dvwin.

Continuando:
begin

Costumamos pensar num programa em pascal dividido em 3 partes:
1. Cabeçalho. Onde colocamos o nome do programa e as units usadas.
2. Declaração de variáveis (aqui não declaramos nenhuma)

3. Corpo do programa, que é o que está começando agora.
Todas as instruções iniciam após a palavra begin (início em inglês), e 
são enserradas com a palavra end, (fim em inglês),
seguida de um ponto final.

Prossigamos:
     sintinic (0, '');
     Sintinic é uma função especial do dosvox
que se encontra na unit dvwin.
O que ela faz é inicializar o sintetizador e o banco de voz do sistema.
Sem usar o sintinic antes de qualquer outra função de fala, nada vai 
funcionar.
Daí, ou seu programa vai quebrar, ou vai ficar mudo.
A função sintinic recebe dois parâmetros:
Um do tipo inteiro, que significa em que velocidade deve iniciar a fala.
0 significa que deve usar a velocidade configurada no sistema.
E outro do tipo string, que corresponde ao nome da pasta em que o 
programa deve iniciar.
Se vazio (''), inicia na pasta corrente.
Nesse caso, nós dizemos que o programa deve iniciar na velocidade 
configurada no sistema e no diretório corrente.

Vamos para as duas linhas seguintes:
     sintWriteln ('Olá mundo!');
     sintWriteln ('Este é meu primeiro programa em pascal para dosvox!');
sintWriteln é um procedimento especial do dosvox localizado na unit dvwin.
O que ele faz é escrever uma mensagem na tela, ecoando a mesma.
Na tela, após escrever a mensagem, o cursor muda para a próxima linha.
O nome sintWriteln vem da instrução Writeln do pascal.
A instrução writeln escreve uma string na tela e muda o cursor para a 
próxima
linha.
A writeln vem da função write (escrever em inglês), sendo que a função write
não muda de linha depois de escrever.
As letras l e n ao fim da palavra write significa line new (nova linha), daí
então o nome writeln.

No dosvox, também temos, no mesmo esquema, a função sintwriteln, que 
pula de linha
após escrever, e a sintwrite, que não pula de linha.

Se quisermos escrever algo sem ecoar no dosvox, podemos usar as funções 
write
e writeln.
Voltando ao nosso programa temos:
sintfim;
Isso serve para enserrar o que foi iniciado com sintinic, no início do 
programa.
end.
Fim do programa.

Agora, vamos salvar e compilar nosso projeto.

A compilação pode ser feita tanto digitando tudo a mão, quanto usando um 
arquivo
chamado compila.bat.
Este arquivo vem no pacote do delphi portátil, na pasta delphi6.
Para facilitar, vá na pasta c:\delphi6 e copie o arquivo compila.bat 
para a pasta
do seu projeto.
Agora, vá na opção p do dosvox e escreva o seguinte:
compila olamundo

Ele ficará em silêncio por alguns instantes e depois aparecerá
o edivox, com uma série de mensagens.

Vá diretamente na última linha e verifique se tem algo como isto:
12124 lines, 0.58 seconds, 440880 bytes code, 350677 bytes data.

se tem algo parecido com isso, parabéns, você compilou seu primeiro 
programa!
Se não, verifique seu código e tente novamente.

As possibilidade de erro são muitas.
Saber depurar e acertar o que está errado é uma questão de prática e 
paciência.
Uma noção de inglês vai ajudar, já que todas as mensagens do compilador 
e as instruções são nesse idioma.

Agora, se tudo deu certo, feche a janela do edivox com a tecla esc e procure
pelo arquivo olamundo.exe

Execute-o e veja se você ouve a mensagem:
Olá mundo!
Este é meu primeiro programa em pascal para dosvox!

Se ouviu, parabéns, você conseguiu!
Se não ouviu, não desanime, vejamos o que está errado e tentemos novamente!

[4] Variáveis
     O que é uma variável?
     Na informática, uma variável é um nome associado a um endereço de
memória.
     Os endereços de memória são formados por números enormes, geralmente
representados em hexadecimal para facilitar na leitura.

     Os endereços guardam informações, que podem ser manipuladas a medida
que for necessário.
     Se estiver achando complicado tudo isso, continue lendo, tudo será

exclarecido aos poucos.
     Afim de ilustrar o que estamos explicando, vamos imaginar a seguinte
situação:
     Imagine que você queira consultar o endereço de memória
1a0cfdbabacbac

     Complicado manipular algo assim, não acha?
     Para isso existem as variáveis.
Para facilitar na manipulação das informações armazenadas nos endereços
de memória.
Quer ver?
Imagine que o endereço acima tenha um nome associado a ele, como por
exemplo
nomedoaluno?
ou soma?
ou dia?
ou nomedomeuamigo?
     Facilitou, não acha?

[4.1] Declarando uma variável.
No pascal, a declaração de variáveis funciona assim:
escreva a palavra reservada var, depois um espaço, ou mesmo em outra
linha, nome da variável, depois sinal
de dois pontos e o tipo da variável.
E, claro, terminando a linha com ponto e vírgula.
Depois disso,
siga colocando o nome da variável, dois pontos e tipo.
As variáveis podem conter qualquer nome, desde que não tenham acentos ou 
símbolos
especiais nem iniciem com número.
Outra forma de declarar variáveis é assim:
var var1, var2, var3, var4... : tipo;
onde var1, var2, var3... seriam os nomes das variáveis que desejamos 
declarar
e  o tipo após os dois pontos, seria o tipo de todas essas variáveis que 
separamos por vírgula.

Diferente do scripvox, no pascal, é obrigatório que declaremos todas as 
variáveis que serão usadas durante o programa.
Elas devem ser declaradas logo no início, antes de iniciarmos o corpo do 
programa e após a instrução program.

[4.2] Tipos de variáveis;
Enquanto em scripvox tínhamos apenas um único tipo de variável, em pascal,
temos diferentes tipos.

Vamos conhecer aqui os mais usados:
. tipo string:
Serve para guardarmos caracteres alfanuméricos, isso é, letras, números 
e símbolos.
.Tipo integer: serve para guardarmos números inteiros.
Por exemplo: 34, 58, 549,
1234, 5499...

[5] Obtendo valores digitados pelo usuário;
[5.1] Sintread e sintreadln;
São comandos que servem para obter uma string digitada pelo usuário.
A diferença é que sintread lê do teclado mas não muda o cursor para a 
próxima linha,
mas sintreadln sim.
Ambas reproduzem a digitação do usuário.
O tipo da variável que vai receber os dados deve ser string.
Acompanhe o exemplo e entenda como usar.

program pegateclado;
uses dvcrt, dvwin;
var  nome : string;

begin
sintinic (0, '');
sintwriteln ('Olá, qual seu nome?');
sintreadln(nome);
sintfim;
end.

Nesse exemplo, declaramos inicialmente a variável chamada nome, do tipo 
string.
Isso está na linha onde se lê:
var nome : string;
Depois, no corpo do programa, guardamos nela o que o usuário digitou.
Isso foi feito na linha onde encontramos:
sintreadln(nome);
A variável nome então passou a ter o conteúdo digitado pelo usuário.

Mas, e se agora quiséssemos exibir o que o usuário digitou?
Veja abaixo como ficaria:

program pegateclado;
uses dvcrt, dvwin;
var  nome : string;

begin
sintinic (0, '');
sintwriteln ('Olá, qual seu nome?');
sintreadln(nome);
Sintwriteln ('Muito prazer, '+nome+'! Pascal não é tão difícil assim!');

sintfim;
end.

Atente para a última instrução sintwriteln:
Sintwriteln ('Muito prazer, '+nome+'! Pascal não é tão difícil assim!');
Primeiramente, abrimos parênteses e abrimos as aspas simples.
Colocamos a frase 'muito prazer '
após isso, um sinal de mais, o nome de uma variável, outro sinal de mais e
novamente, abrimos aspas simples.

Sem complicar muito, o que fizemos foi escrever uma frase na tela, 
juntar com o conteúdo de uma variável e no fim,
completar com outra frase.

Imagine que a variável nome contém o valor João.
O resultado então seria:
Muito prazer, João! Pascal não é tão difícil assim.

[5.2] Read e readln;
     Funciona igual sintread e sintreadln,
com a diferença que read e readln não fala quando se digita.

[5.3] Sintreadint;
Faz o mesmo que sintread ou sintreadln, mas a variável que vai receber o 
conteúdo
deve ser do tipo inteiro e o conteúdo passado deve ser inteiro.
Exemplo:
program pegainteiro;
uses dvcrt, dvwin;
var i : integer;

begin
sintinic (0, '');
sintwriteln ('Por favor, digite um número:');
sintreadint(i);
sintfim;
end.

Para exibir esse número depois, podemos usar a função sintwriteint.
É o  mesmo que a sintwriteln para strings, mas esta é especial para 
escrever números inteiros.
Veja:
program pegainteiro;
uses dvcrt, dvwin;
var i : integer;

begin
sintinic (0, '');
sintwriteln ('Por favor, digite um número:');
sintreadint(i);
sintwrite ('Você digitou o número ');
sintwriteint(i);
sintfim;
end.

Caso eu digitasse o número 10, o resultado seria:
Você digitou o número 10.
*
