unit uttsTradutor;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, mmsystem,
  uttsPortug, uttsPreproc, uttsSintese, uttsProsodia, mbrplay;

type
  TForm1 = class(TForm)
    e_texto: TEdit;
    b_compilar: TButton;
    Memo1: TMemo;
    Label1: TLabel;
    b_falar: TButton;
    b_parar: TButton;
    b_inicTrad: TButton;
    e_tradutor: TEdit;
    e_excessao: TEdit;
    b_preproc: TButton;
    e_destino: TEdit;
    Label2: TLabel;
    e_abrev: TEdit;
    b_preprosodia: TButton;
    c_comProsodia: TCheckBox;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    c_base: TComboBox;
    b_difones: TButton;
    b_prosodia: TButton;
    Label6: TLabel;
    e_pitch: TEdit;
    Label7: TLabel;
    e_tempo: TEdit;
    Label8: TLabel;
    e_freq: TEdit;
    Label9: TLabel;
    e_prosodia: TEdit;
    b_curvaProsodia: TButton;
    procedure b_pararClick(Sender: TObject);
    procedure b_falarClick(Sender: TObject);
    procedure b_inicTradClick(Sender: TObject);
    procedure b_compilarClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure b_preprocClick(Sender: TObject);
    procedure e_textoKeyPress(Sender: TObject; var Key: Char);
    procedure b_preprosodiaClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure c_baseChange(Sender: TObject);
    procedure e_pitchExit(Sender: TObject);
    procedure e_tempoExit(Sender: TObject);
    procedure e_freqExit(Sender: TObject);
    procedure b_difonesClick(Sender: TObject);
    procedure b_prosodiaClick(Sender: TObject);
    procedure b_curvaProsodiaClick(Sender: TObject);
  private
    procedure carregaBase;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.b_pararClick(Sender: TObject);
begin
    MBR_Stop;
end;

procedure TForm1.carregaBase;
var
    sBuffer: string[250];
    pError: pchar;
begin
    if (Mbr_SetDatabase(PChar(c_base.Text)) <> 0) then
        begin
            pError := @sBuffer[1];
            Mbr_LastError (pError, 250);
            MessageBox (Form1.Handle,pError, 'Erro', IDOK);
         end;
end;

procedure TForm1.b_falarClick(Sender: TObject);
var
     pText: array [0..250] of char;
     status: integer;

begin
     MBR_Stop;
     if e_destino.Text = '' then
         status := Mbr_Play (PChar (Memo1.Text), MBR_WAIT, pchar(''), 0)
     else
         status := Mbr_Play (PChar (Memo1.Text), MBROUT_WAVE, pchar(e_destino.text), 0);
     if status <> 0 then
     begin
          Mbr_LastError (pText, 250);
          if strPas (pText) <> 'Cancelled by user' then
              MessageBox(Form1.Handle, pText, 'Erro', IDOK);
     end;

end;

procedure TForm1.b_inicTradClick(Sender: TObject);
begin
    fimTradutor;
    if not inicTradutor (e_tradutor.Text, e_excessao.Text) then
        showMessage ('Erro na base de dados do compilador');
    if not inicAbrev(e_abrev.Text) then
        showMessage ('Erro no arquivo de abreviaturas');
    carregaBase;
    if not inicProsodia(e_prosodia.Text) then
        showMessage ('Erro no arquivo de prosódia');
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
    fileMode := fmOpenRead;
    b_inicTradClick (sender);
end;

procedure TForm1.b_compilarClick(Sender: TObject);
var fonemas, palavrasComCodigos, palavrasComProsodia, mbrolaCmd: TStringList;
    texto: string;
begin
    texto := e_texto.Text;

    texto := preProcessa(texto);
    palavrasComCodigos := preProsodia(texto);
    palavrasComProsodia :=
         calculaCurvaProsodia (palavrasComCodigos, c_comProsodia.Checked);
    palavrasComCodigos.free;

    compilaFonemas (palavrasComProsodia, fonemas);
    aplicaProsodia (fonemas, mbrolaCmd);

    memo1.lines := mbrolaCmd;

    fonemas.free;
    mbrolaCmd.free;
end;

procedure TForm1.e_textoKeyPress(Sender: TObject; var Key: Char);
begin
    if key = #$0d then
        begin
            b_pararClick(Sender);
            b_compilarClick(Sender);
            b_falarClick(Sender);
        end;
end;

function DatabaseCallback(lpszID: PChar;
                          dwUserData: pointer): Bool ; stdcall {cdecl};
begin
     TComboBox(dwUserData^).Items.Add (String(lpszID));
     DatabaseCallback := true;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
    sBuffer:string[250];
    pError:pchar;
begin
    MBR_RegEnumDatabaseCallback (@DatabaseCallback, longint(@c_base));
    if c_base.Items.Count = 0 then
        begin
            MessageBox(Form1.Handle,'Não há bases MBROLA registradas','Erro',IDOK);
            Close;
         end
     else
         begin
             c_base.itemindex := MBR_RegIdxGetDefaultDatabase;
             if (Mbr_SetDatabase(PChar(c_base.Text)) <> 0) then
                 begin
                     pError := @sBuffer[1];
                     Mbr_LastError (pError,250);
                     MessageBox (Form1.Handle,pError,'Error',IDOK);
                 end;
         end;

    MBR_SetPitchRatio(StrToFloat(e_pitch.Text));
    MBR_SetDurationRatio(StrToFloat (e_tempo.text));
end;

procedure TForm1.c_baseChange(Sender: TObject);
begin
    carregaBase;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    MBR_Stop;
    MBR_MBRUnload;
end;

procedure TForm1.e_pitchExit(Sender: TObject);
begin
    MBR_SetPitchRatio(StrToFloat(e_pitch.Text));
end;

procedure TForm1.e_tempoExit(Sender: TObject);
begin
    MBR_SetDurationRatio(StrToFloat (e_tempo.Text));
end;

procedure TForm1.e_freqExit(Sender: TObject);
begin
    MBR_SetVoiceFreq(StrToInt(e_freq.Text))
end;

procedure TForm1.b_preprocClick(Sender: TObject);
begin
    memo1.text := preProcessa (e_texto.text);
end;

procedure TForm1.b_preprosodiaClick(Sender: TObject);
begin
    memo1.lines := preProsodia (memo1.text);
end;

procedure TForm1.b_difonesClick(Sender: TObject);
var linhas, fonemas: TStringList;
begin
    linhas := TStringList.Create;
    linhas.AddStrings(memo1.lines);
    compilaFonemas (linhas, fonemas);
    memo1.lines := fonemas;
    linhas.free;
    fonemas.free;
end;

procedure TForm1.b_prosodiaClick(Sender: TObject);
var linhas, mbrolaCmd: TStringList;
begin
    linhas := TStringList.Create;
    linhas.AddStrings(memo1.lines);
    aplicaProsodia (linhas, mbrolaCmd);
    memo1.lines := mbrolaCmd;
    linhas.Free;
    mbrolaCmd.free;
end;

procedure TForm1.b_curvaProsodiaClick(Sender: TObject);
var linhas: TStringList;
begin
    linhas := TStringList.Create;
    linhas.AddStrings(memo1.lines);
    memo1.lines := calculaCurvaProsodia (linhas, c_comProsodia.Checked);
    linhas.Free;
end;

end.

