karaoke prototype (disabled)

This commit is contained in:
Chris Danford
2008-03-12 23:17:39 +00:00
parent ecbe89179e
commit 5e87c2e81a
82 changed files with 13322 additions and 31 deletions
+20 -1
View File
@@ -113,7 +113,11 @@ void ArrowEffects::Update()
}
// mirror
const int iNewColOnSide = SCALE( iColOnSide, iFirstColOnSide, iLastColOnSide, iLastColOnSide, iFirstColOnSide );
int iNewColOnSide;
if( iFirstColOnSide == iLastColOnSide )
iNewColOnSide = 0;
else
iNewColOnSide = SCALE( iColOnSide, iFirstColOnSide, iLastColOnSide, iLastColOnSide, iFirstColOnSide );
const int iNewCol = iSideIndex*iNumColsPerSide + iNewColOnSide;
const float fOldPixelOffset = pCols[iColNum].fXOffset;
@@ -385,6 +389,21 @@ float ArrowEffects::GetXPos( const PlayerState* pPlayerState, int iColNum, float
return fPixelOffsetFromCenter;
}
float ArrowEffects::GetXOffset( const PlayerState* pPlayerState, float fMidiNote )
{
if( fMidiNote == MIDI_NOTE_INVALID )
return 0;
Steps *pSteps = GAMESTATE->m_pCurSteps[ pPlayerState->m_PlayerNumber ];
const RadarValues &rv = pSteps->GetRadarValues( pPlayerState->m_PlayerNumber );
float fMinMidiNote = rv.m_Values.v.fMinMidiNote;
float fMaxMidiNote = rv.m_Values.v.fMaxMidiNote;
if( fMinMidiNote == -1 || fMaxMidiNote == -1 )
return 0;
float fXOffset = SCALE( fMidiNote, fMinMidiNote, fMaxMidiNote, -200.0f, 200.0f );
fXOffset = roundf( fXOffset );
return fXOffset;
}
float ArrowEffects::GetRotation( const PlayerState* pPlayerState, float fNoteBeat )
{
if( pPlayerState->m_PlayerOptions.GetCurrent().m_fEffects[PlayerOptions::EFFECT_DIZZY] != 0 )
+4
View File
@@ -40,6 +40,10 @@ public:
// fYPos (in the case of EFFECT_DRUNK).
static float GetXPos( const PlayerState* pPlayerState, int iCol, float fYOffset );
// Shift a note's fXPos by this amount depending
//
static float GetXOffset( const PlayerState* pPlayerState, float fMidiNote );
// Z position; normally 0. Only visible in perspective modes.
static float GetZPos( const PlayerState* pPlayerState, int iCol, float fYPos );
+3 -1
View File
@@ -34,7 +34,9 @@ static const char *RadarCategoryNames[] = {
"Holds",
"Mines",
"Hands",
"Rolls"
"Rolls",
"MinMidiNote",
"MaxMidiNote",
};
XToString( RadarCategory );
XToLocalizedString( RadarCategory );
+3
View File
@@ -33,6 +33,8 @@ enum RadarCategory
RadarCategory_Mines,
RadarCategory_Hands,
RadarCategory_Rolls,
RadarCategory_MinMidiNote,
RadarCategory_MaxMidiNote,
NUM_RadarCategory, // leave this at the end
RadarCategory_Invalid
};
@@ -72,6 +74,7 @@ enum StepsType
STEPS_TYPE_POPN_FIVE,
STEPS_TYPE_POPN_NINE,
STEPS_TYPE_GUITAR_FIVE,
STEPS_TYPE_KARAOKE_SINGLE,
STEPS_TYPE_LIGHTS_CABINET,
NUM_StepsType, // leave this at the end
StepsType_Invalid,
+3
View File
@@ -142,6 +142,9 @@ GameButton StringToGameButton( const InputScheme* pInputs, const RString& s );
#define POPN_BUTTON_RIGHT_WHITE GAME_BUTTON_CUSTOM_09
#define NUM_POPN_BUTTONS GAME_BUTTON_CUSTOM_10
#define KARAOKE_BUTTON_LEFT GAME_BUTTON_CUSTOM_01
#define NUM_KARAOKE_BUTTONS GAME_BUTTON_CUSTOM_02
#define LIGHTS_BUTTON_MARQUEE_UP_LEFT GAME_BUTTON_CUSTOM_01
#define LIGHTS_BUTTON_MARQUEE_UP_RIGHT GAME_BUTTON_CUSTOM_02
#define LIGHTS_BUTTON_MARQUEE_LR_LEFT GAME_BUTTON_CUSTOM_03
+7
View File
@@ -21,6 +21,9 @@
#include "NetworkSyncManager.h"
#include "RageTimer.h"
#include "RageInput.h"
/* XXX
#include "PitchDetectionTest.h"
*/
static RageTimer g_GameplayTimer;
@@ -176,6 +179,10 @@ void GameLoop::RunGameLoop()
fDeltaTime *= g_fUpdateRate;
/* XXX
PitchDetectionTest::Update();
*/
CheckFocus();
/* Update SOUNDMAN early (before any RageSound::GetPosition calls), to flush position data. */
+68
View File
@@ -71,6 +71,7 @@ static struct
{ "pnm-five", 5, true }, // called "pnm" for backward compat
{ "pnm-nine", 9, true }, // called "pnm" for backward compat
{ "guitar-five", 5, true },
{ "karaoke", 1, false },
{ "lights-cabinet", NUM_CabinetLight, false }, // XXX disable lights autogen for now
};
@@ -2262,6 +2263,72 @@ static const Game g_Game_Popn =
TNS_Miss, // m_mapW5To
};
static const Style g_Style_Karaoke_Single =
{ // STYLE_KARAOKE_SINGLE
true, // m_bUsedForGameplay
true, // m_bUsedForEdit
true, // m_bUsedForDemonstration
true, // m_bUsedForHowToPlay
"single", // m_szName
STEPS_TYPE_KARAOKE_SINGLE, // m_StepsType
StyleType_OnePlayerOneSide, // m_StyleType
1, // m_iColsPerPlayer
{ // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER];
{ // PLAYER_1
{ TRACK_1, 0.0f, NULL },
},
{ // PLAYER_2
{ TRACK_1, 0.0f, NULL },
},
},
{ // m_iInputColumn[NUM_GameController][NUM_GameButton]
{ 0, Style::END_MAPPING },
{ 0, Style::END_MAPPING },
},
{ // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER];
0,
},
false, // m_bNeedsZoomOutWith2Players
false, // m_bCanUseBeginnerHelper
false, // m_bLockDifficulties
};
static const Style *g_apGame_Karaoke_Styles[] =
{
&g_Style_Karaoke_Single,
NULL
};
const InputMapping g_AutoKeyMappings_Karaoke[] =
{
{ 0, KEY_LEFT, KARAOKE_BUTTON_LEFT, false },
InputMapping_END
};
static const Game g_Game_Karaoke =
{
"karaoke", // m_szName
g_apGame_Karaoke_Styles, // m_apStyles
false, // m_bCountNotesSeparately
false, // m_bAllowHopos
{ // m_InputScheme
"karaoke", // m_szName
NUM_KARAOKE_BUTTONS, // m_iButtonsPerController
{ // m_szButtonNames
{ "Left", MENU_BUTTON_LEFT },
},
g_AutoKeyMappings_Karaoke
},
{
{ GameButtonType_Step },
},
TNS_W1, // m_mapW1To
TNS_W2, // m_mapW2To
TNS_W3, // m_mapW3To
TNS_W4, // m_mapW4To
TNS_W5, // m_mapW5To
};
const InputMapping g_AutoKeyMappings_Lights[] =
{
{ 0, KEY_Cq, LIGHTS_BUTTON_MARQUEE_UP_LEFT, false },
@@ -2374,6 +2441,7 @@ static const Game *g_Games[] =
&g_Game_Maniax,
&g_Game_Techno,
&g_Game_Popn,
&g_Game_Karaoke,
&g_Game_Lights,
};
+1
View File
@@ -317,6 +317,7 @@ void GameState::Reset()
m_stEditSource.Set( StepsType_Invalid );
m_iEditCourseEntryIndex.Set( -1 );
m_sEditLocalProfileID.Set( "" );
m_iEditMidiNote = MIDI_NOTE_INVALID;
m_bBackedOutOfFinalStage = false;
m_bEarnedExtraStage = false;
+1
View File
@@ -313,6 +313,7 @@ public:
BroadcastOnChange<int> m_iEditCourseEntryIndex;
BroadcastOnChange<RString> m_sEditLocalProfileID;
Profile* GetEditLocalProfile();
int8_t m_iEditMidiNote;
// Workout stuff
float GetGoalPercentComplete( PlayerNumber pn );
+10 -4
View File
@@ -9,7 +9,9 @@
#include "PlayerState.h"
#include "Style.h"
#include "ActorUtil.h"
/* XXX
#include "PitchDetectionTest.h"
*/
void GhostArrowRow::Load( const PlayerState* pPlayerState, float fYReverseOffset )
{
@@ -44,9 +46,13 @@ void GhostArrowRow::Update( float fDeltaTime )
{
m_Ghost[c]->Update( fDeltaTime );
const float fX = ArrowEffects::GetXPos( m_pPlayerState, c, 0 );
const float fY = ArrowEffects::GetYPos( m_pPlayerState, c, 0, m_fYReverseOffsetPixels );
const float fZ = ArrowEffects::GetZPos( m_pPlayerState, c, 0 );
float fX = ArrowEffects::GetXPos( m_pPlayerState, c, 0 );
/* XXX
if( PitchDetectionTest::s_ms.bVoiced )
fX += ArrowEffects::GetXOffset( m_pPlayerState, m_pPlayerState->m_fWrappedMidiNote );
*/
float fY = ArrowEffects::GetYPos( m_pPlayerState, c, 0, m_fYReverseOffsetPixels );
float fZ = ArrowEffects::GetZPos( m_pPlayerState, c, 0 );
m_Ghost[c]->SetX( fX );
m_Ghost[c]->SetY( fY );
+41
View File
@@ -706,6 +706,22 @@ void NoteDataUtil::CalculateRadarValues( const NoteData &in, float fSongSeconds,
case RadarCategory_Mines: out[rc] = (float) in.GetNumMines(); break;
case RadarCategory_Hands: out[rc] = (float) in.GetNumHands(); break;
case RadarCategory_Rolls: out[rc] = (float) in.GetNumRolls(); break;
case RadarCategory_MinMidiNote:
break; // fill in below
case RadarCategory_MaxMidiNote:
uint8_t uMinMidiNoteOut;
uint8_t uMaxMidiNoteOut;
if( GetMinAndMaxMidiNote( in, uMinMidiNoteOut, uMaxMidiNoteOut ) )
{
out[RadarCategory_MinMidiNote] = (float) uMinMidiNoteOut;
out[RadarCategory_MaxMidiNote] = (float) uMaxMidiNoteOut;
}
else
{
out[RadarCategory_MinMidiNote] = (float) -1;
out[RadarCategory_MaxMidiNote] = (float) -1;
}
break;
default: ASSERT(0);
}
}
@@ -783,6 +799,31 @@ float NoteDataUtil::GetChaosRadarValue( const NoteData &in, float fSongSeconds )
return min( fReturn, 1.0f );
}
bool NoteDataUtil::GetMinAndMaxMidiNote( const NoteData &in, uint8_t &uMinMidiNoteOut, uint8_t &uMaxMidiNoteOut )
{
int iMin = INT_MAX;
int iMax = INT_MIN;
NoteData::all_tracks_const_iterator iter = in.GetTapNoteRangeAllTracks( 0, MAX_NOTE_ROW );
for( ; !iter.IsAtEnd(); ++iter )
{
const TapNote &tn = *iter;
if( tn.iMidiNote != MIDI_NOTE_INVALID )
{
iMin = min( iMin, (int)tn.iMidiNote );
iMax = max( iMax, (int)tn.iMidiNote );
}
}
if( iMin != INT_MAX && iMax != INT_MIN )
{
uMinMidiNoteOut = iMin;
uMaxMidiNoteOut = iMax;
return true;
}
return false;
}
void NoteDataUtil::RemoveHoldNotes( NoteData &in, int iStartIndex, int iEndIndex )
{
// turn all the HoldNotes into TapNotes
+1
View File
@@ -36,6 +36,7 @@ namespace NoteDataUtil
float GetAirRadarValue( const NoteData &in, float fSongSeconds );
float GetFreezeRadarValue( const NoteData &in, float fSongSeconds );
float GetChaosRadarValue( const NoteData &in, float fSongSeconds );
bool GetMinAndMaxMidiNote( const NoteData &in, uint8_t &uMinMidiNoteOut, uint8_t &uMaxMidiNoteOut );
void CalculateRadarValues( const NoteData &in, float fSongSeconds, RadarValues& out );
+12 -6
View File
@@ -354,7 +354,7 @@ struct StripBuffer
int Free() const { return size - Used(); }
};
void NoteDisplay::DrawHoldPart( vector<Sprite*> &vpSpr, int iCol, int fYStep, float fPercentFadeToFail, float fColorScale, bool bGlow,
void NoteDisplay::DrawHoldPart( vector<Sprite*> &vpSpr, int iCol, int fYStep, float fXOffset, float fPercentFadeToFail, float fColorScale, bool bGlow,
float fDrawDistanceAfterTargetsPixels, float fDrawDistanceBeforeTargetsPixels, float fFadeInPercentOfDrawFar,
float fOverlappedTime,
float fYTop, float fYBottom,
@@ -429,7 +429,9 @@ void NoteDisplay::DrawHoldPart( vector<Sprite*> &vpSpr, int iCol, int fYStep, fl
const float fFrameWidthScale = ArrowEffects::GetFrameWidthScale( m_pPlayerState, fYOffset, fOverlappedTime );
const float fScaledFrameWidth = fFrameWidth * fFrameWidthScale;
const float fX = ArrowEffects::GetXPos( m_pPlayerState, iCol, fYOffset );
float fX = ArrowEffects::GetXPos( m_pPlayerState, iCol, fYOffset );
fX += fXOffset;
const float fXLeft = fX - fScaledFrameWidth/2;
const float fXCenter = fX;
const float fXRight = fX + fScaledFrameWidth/2;
@@ -535,12 +537,14 @@ void NoteDisplay::DrawHoldBody( const TapNote& tn, int iCol, float fBeat, bool b
if( bReverse )
swap( fYStartPos, fYEndPos );
float fXOffset = ArrowEffects::GetXOffset( m_pPlayerState, tn.iMidiNote );
bool bTopAnchor = bReverse && cache->m_bTopHoldAnchorWhenReverse;
// Draw the top cap
DrawHoldPart(
vpSprTop,
iCol, fYStep, fPercentFadeToFail, fColorScale, bGlow,
iCol, fYStep, fXOffset, fPercentFadeToFail, fColorScale, bGlow,
fDrawDistanceAfterTargetsPixels, fDrawDistanceBeforeTargetsPixels, fFadeInPercentOfDrawFar,
tn.HoldResult.fOverlappedTime,
fYHead-fFrameHeightTop, fYHead,
@@ -550,7 +554,7 @@ void NoteDisplay::DrawHoldBody( const TapNote& tn, int iCol, float fBeat, bool b
// Draw the body
DrawHoldPart(
vpSprBody,
iCol, fYStep, fPercentFadeToFail, fColorScale, bGlow,
iCol, fYStep, fXOffset, fPercentFadeToFail, fColorScale, bGlow,
fDrawDistanceAfterTargetsPixels, fDrawDistanceBeforeTargetsPixels, fFadeInPercentOfDrawFar,
tn.HoldResult.fOverlappedTime,
fYHead, fYTail,
@@ -560,7 +564,7 @@ void NoteDisplay::DrawHoldBody( const TapNote& tn, int iCol, float fBeat, bool b
// Draw the bottom cap
DrawHoldPart(
vpSprBottom,
iCol, fYStep, fPercentFadeToFail, fColorScale, bGlow,
iCol, fYStep, fXOffset, fPercentFadeToFail, fColorScale, bGlow,
fDrawDistanceAfterTargetsPixels, fDrawDistanceBeforeTargetsPixels, fFadeInPercentOfDrawFar,
tn.HoldResult.fOverlappedTime,
fYTail, fYTail+fFrameHeightBottom,
@@ -644,7 +648,9 @@ void NoteDisplay::DrawActor( const TapNote& tn, Actor* pActor, NotePart part, in
if( fYOffset < fDrawDistanceAfterTargetsPixels || fYOffset > fDrawDistanceBeforeTargetsPixels )
return;
const float fY = ArrowEffects::GetYPos( m_pPlayerState, iCol, fYOffset, fReverseOffsetPixels );
const float fX = ArrowEffects::GetXPos( m_pPlayerState, iCol, fYOffset );
float fX = ArrowEffects::GetXPos( m_pPlayerState, iCol, fYOffset );
if( tn.iMidiNote )
fX += ArrowEffects::GetXOffset( m_pPlayerState, tn.iMidiNote );
const float fZ = ArrowEffects::GetZPos( m_pPlayerState, iCol, fYOffset );
const float fAlpha = ArrowEffects::GetAlpha( m_pPlayerState, iCol, fYOffset, fPercentFadeToFail, m_fYReverseOffsetPixels, fDrawDistanceBeforeTargetsPixels, fFadeInPercentOfDrawFar );
const float fGlow = ArrowEffects::GetGlow( m_pPlayerState, iCol, fYOffset, fPercentFadeToFail, m_fYReverseOffsetPixels, fDrawDistanceBeforeTargetsPixels, fFadeInPercentOfDrawFar );
+1 -1
View File
@@ -96,7 +96,7 @@ private:
void DrawHoldBody( const TapNote& tn, int iCol, float fBeat, bool bIsBeingHeld, float fYHead, float fYTail, bool bIsAddition, float fPercentFadeToFail,
float fColorScale,
bool bGlow, float fDrawDistanceAfterTargetsPixels, float fDrawDistanceBeforeTargetsPixels, float fFadeInPercentOfDrawFar );
void DrawHoldPart( vector<Sprite*> &vpSpr, int iCol, int fYStep, float fPercentFadeToFail, float fColorScale, bool bGlow,
void DrawHoldPart( vector<Sprite*> &vpSpr, int iCol, int fYStep, float fXOffset, float fPercentFadeToFail, float fColorScale, bool bGlow,
float fDrawDistanceAfterTargetsPixels, float fDrawDistanceBeforeTargetsPixels, float fFadeInPercentOfDrawFar, float fOverlappedTime,
float fYTop, float fYBottom, float fYStartPos, float fYEndPos, bool bWrapping, bool bAnchorToTop, bool bFlipTextureVertically );
+29 -12
View File
@@ -60,6 +60,9 @@ struct HoldNoteResult
void LoadFromNode( const XNode* pNode );
};
const int8_t MIDI_NOTE_INVALID = -1;
const int NUM_MIDI_NOTES = 128;
const int MIDI_NOTES_PER_OCTAVE = 12;
struct TapNote
{
@@ -91,26 +94,38 @@ struct TapNote
SubType subType; // Only used if type is hold_head.
Source source;
TapNoteResult result;
PlayerNumber pn;
bool bHopoPossible;
int8_t iMidiNote; // ignored by all game types but Karaoke
PlayerNumber pn; // used in routine mode
bool bHopoPossible; // set just before gameplay begins
// attack only
RString sAttackModifiers;
float fAttackDurationSeconds;
RString sAttackModifiers; // used only if Type == attack
float fAttackDurationSeconds; // used only if Type == attack
// Index into Song's vector of keysound files if nonnegative.
int iKeysoundIndex;
int iKeysoundIndex; // Index into Song's vector of keysound files if nonnegative.
// hold_head only
int iDuration;
HoldNoteResult HoldResult;
int iDuration; // used if hold_head only
HoldNoteResult HoldResult; // used if hold_head only
// XML
XNode* CreateNode() const;
void LoadFromNode( const XNode* pNode );
TapNote() : type(empty), subType(SubType_Invalid), source(original), pn(PLAYER_INVALID), bHopoPossible(false),
fAttackDurationSeconds(0.f), iKeysoundIndex(-1), iDuration(0) { }
TapNote()
{
Init();
}
void Init()
{
type = empty;
subType = SubType_Invalid;
source = original;
iMidiNote = MIDI_NOTE_INVALID;
pn = PLAYER_INVALID,
bHopoPossible = false;
fAttackDurationSeconds = 0.f;
iKeysoundIndex = -1;
iDuration = 0;
}
TapNote(
Type type_,
SubType subType_,
@@ -119,6 +134,7 @@ struct TapNote
float fAttackDurationSeconds_,
int iKeysoundIndex_ )
{
Init();
type = type_;
subType = subType_;
source = source_;
@@ -138,6 +154,7 @@ struct TapNote
COMPARE(fAttackDurationSeconds);
COMPARE(iKeysoundIndex);
COMPARE(iDuration);
COMPARE(iMidiNote);
COMPARE(pn);
#undef COMPARE
return true;
+386
View File
@@ -0,0 +1,386 @@
#include "global.h"
#include "PitchDetectionTest.h"
#include "PitchDetectionTestUtil.h"
#include "srpd.h"
#include "EST_filter.h"
#include "RageLog.h"
#include "RageUtil.h"
#include "NoteTypes.h"
#include <MMSystem.h>
MicrophoneStatus PitchDetectionTest::s_ms;
Microphone *PitchDetectionTest::s_pMicrophone = NULL;
#define MAX_BUFFERS 3
// http://tomscarff.tripod.com/midi_analyser/midi_note_frequency.htm
// http://musicdsp.org/showone.php?id=125
const float MIDI_A4_FREQUENCY = 440.0;
const int MIDI_A4_NUMBER = 69;
const int MIDI_C4_NUMBER = 60; // middle C
const RString NOTE_NAME[MIDI_NOTES_PER_OCTAVE] = {"A ","A#","B ","C ","C#","D ","D#","E ","F ","F#","G ","G#"};
float MidiNoteToFreq( int iMidiNote )
{
return MIDI_A4_FREQUENCY * powf( 2.0, ((float)iMidiNote - MIDI_A4_NUMBER) / MIDI_NOTES_PER_OCTAVE );
}
float log2f( float n )
{
// logb (x) = (loga(x)) / (loga(B))
return logf(n) / logf(2);
}
bool FreqToMidiNote( float fFreq, float &fMidiNoteOut )
{
if( fFreq < 20 ) // well below A0 (MidiNote = 1)
return false;
fMidiNoteOut = MIDI_NOTES_PER_OCTAVE * log2f( fFreq / MIDI_A4_FREQUENCY) + MIDI_A4_NUMBER;
return fMidiNoteOut >= 1;
}
#undef bool
bool PitchDetectionTest::MidiNoteToString( int iMidiNote, RString &sMidiNoteOut )
{
if( iMidiNote < 1 )
return false;
int iDiff = iMidiNote - MIDI_A4_NUMBER;
wrap( iDiff, MIDI_NOTES_PER_OCTAVE );
sMidiNoteOut = NOTE_NAME[iDiff];
return true;
}
bool MidiNoteToOctave( int iMidiNote, int &iOctaveOut )
{
if( iMidiNote < 1 )
return false;
// middle C is start of octave 4.
int iOctave = (int)floorf( ((float)iMidiNote - MIDI_C4_NUMBER) / MIDI_NOTES_PER_OCTAVE );
iOctaveOut = iOctave + 4;
return true;
}
bool MidiNoteToStringAndOctave( int iMidiNote, RString &sMidiNoteOut )
{
if( !PitchDetectionTest::MidiNoteToString(iMidiNote, sMidiNoteOut) )
return false;
int iOctave;
if( !MidiNoteToOctave(iMidiNote, iOctave) )
return false;
sMidiNoteOut += ssprintf("%d",iOctave);
return true;
}
float PitchDetectionTest::WrapToNearestOctave( float fMidiNote, float fTargetMidiNote )
{
float fDiff = fMidiNote - fTargetMidiNote;
fDiff += MIDI_NOTES_PER_OCTAVE / 2;
wrap( fDiff, (float)MIDI_NOTES_PER_OCTAVE );
fDiff -= MIDI_NOTES_PER_OCTAVE / 2;
float fRet = fTargetMidiNote + fDiff;
return fRet;
}
void CALLBACK waveInProc(HWAVEIN hwi,UINT uMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2);
class MicrophoneImpl
{
public:
HWAVEIN m_hWaveIn;
WAVEFORMATEX m_stWFEX;
WAVEHDR m_stWHDR[MAX_BUFFERS];
DetectPitch m_dp;
HMMIO m_hOPFile;
MMIOINFO m_stmmIF;
MMCKINFO m_stckOut,m_stckOutRIFF;
static MicrophoneImpl *s_pMicrophoneImpl; // one and only for the callback function to use
void Init()
{
m_hWaveIn=NULL;
ZeroMemory(&m_stWFEX,sizeof(WAVEFORMATEX));
ZeroMemory(m_stWHDR,MAX_BUFFERS*sizeof(WAVEHDR));
s_pMicrophoneImpl = this;
}
void FillDevices()
{
WAVEINCAPS stWIC={0};
UINT nDevices=waveInGetNumDevs();
for(UINT nC1=0;nC1<nDevices;++nC1)
{
ZeroMemory(&stWIC,sizeof(WAVEINCAPS));
MMRESULT mRes=waveInGetDevCaps(nC1,&stWIC,sizeof(WAVEINCAPS));
if(mRes==0)
LOG->Trace( stWIC.szPname );
else
FAIL_M("bad");
}
}
void StartRecording()
{
OpenDevice();
m_dp.Init( SAMPLES_PER_SEC );
PrepareBuffers();
MMRESULT mRes=waveInStart(m_hWaveIn);
if(mRes!=0)
FAIL_M("bad");
}
void StopRecording()
{
CloseDevice();
}
void OpenDevice()
{
MMRESULT mRes=0;
m_stWFEX.nSamplesPerSec=SAMPLES_PER_SEC;
m_stWFEX.nChannels=1;
m_stWFEX.wBitsPerSample = 16;
m_stWFEX.wFormatTag=WAVE_FORMAT_PCM;
m_stWFEX.nBlockAlign=m_stWFEX.nChannels*m_stWFEX.wBitsPerSample/8;
m_stWFEX.nAvgBytesPerSec=m_stWFEX.nSamplesPerSec*m_stWFEX.nBlockAlign;
m_stWFEX.cbSize=sizeof(WAVEFORMATEX);
int device = 0;
WAVEINCAPS stWIC={0};
ZeroMemory(&stWIC,sizeof(WAVEINCAPS));
mRes=waveInGetDevCaps(device,&stWIC,sizeof(WAVEINCAPS));
if(mRes==0)
LOG->Trace( stWIC.szPname );
else
FAIL_M("bad");
mRes=waveInOpen(&m_hWaveIn,device,&m_stWFEX,(DWORD_PTR)waveInProc,(DWORD_PTR)this,CALLBACK_FUNCTION);
if(mRes!=MMSYSERR_NOERROR)
FAIL_M("bad");
const char *csT1 = "C:\\cvs\\stepmania\\speech-test.wav";
ZeroMemory(&m_stmmIF,sizeof(MMIOINFO));
DeleteFile((PCHAR)(LPCTSTR)csT1);
m_hOPFile=mmioOpen((PCHAR)(LPCTSTR)csT1,&m_stmmIF,MMIO_WRITE | MMIO_CREATE);
if(m_hOPFile==NULL)
FAIL_M("Can not open file...");
ZeroMemory(&m_stckOutRIFF,sizeof(MMCKINFO));
m_stckOutRIFF.fccType = mmioFOURCC('W', 'A', 'V', 'E');
mRes=mmioCreateChunk(m_hOPFile, &m_stckOutRIFF, MMIO_CREATERIFF);
if(mRes!=MMSYSERR_NOERROR)
{
FAIL_M("bad");
}
ZeroMemory(&m_stckOut,sizeof(MMCKINFO));
m_stckOut.ckid = mmioFOURCC('f', 'm', 't', ' ');
m_stckOut.cksize = sizeof(m_stWFEX);
mRes=mmioCreateChunk(m_hOPFile, &m_stckOut, 0);
if(mRes!=MMSYSERR_NOERROR)
{
FAIL_M("bad");
}
int nT1=mmioWrite(m_hOPFile, (HPSTR) &m_stWFEX, sizeof(m_stWFEX));
if(nT1!=sizeof(m_stWFEX))
{
FAIL_M("bad");
}
mRes=mmioAscend(m_hOPFile, &m_stckOut, 0);
if(mRes!=MMSYSERR_NOERROR)
{
FAIL_M("bad");
}
m_stckOut.ckid = mmioFOURCC('d', 'a', 't', 'a');
mRes=mmioCreateChunk(m_hOPFile, &m_stckOut, 0);
if(mRes!=MMSYSERR_NOERROR)
{
FAIL_M("bad");
}
}
void PrepareBuffers()
{
MMRESULT mRes=0;
for(int nT1=0;nT1<MAX_BUFFERS;++nT1)
{
int iSampleCount = SAMPLES_PER_SEC / 60; // 60 times per second
int iBufferSizeBytes = iSampleCount*sizeof(short);
m_stWHDR[nT1].lpData=(LPSTR)HeapAlloc(GetProcessHeap(),8,iBufferSizeBytes);
m_stWHDR[nT1].dwBufferLength=iBufferSizeBytes;
m_stWHDR[nT1].dwUser=nT1;
mRes=waveInPrepareHeader(m_hWaveIn,&m_stWHDR[nT1],sizeof(WAVEHDR));
if(mRes!=0)
FAIL_M("bad");
mRes=waveInAddBuffer(m_hWaveIn,&m_stWHDR[nT1],sizeof(WAVEHDR));
if(mRes!=0)
FAIL_M("bad");
}
}
void ProcessHeader(WAVEHDR * pHdr)
{
//LOG->Trace("%d",pHdr->dwUser);
if(WHDR_DONE==(WHDR_DONE &pHdr->dwFlags))
{
//LOG->Trace("Got %d bytes of data", pHdr->dwBytesRecorded );
int iSampleCount = pHdr->dwBytesRecorded / sizeof(short);
m_dp.ReadOne( (short*)pHdr->lpData, iSampleCount );
mmioWrite(m_hOPFile,pHdr->lpData,pHdr->dwBytesRecorded);
MMRESULT mRes = waveInAddBuffer(m_hWaveIn,pHdr,sizeof(WAVEHDR));
if(mRes!=0)
FAIL_M("bad");
}
}
void CloseDevice()
{
MMRESULT mRes=0;
if(m_hWaveIn)
{
UnPrepareBuffers();
mRes=waveInClose(m_hWaveIn);
}
if(m_hOPFile)
{
mRes=mmioAscend(m_hOPFile, &m_stckOut, 0);
if(mRes!=MMSYSERR_NOERROR)
{
FAIL_M("bad");
}
mRes=mmioAscend(m_hOPFile, &m_stckOutRIFF, 0);
if(mRes!=MMSYSERR_NOERROR)
{
FAIL_M("bad");
}
mmioClose(m_hOPFile,0);
m_hOPFile=NULL;
}
m_hWaveIn=NULL;
}
void UnPrepareBuffers()
{
MMRESULT mRes=0;
if(m_hWaveIn)
{
mRes=waveInStop(m_hWaveIn);
for(int nT1=0;nT1<3;++nT1)
{
if(m_stWHDR[nT1].lpData)
{
mRes=waveInUnprepareHeader(m_hWaveIn,&m_stWHDR[nT1],sizeof(WAVEHDR));
HeapFree(GetProcessHeap(),0,m_stWHDR[nT1].lpData);
ZeroMemory(&m_stWHDR[nT1],sizeof(WAVEHDR));
}
}
}
}
void GetStatus( MicrophoneStatus &out )
{
return m_dp.GetStatus( out );
}
};
MicrophoneImpl *MicrophoneImpl::s_pMicrophoneImpl = NULL;
void CALLBACK waveInProc(HWAVEIN hwi,UINT uMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2)
{
switch(uMsg)
{
case WIM_CLOSE:
break;
case WIM_DATA:
{
MicrophoneImpl::s_pMicrophoneImpl->ProcessHeader( (WAVEHDR *)dwParam1 );
}
break;
case WIM_OPEN:
break;
default:
break;
}
}
void PitchDetectionTest::Update()
{
s_pMicrophone->GetStatus( s_ms );
}
void DoPitchDetectionTest()
{
MicrophoneImpl mr;
mr.Init();
mr.StartRecording();
//srpd2(); // do f0 tracking
}
Microphone::Microphone()
{
m_pImpl = new MicrophoneImpl;
m_pImpl->Init();
m_pImpl->StartRecording();
}
Microphone::~Microphone()
{
m_pImpl->StopRecording();
SAFE_DELETE( m_pImpl );
}
void Microphone::GetStatus( MicrophoneStatus &out )
{
m_pImpl->GetStatus( out );
if( !FreqToMidiNote(out.fFreq, out.fMidiNote) )
out.fMidiNote = 0;
int iMidiNote = (int)roundf( out.fMidiNote );
if( !MidiNoteToStringAndOctave( iMidiNote, out.sMidiNote ) )
out.sMidiNote = "";
}
/*
* (c) 2007 Chris Danford
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, and/or sell copies of the Software, and to permit persons to
* whom the Software is furnished to do so, provided that the above
* copyright notice(s) and this permission notice appear in all copies of
* the Software and that both the above copyright notice(s) and this
* permission notice appear in supporting documentation.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
+62
View File
@@ -0,0 +1,62 @@
/* Microphone - */
#ifndef Microphone_H
#define Microphone_H
class MicrophoneImpl;
struct MicrophoneStatus
{
float fFreq;
float fMaxFreq;
bool bVoiced;
float fMidiNote;
RString sMidiNote;
};
class Microphone
{
public:
Microphone();
~Microphone();
void GetStatus( MicrophoneStatus &out );
protected:
MicrophoneImpl *m_pImpl;
};
class PitchDetectionTest
{
public:
static MicrophoneStatus s_ms;
static Microphone *s_pMicrophone;
static void Update();
static bool MidiNoteToString( int iMidiNote, RString &sMidiNoteOut );
static float WrapToNearestOctave( float fMidiNote, float fTargetMidiNote );
};
#endif
/*
* (c) 2004 Chris Danford
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, and/or sell copies of the Software, and to permit persons to
* whom the Software is furnished to do so, provided that the above
* copyright notice(s) and this permission notice appear in all copies of
* the Software and that both the above copyright notice(s) and this
* permission notice appear in supporting documentation.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
File diff suppressed because it is too large Load Diff
+75
View File
@@ -0,0 +1,75 @@
/* PitchDetectionTestUtil - */
#ifndef PitchDetectionTestUtil_H
#define PitchDetectionTestUtil_H
enum EST_bo_t {bo_big, bo_little, bo_perq};
static int est_endian_loc = 1;
/* Sun, HP, SGI Mips, M68000 */
#define EST_BIG_ENDIAN (((char *)&est_endian_loc)[0] == 0)
/* Intel, Alpha, DEC Mips, Vax */
#define EST_LITTLE_ENDIAN (((char *)&est_endian_loc)[0] != 0)
#define EST_NATIVE_BO (EST_BIG_ENDIAN ? bo_big : bo_little)
#define EST_SWAPPED_BO (EST_BIG_ENDIAN ? bo_little : bo_big)
#define SAMPLES_PER_SEC 44100
struct Srpd_Op;
struct SEGMENT_;
struct CROSS_CORR_;
struct STATUS_;
class RageSoundReader_FileReader;
struct MicrophoneStatus;
class DetectPitch
{
Srpd_Op *m_pSrpdOp;
SEGMENT_ *m_pSegment;
int m_iSamplesFilledInSegment; // how many samples in m_pSegment are filled
CROSS_CORR_ *m_pCC;
STATUS_ *m_pPdaStatus;
public:
DetectPitch();
~DetectPitch();
void Init(RageSoundReader_FileReader *sample);
void Init(int iSampleFreq);
int ReadOne(RageSoundReader_FileReader *sample);
int ReadOne(short *pData, int iCount);
void GetStatus( MicrophoneStatus &out );
void End();
};
#endif
/*
* (c) 2004 Chris Danford
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, and/or sell copies of the Software, and to permit persons to
* whom the Software is furnished to do so, provided that the above
* copyright notice(s) and this permission notice appear in all copies of
* the Software and that both the above copyright notice(s) and this
* permission notice appear in supporting documentation.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
+37 -4
View File
@@ -41,6 +41,9 @@
#include "GameCommand.h"
#include "LocalizedString.h"
#include "AdjustSync.h"
/* XXX
#include "PitchDetectionTest.h"
*/
// Helper class to ensure that each row is only judged once without taking too much memory.
class JudgedRows
@@ -611,7 +614,11 @@ void Player::Update( float fDeltaTime )
float fHoldJudgeYPos = SCALE( fPercentReverse, 0.f, 1.f, HOLD_JUDGMENT_Y_STANDARD, HOLD_JUDGMENT_Y_REVERSE );
// float fGrayYPos = SCALE( fPercentReverse, 0.f, 1.f, GRAY_ARROWS_Y_STANDARD, GRAY_ARROWS_Y_REVERSE );
const float fX = ArrowEffects::GetXPos( m_pPlayerState, c, 0 );
float fX = ArrowEffects::GetXPos( m_pPlayerState, c, 0 );
/* XXX
if( PitchDetectionTest::s_ms.bVoiced )
fX += ArrowEffects::GetXOffset( m_pPlayerState, m_pPlayerState->m_fWrappedMidiNote );
*/
const float fZ = ArrowEffects::GetZPos( m_pPlayerState, c, 0 );
m_vpHoldJudgment[c]->SetX( fX );
@@ -895,8 +902,22 @@ void Player::UpdateHoldNotes( int iSongRow, float fDeltaTime, vector<TrackRowTap
}
else
{
GameInput GameI = GAMESTATE->GetCurrentStyle()->StyleInputToGameInput( iTrack, pn );
bIsHoldingButton &= INPUTMAPPER->IsBeingPressed( GameI, m_pPlayerState->m_mp );
if( GAMESTATE->m_pCurGame->m_szName == RString("karaoke") )
{
int8_t iMidiNote = trtn->pTN->iMidiNote;
ASSERT( iMidiNote != MIDI_NOTE_INVALID );
/* XXX
const float fMidiNoteMaxAllowedError = 0.25;
bIsHoldingButton &=
PitchDetectionTest::s_ms.bVoiced &&
fabsf( m_pPlayerState->m_fWrappedMidiNote - iMidiNote) < fMidiNoteMaxAllowedError;
*/
}
else
{
GameInput GameI = GAMESTATE->GetCurrentStyle()->StyleInputToGameInput( iTrack, pn );
bIsHoldingButton &= INPUTMAPPER->IsBeingPressed( GameI, m_pPlayerState->m_mp );
}
}
}
@@ -2359,7 +2380,7 @@ void Player::CrossedRows( int iLastRowCrossed, const RageTimer &now )
Step( iTrack, iRow, now, false, false );
if( m_pPlayerState->m_PlayerController == PC_AUTOPLAY )
{
STATSMAN->m_CurStageStats.m_bUsedAutoplay = true;
if( m_pPlayerStageStats )
m_pPlayerStageStats->m_bDisqualified = true;
}
@@ -2433,6 +2454,18 @@ void Player::CrossedRows( int iLastRowCrossed, const RageTimer &now )
}
m_iFirstUncrossedRow = iLastRowCrossed+1;
{
// find the next note and fill in m_fUpcomingMidiNote
NoteData::all_tracks_iterator iter = m_NoteData.GetTapNoteRangeAllTracks( iLastRowCrossed+1, MAX_NOTE_ROW );
for( ; !iter.IsAtEnd(); ++iter )
{
TapNote &tn = *iter;
if( tn.iMidiNote != MIDI_NOTE_INVALID )
m_pPlayerState->m_fUpcomingMidiNote = tn.iMidiNote;
break;
}
}
}
void Player::RandomizeNotes( int iNoteRow )
+27
View File
@@ -3,6 +3,11 @@
#include "Foreach.h"
#include "GameState.h"
#include "RageLog.h"
/* XXX
#include "PitchDetectionTest.h"
*/
#include "RadarValues.h"
#include "Steps.h"
PlayerState::PlayerState()
{
@@ -22,6 +27,8 @@ void PlayerState::Reset()
m_fLastHopoNoteMusicSeconds = -1;
m_iLastHopoNoteCol = -1;
m_fUpcomingMidiNote = -1;
m_PlayerController = PC_HUMAN;
m_iCpuSkill = 5;
@@ -91,6 +98,26 @@ void PlayerState::Update( float fDelta )
if( m_fSecondsUntilAttacksPhasedOut > 0 )
m_fSecondsUntilAttacksPhasedOut = max( 0, m_fSecondsUntilAttacksPhasedOut - fDelta );
/* XXX
m_fWrappedMidiNote = -1;
if( m_fUpcomingMidiNote != -1 )
{
m_fWrappedMidiNote = PitchDetectionTest::WrapToNearestOctave( PitchDetectionTest::s_ms.fMidiNote, m_fUpcomingMidiNote );
}
else
{
Steps *pSteps = GAMESTATE->m_pCurSteps[m_PlayerNumber];
if( pSteps )
{
const RadarValues &rv = pSteps->GetRadarValues(PLAYER_1);
float fMinMidiNote = rv.m_Values.v.fMinMidiNote;
float fMaxMidiNote = rv.m_Values.v.fMaxMidiNote;
if( fMinMidiNote != -1 && fMaxMidiNote != -1 )
m_fWrappedMidiNote = PitchDetectionTest::WrapToNearestOctave( PitchDetectionTest::s_ms.fMidiNote, (fMinMidiNote+fMaxMidiNote)/2 );
}
}
*/
}
void PlayerState::ResetToDefaultPlayerOptions( ModsLevel l )
+3
View File
@@ -39,6 +39,9 @@ public:
float m_fLastHopoNoteMusicSeconds; // Set to the MusicSeconds of the last note successfully strummed or hammered in a hopochain, -1, then there is no current hopo chain
int m_iLastHopoNoteCol; // if -1, then there is no current hopo chain
float m_fUpcomingMidiNote;
float m_fWrappedMidiNote;
void ClearHopoState()
{
m_fLastHopoNoteMusicSeconds = -1;
+2
View File
@@ -28,6 +28,8 @@ struct RadarValues
float fNumMines;
float fNumHands;
float fNumRolls;
float fMinMidiNote;
float fMaxMidiNote;
} v;
float f[NUM_RadarCategory];
} m_Values;
+12 -1
View File
@@ -6,6 +6,9 @@
#include "GameState.h"
#include "PlayerState.h"
#include "Style.h"
/* XXX
#include "PitchDetectionTest.h"
*/
ReceptorArrowRow::ReceptorArrowRow()
@@ -50,13 +53,21 @@ void ReceptorArrowRow::Update( float fDeltaTime )
m_ReceptorArrow[c]->SetBaseAlpha( fBaseAlpha );
// set arrow XYZ
const float fX = ArrowEffects::GetXPos( m_pPlayerState, c, 0 );
float fX = ArrowEffects::GetXPos( m_pPlayerState, c, 0 );
/* XXX
if( PitchDetectionTest::s_ms.bVoiced )
fX += ArrowEffects::GetXOffset( m_pPlayerState, m_pPlayerState->m_fWrappedMidiNote );
*/
const float fY = ArrowEffects::GetYPos( m_pPlayerState, c, 0, m_fYReverseOffsetPixels );
const float fZ = ArrowEffects::GetZPos( m_pPlayerState, c, 0 );
m_ReceptorArrow[c]->SetX( fX );
m_ReceptorArrow[c]->SetY( fY );
m_ReceptorArrow[c]->SetZ( fZ );
/* XXX
m_ReceptorArrow[c]->SetVisible( PitchDetectionTest::s_ms.bVoiced );
*/
const float fZoom = ArrowEffects::GetZoom( m_pPlayerState );
m_ReceptorArrow[c]->SetZoom( fZoom );
}
+27
View File
@@ -35,6 +35,9 @@
#include "ThemeMetric.h"
#include "Game.h"
#include "RageSoundReader.h"
/* XXX
#include "PitchDetectionTest.h"
*/
static Preference<float> g_iDefaultRecordLength( "DefaultRecordLength", 4 );
static Preference<bool> g_bEditorShowBGChangesPlay( "EditorShowBGChangesPlay", false );
@@ -257,6 +260,9 @@ void ScreenEdit::InitEditMappings()
m_EditMappingsDeviceInput.button[EDIT_BUTTON_SNAP_NEXT][0] = DeviceInput(DEVICE_KEYBOARD, KEY_LEFT);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_SNAP_PREV][0] = DeviceInput(DEVICE_KEYBOARD, KEY_RIGHT);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_MIDI_NOTE_NEXT][0] = DeviceInput(DEVICE_KEYBOARD, KEY_EQUAL);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_MIDI_NOTE_PREV][0] = DeviceInput(DEVICE_KEYBOARD, KEY_HYPHEN);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_OPEN_EDIT_MENU][0] = DeviceInput(DEVICE_KEYBOARD, KEY_ESC);
m_EditMappingsMenuButton.button[EDIT_BUTTON_OPEN_EDIT_MENU][0] = MENU_BUTTON_START;
m_EditMappingsMenuButton.button[EDIT_BUTTON_OPEN_EDIT_MENU][1] = MENU_BUTTON_BACK;
@@ -1024,6 +1030,13 @@ void ScreenEdit::UpdateTextInfo()
sText += " ...\n";
}
RString sMidiNote;
/* XXX
if( !PitchDetectionTest::MidiNoteToString( GAMESTATE->m_iEditMidiNote, sMidiNote ) )
sMidiNote = "";
*/
sText += ssprintf( "%s:\n %i (%s)\n", "Pitch", (int)GAMESTATE->m_iEditMidiNote, sMidiNote.c_str() );
switch( EDIT_MODE.GetValue() )
{
DEFAULT_FAIL( EDIT_MODE.GetValue() );
@@ -1361,6 +1374,20 @@ void ScreenEdit::InputEdit( const InputEventPlus &input, EditButton EditB )
if( m_SnapDisplay.NextSnapMode() )
OnSnapModeChange();
break;
case EDIT_BUTTON_MIDI_NOTE_NEXT:
if( GAMESTATE->m_iEditMidiNote < NUM_MIDI_NOTES-1 )
{
GAMESTATE->m_iEditMidiNote++;
m_soundValueIncrease.Play();
}
break;
case EDIT_BUTTON_MIDI_NOTE_PREV:
if( GAMESTATE->m_iEditMidiNote > 0 )
{
GAMESTATE->m_iEditMidiNote--;
m_soundValueDecrease.Play();
}
break;
case EDIT_BUTTON_LAY_SELECT:
{
const int iCurrentRow = BeatToNoteRow(GAMESTATE->m_fSongBeat);
+3
View File
@@ -76,6 +76,9 @@ enum EditButton
EDIT_BUTTON_SNAP_NEXT,
EDIT_BUTTON_SNAP_PREV,
EDIT_BUTTON_MIDI_NOTE_NEXT,
EDIT_BUTTON_MIDI_NOTE_PREV,
EDIT_BUTTON_OPEN_EDIT_MENU,
EDIT_BUTTON_OPEN_AREA_MENU,
EDIT_BUTTON_OPEN_BGCHANGE_LAYER1_MENU,
+31
View File
@@ -12,6 +12,7 @@
#include "ScreenDimensions.h"
#include "ThemeMetric.h"
#include "LocalizedString.h"
#include "PlayerState.h"
namespace
{
@@ -160,6 +161,36 @@ void ScreenSystemLayer::Init()
m_sprOverlay.Load( THEME->GetPathB("ScreenSystemLayer", "overlay") );
this->AddChild( m_sprOverlay );
/* XXX
m_quadMicBar.SetXY( SCREEN_CENTER_X, SCREEN_CENTER_Y );
m_quadMicBar.ZoomToWidth( 4 );
m_quadMicBar.ZoomToHeight( 400 );
this->AddChild( &m_quadMicBar );
m_quadMicPos.SetXY( SCREEN_CENTER_X, SCREEN_CENTER_Y );
m_quadMicPos.ZoomToWidth( 12 );
m_quadMicPos.ZoomToHeight( 12 );
this->AddChild( &m_quadMicPos );
m_textFreq.LoadFromFont( THEME->GetPathF("Common","Normal") );
m_textFreq.SetXY( SCREEN_CENTER_X+100, SCREEN_CENTER_Y );
this->AddChild( &m_textFreq );
*/
}
void ScreenSystemLayer::Update( float fDelta )
{
Screen::Update( fDelta );
/* XXX
const MicrophoneStatus &ms = PitchDetectionTest::s_ms;
float fYOffset = SCALE( ms.fFreq, 0.0, ms.fMaxFreq, 200, -200 );
m_quadMicPos.SetY( SCREEN_CENTER_Y + fYOffset );
m_quadMicPos.SetVisible( ms.bVoiced );
PlayerState *pPS = GAMESTATE->m_pPlayerState[PLAYER_1];
m_textFreq.SetText( ssprintf("%.3f\n%.3f\n%.3f (wrapped)\n%s", ms.fFreq, ms.fMidiNote, pPS->m_fWrappedMidiNote, ms.sMidiNote.c_str() ) );
*/
}
/*
+12
View File
@@ -5,14 +5,26 @@
#include "Screen.h"
#include "AutoActor.h"
/* XXX
#include "PitchDetectionTest.h"
#include "Quad.h"
#include "BitmapText.h"
*/
class ScreenSystemLayer : public Screen
{
public:
virtual void Init();
virtual void Update( float fDelta );
private:
AutoActor m_sprOverlay;
/* XXX
Quad m_quadMicBar;
Quad m_quadMicPos;
BitmapText m_textFreq;
*/
};
+1 -1
View File
@@ -25,7 +25,7 @@
Name="VCCLCompilerTool"
AdditionalOptions="/EHa"
Optimization="0"
AdditionalIncludeDirectories=".;vorbis;libjpeg;&quot;ffmpeg\include&quot;"
AdditionalIncludeDirectories=".;vorbis;libjpeg;&quot;ffmpeg\include&quot;;est"
PreprocessorDefinitions="WIN32,_DEBUG,_WINDOWS,WINDOWS,DEBUG"
ExceptionHandling="FALSE"
BasicRuntimeChecks="3"
+7
View File
@@ -282,6 +282,13 @@ void Steps::Compress() const
return;
}
/* Always leave karaoke data uncompressed. */
if( this->m_StepsType == STEPS_TYPE_KARAOKE_SINGLE && m_bNoteDataIsFilled )
{
m_sNoteDataCompressed = RString();
return;
}
if( !m_sFilename.empty() && m_LoadedFromProfile == ProfileSlot_Invalid )
{
/*
+289
View File
@@ -0,0 +1,289 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996,1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/************************************************************************/
#ifndef __EST_CHANNELTYPE_H__
#define __EST_CHANNELTYPE_H__
/**@name Channel Types
*/
//@{
/** Symbolic names for coefficient types.
*
* Used to record what kinds of information are in a track and
* anywhere else we need to refer to coefficient types.
*
* @see EST_ChannelType
*/
enum EST_CoefficientType
{
/// Linear prediction filter
cot_lpc=0,
/// guaranteed to be the first known type
cot_first=cot_lpc,
/// reflection coefficients.
cot_reflection,
/// Cepstral coefficients
cot_cepstrum,
/// Mel Scale Cepstrum
cot_melcepstrum,
/// Mel Scale filter bank
cot_fbank,
/// Line spectral pairs.
cot_lsf,
/// Tube areas for filter.
cot_tubearea,
/// Unknown filter type.
cot_filter,
/// Free for experimentation
cot_user1,
/// Free for experimentation
cot_user2,
/// Guaranteed to be one more than last legal coefficient type
cot_free
};
/**@name Channel Type Numbering Scheme
*
* Channel types are given numbers containing the following information:
* \begin{itemize}
* \item A numeric index.
* \item A Number of differentiations 0-2
* \item 0 for start, 1 for end
* \end{itemize}
* Things which do not require all these features are packed in according
* to the following rules:
* \begin{itemize}
* \item Single values which can be differentiated are paired as
* if they were start and end positions of an unknown type
* of coefficient.
* \item Single values which can't be differentiated are put in the
* positions where the 3rd derivatives would logically be
* found.
* \end{itemize}
*/
//@{
/// extract the coefficient type
#define EST_ChannelTypeCT(T) ( (T) >> 3 )
/// extract the number of differentiations
#define EST_ChannelTypeD(T) ( (T) >> 1 & 3 )
/// extract the start/end flag.
#define EST_ChannelTypeSE(T) ( (T) & 1 )
/// get start from end
#define EST_ChannelTypeStart(T) EST_CoefChannelId(\
EST_ChannelTypeCT(T), \
EST_ChannelTypeD(T), \
0)
/// get end from start
#define EST_ChannelTypeEnd(T) EST_CoefChannelId(\
EST_ChannelTypeCT(T), \
EST_ChannelTypeD(T), \
1)
/// differentiate once
#define EST_ChannelTypeIncD(T) EST_CoefChannelId(\
EST_ChannelTypeCT(T), \
EST_ChannelTypeD(T)+1, \
EST_ChannelTypeSE(T))
/// differentiate N times
#define EST_ChannelTypeDelta(T, N) EST_CoefChannelId(\
EST_ChannelTypeCT(T), \
EST_ChannelTypeD(T)+(N), \
EST_ChannelTypeSE(T))
/// integrate once
#define EST_ChannelTypeDecD(T) EST_CoefChannelId(\
EST_ChannelTypeCT(T), \
EST_ChannelTypeD(T)-1, \
EST_ChannelTypeSE(T))
/** Build a number representing a channel type for a coefficient type.
*
* CT = coefficient type
* D = Number of levels of differentiation.
* SE = Start=0 end=1
*/
#define EST_CoefChannelId(CT,D,SE) ( (CT)<<3 | (D)<<1 & 6 | (SE)&1 )
/** Build a number representing a channel type for a single value which can
* N = count starting from 0
* D = Number of levels of differentiation.
* be differentiated.
*/
#define EST_DiffChannelId(N,D) ( EST_CoefChannelId(((N)>>1)+(int)cot_free, D, (N)&1) )
/** Build a number representing a channel type for a simple value
* such as length or voicing probability.
*/
#define EST_ChannelId(N) EST_CoefChannelId((N)>>1, 3, (N)&1)
//@}
/** Symbolic names for track channels.
* Used in track maps to label channels so they can be accessed without
* knowing exactly where in the track they are.
*
* @see EST_CoefficientType
* @see EST_TrackMap
* @see EST_Track
* @see EST_TrackMap:example
* @author Richard Caley <rjc@cstr.ed.ac.uk>
* @version $Id: EST_ChannelType.h,v 1.3 2004/05/04 00:00:16 awb Exp $
*/
enum EST_ChannelType {
/// Value to return for errors, never occurs in TrackMaps
channel_unknown = EST_ChannelId(0),
/// order of analysis.
channel_order = EST_ChannelId(1),
/// So we know how many there are
first_channel_type=channel_order,
/// Peak amplitude.
channel_peak = EST_ChannelId(2),
/// Duration of section of signal.
channel_duration = EST_ChannelId(3),
/// Length of section in samples.
channel_length = EST_ChannelId(4),
/// Offset from frame center to center of window
channel_offset = EST_ChannelId(5),
/// Voicing decision.
channel_voiced = EST_ChannelId(6),
/// Number of related frame in another track.
channel_frame = EST_ChannelId(7),
/// Time in seconds this frame refers to.
channel_time = EST_ChannelId(8),
/// RMS power of section of signal.
channel_power = EST_DiffChannelId(0,0),
channel_power_d = EST_DiffChannelId(0,1),
channel_power_a = EST_DiffChannelId(0,2),
/// RMS energy of section of signal.
channel_energy = EST_DiffChannelId(1,0),
channel_energy_d = EST_DiffChannelId(1,1),
channel_energy_a = EST_DiffChannelId(1,2),
/// F0 in Hz.
channel_f0 = EST_DiffChannelId(2,0),
channel_f0_d = EST_DiffChannelId(2,1),
channel_f0_a = EST_DiffChannelId(2,2),
channel_lpc_0 = EST_CoefChannelId(cot_lpc,0,0),
channel_lpc_N = EST_CoefChannelId(cot_lpc,0,1),
channel_lpc_d_0 = EST_CoefChannelId(cot_lpc,1,0),
channel_lpc_d_N = EST_CoefChannelId(cot_lpc,1,1),
channel_lpc_a_0 = EST_CoefChannelId(cot_lpc,2,0),
channel_lpc_a_N = EST_CoefChannelId(cot_lpc,2,1),
channel_reflection_0 = EST_CoefChannelId(cot_reflection,0,0),
channel_reflection_N = EST_CoefChannelId(cot_reflection,0,1),
channel_reflection_d_0 = EST_CoefChannelId(cot_reflection,1,0),
channel_reflection_d_N = EST_CoefChannelId(cot_reflection,1,1),
channel_reflection_a_0 = EST_CoefChannelId(cot_reflection,2,0),
channel_reflection_a_N = EST_CoefChannelId(cot_reflection,2,1),
channel_cepstrum_0 = EST_CoefChannelId(cot_cepstrum,0,0),
channel_cepstrum_N = EST_CoefChannelId(cot_cepstrum,0,1),
channel_cepstrum_d_0 = EST_CoefChannelId(cot_cepstrum,1,0),
channel_cepstrum_d_N = EST_CoefChannelId(cot_cepstrum,1,1),
channel_cepstrum_a_0 = EST_CoefChannelId(cot_cepstrum,2,0),
channel_cepstrum_a_N = EST_CoefChannelId(cot_cepstrum,2,1),
channel_melcepstrum_0 = EST_CoefChannelId(cot_melcepstrum,0,0),
channel_melcepstrum_N = EST_CoefChannelId(cot_melcepstrum,0,1),
channel_melcepstrum_d_0 = EST_CoefChannelId(cot_melcepstrum,1,0),
channel_melcepstrum_d_N = EST_CoefChannelId(cot_melcepstrum,1,1),
channel_melcepstrum_a_0 = EST_CoefChannelId(cot_melcepstrum,2,0),
channel_melcepstrum_a_N = EST_CoefChannelId(cot_melcepstrum,2,1),
channel_fbank_0 = EST_CoefChannelId(cot_fbank,0,0),
channel_fbank_N = EST_CoefChannelId(cot_fbank,0,1),
channel_fbank_d_0 = EST_CoefChannelId(cot_fbank,1,0),
channel_fbank_d_N = EST_CoefChannelId(cot_fbank,1,1),
channel_fbank_a_0 = EST_CoefChannelId(cot_fbank,2,0),
channel_fbank_a_N = EST_CoefChannelId(cot_fbank,2,1),
channel_lsf_0 = EST_CoefChannelId(cot_lsf,0,0),
channel_lsf_N = EST_CoefChannelId(cot_lsf,0,1),
channel_lsf_d_0 = EST_CoefChannelId(cot_lsf,1,0),
channel_lsf_d_N = EST_CoefChannelId(cot_lsf,1,1),
channel_lsf_a_0 = EST_CoefChannelId(cot_lsf,2,0),
channel_lsf_a_N = EST_CoefChannelId(cot_lsf,2,1),
channel_tubearea_0 = EST_CoefChannelId(cot_tubearea,0,0),
channel_tubearea_N = EST_CoefChannelId(cot_tubearea,0,1),
channel_tubearea_d_0 = EST_CoefChannelId(cot_tubearea,1,0),
channel_tubearea_d_N = EST_CoefChannelId(cot_tubearea,1,1),
channel_tubearea_a_0 = EST_CoefChannelId(cot_tubearea,2,0),
channel_tubearea_a_N = EST_CoefChannelId(cot_tubearea,2,1),
channel_filter_0 = EST_CoefChannelId(cot_filter,0,0),
channel_filter_N = EST_CoefChannelId(cot_filter,0,1),
channel_filter_d_0 = EST_CoefChannelId(cot_filter,1,0),
channel_filter_d_N = EST_CoefChannelId(cot_filter,1,1),
channel_filter_a_0 = EST_CoefChannelId(cot_filter,2,0),
channel_filter_a_N = EST_CoefChannelId(cot_filter,2,1),
channel_user1_0 = EST_CoefChannelId(cot_user1,0,0),
channel_user1_N = EST_CoefChannelId(cot_user1,0,1),
channel_user1_d_0 = EST_CoefChannelId(cot_user1,1,0),
channel_user1_d_N = EST_CoefChannelId(cot_user1,1,1),
channel_user1_a_0 = EST_CoefChannelId(cot_user1,2,0),
channel_user1_a_N = EST_CoefChannelId(cot_user1,2,1),
channel_user2_0 = EST_CoefChannelId(cot_user2,0,0),
channel_user2_N = EST_CoefChannelId(cot_user2,0,1),
channel_user2_d_0 = EST_CoefChannelId(cot_user2,1,0),
channel_user2_d_N = EST_CoefChannelId(cot_user2,1,1),
channel_user2_a_0 = EST_CoefChannelId(cot_user2,2,0),
channel_user2_a_N = EST_CoefChannelId(cot_user2,2,1),
last_channel_type = channel_f0_a,
/// Can be used to size arrays etc.
num_channel_types
};
//@}
typedef enum EST_ChannelType EST_ChannelType;
#endif
+251
View File
@@ -0,0 +1,251 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/************************************************************************/
/* */
/* Author: Richard Caley (rjc@cstr.ed.ac.uk) */
/* Date: February 1997 */
/* -------------------------------------------------------------------- */
/* */
/* Use counted memory chunks and smart pointers to them. */
/* */
/************************************************************************/
#if ! defined(__EST_CHUNK_H__)
#define __EST_CHUNK_H__
#ifdef HAVE_CONFIG_H
# include "est_string_config.h"
#else
# define HAVE_WALLOC_H (1)
#endif
#include <iostream>
#include <limits.h>
#include <sys/types.h>
// Warn when getting a writable version of a shared chunk --
// useful for minimising copies.
#define __INCLUDE_CHUNK_WARNINGS__ (1)
#if defined(__INCULDE_CHUNK_WARNINGS__)
# define CHUNK_WARN(WHAT) do { cerr << "chunk: " <<WHAT << "\n";} while (0)
#else
# define CHUNK_WARN(WHAT) // empty
#endif
#define __CHUNK_INLINE_AGGRESSIVELY__ (1)
#if defined(__CHUNK_INLINE_AGGRESSIVELY__)
# define CII(BODY) BODY
#else
# define CII(BODY) /* empty */
#endif
#define __CHUNK_USE_WALLOC__ (1)
#if __CHUNK_USE_WALLOC__
#if HAVE_WALLOC_H
# include "EST_walloc.h"
#else
# define walloc(T,N) ((T *)malloc(sizeof(T)*(N)))
# define wfree(P) free(P)
# define wrealloc(P,T,N) ((T *)realloc((P),sizeof(T)*(N)))
#endif
#endif
/************************************************************************/
/* */
/* EST_Chunk is a use-counted chunk of memory. You shouldn't be able */
/* to do anything to it except create it and manipulate it via */
/* EST_ChunkPtr. The private operator::new takes a placement argument */
/* which is actually the number of bytes of memory in the body of the */
/* chunk. */
/* */
/* If the use counter overflows, it sticks. Anything with more than */
/* SHRT_MAX references to it is probably permanent. */
/* */
/************************************************************************/
class EST_Chunk {
public:
typedef unsigned short use_counter;
# define MAX_CHUNK_COUNT (USHRT_MAX)
typedef int EST_chunk_size;
# define MAX_CHUNK_SIZE (INT_MAX)
private:
use_counter count;
EST_chunk_size size;
char memory[1];
EST_Chunk(void);
~EST_Chunk();
EST_Chunk *operator & ();
void *operator new (size_t size, int bytes);
void operator delete (void *it);
void operator ++ () CII({if (count < MAX_CHUNK_COUNT) ++count;});
void operator -- () CII({if (count < MAX_CHUNK_COUNT) if (--count == 0) delete this;});
public:
friend class EST_ChunkPtr;
friend EST_ChunkPtr chunk_allocate(int bytes);
friend EST_ChunkPtr chunk_allocate(int bytes, const char *initial, int initial_len);
friend EST_ChunkPtr chunk_allocate(int bytes, const EST_ChunkPtr &initial, int initial_start, int initial_len);
friend void make_updatable(EST_ChunkPtr &shared, EST_chunk_size inuse);
friend void make_updatable(EST_ChunkPtr &shared);
friend void grow_chunk(EST_ChunkPtr &shared, EST_chunk_size inuse, EST_chunk_size newsize);
friend void grow_chunk(EST_ChunkPtr &shared, EST_chunk_size newsize);
friend ostream &operator << (ostream &s, const EST_Chunk &chp);
friend void tester(void);
};
/************************************************************************/
/* */
/* Pointers to chunks. Initialising them and assigning them around */
/* keeps track of use counts. We allow them to be cast to char * as a */
/* way of letting people work on them with standard functions, */
/* however it is bad voodoo to hold on to such a cast chunk for more */
/* than a trivial amount of time. */
/* */
/************************************************************************/
class EST_ChunkPtr {
private:
EST_Chunk *ptr;
EST_ChunkPtr(EST_Chunk *chp) CII({
if ((ptr=chp))
++ *ptr;
});
public:
EST_ChunkPtr(void) { ptr = (EST_Chunk *)NULL; };
EST_ChunkPtr(const EST_ChunkPtr &cp) CII({
ptr=cp.ptr;
if (ptr)
++ *ptr;
});
~EST_ChunkPtr(void) CII({
if (ptr)
-- *ptr;
});
int size(void) const { return ptr?ptr->size:0; };
int shareing(void) const { return ptr?(ptr->count >1):0; };
int count(void) const { return ptr?(ptr->count):-1; };
EST_ChunkPtr &operator = (EST_ChunkPtr cp) CII({
// doing it in this order means self assignment is safe.
if (cp.ptr)
++ *(cp.ptr);
if (ptr)
-- *ptr;
ptr=cp.ptr;
return *this;
});
// If they manage to get hold of one...
// Actually usually used to assign NULL and so (possibly) deallocate
// the chunk currently pointed to.
EST_ChunkPtr &operator = (EST_Chunk *chp) CII({
// doing it in this order means self assignment is safe.
if (chp)
++ *chp;
if (ptr)
-- *ptr;
ptr=chp;
return *this;
});
// Casting to a non-const pointer causes a
// warning to stderr if the chunk is shared.
operator char*() CII({
if (ptr && ptr->count > 1)
{
CHUNK_WARN("getting writable version of shared chunk\n");
make_updatable(*this);
}
return ptr?&(ptr->memory[0]):(char *)NULL;
});
operator const char*() const CII({
return ptr?&(ptr->memory[0]):(const char *)NULL;
});
operator const char*() CII({
return ptr?&(ptr->memory[0]):(const char *)NULL;
});
const char operator [] (int i) const { return ptr->memory[i]; };
char &operator () (int i) CII({
if (ptr->count>1)
{
CHUNK_WARN("getting writable version of shared chunk\n");
make_updatable(*this);
}
return ptr->memory[i];
});
// Creating a new one
friend EST_ChunkPtr chunk_allocate(int size);
friend EST_ChunkPtr chunk_allocate(int bytes, const char *initial, int initial_len);
friend EST_ChunkPtr chunk_allocate(int bytes, const EST_ChunkPtr &initial, int initial_start, int initial_len);
// Make sure the memory isn`t shared.
friend void make_updatable(EST_ChunkPtr &shared, EST_Chunk::EST_chunk_size inuse);
friend void make_updatable(EST_ChunkPtr &shared);
// Make sure there is enough room (also makes updatable)
friend void grow_chunk(EST_ChunkPtr &shared, EST_Chunk::EST_chunk_size inuse, EST_Chunk::EST_chunk_size newsize);
friend void grow_chunk(EST_ChunkPtr &shared, EST_Chunk::EST_chunk_size newsize);
// we print it by just printing the chunk
friend ostream &operator << (ostream &s, const EST_ChunkPtr &cp) { return (s<< *cp.ptr); };
friend void tester(void);
};
#endif
+98
View File
@@ -0,0 +1,98 @@
/*************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1995,1996 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* Author : Alan W Black */
/* Date : May 1996 */
/*-----------------------------------------------------------------------*/
/* A class for representing ints floats and strings */
/* */
/*=======================================================================*/
#ifndef __EST_CONTENTS_H__
#define __EST_CONTENTS_H__
/** A class for containing some other (arbitrary) class
Not general enough to call itself a run-time type system
Is designed to solve the problem of holding user
specified information.
Keeps reference count to know when to delete contents
This is done on two levels EST_Contents and Contents_Data
*/
class EST_Content_Data{
private:
int refs;
void *data;
void (*free_func)(void *data);
public:
EST_Content_Data(void *d,void (*f)(void *d)) {free_func=f; data=d; refs=1;}
~EST_Content_Data() { free_func(data); }
///
int unref() { return --refs; }
///
int ref() { return ++refs; }
///
int the_refs() { return refs; }
void *contents() { return data; }
EST_Content_Data &operator=(const EST_Content_Data &c)
{refs = c.refs; data = c.data; free_func = free_func; return *this;}
};
/** More contents */
class EST_Contents{
private:
EST_Content_Data *content_data;
void unref_contents(void)
{ if ((content_data != 0) &&
(content_data->unref() == 0))
delete content_data;}
public:
EST_Contents() { content_data = 0; }
EST_Contents(void *p,void (*free_func)(void *p))
{ content_data = new EST_Content_Data(p,free_func); }
~EST_Contents() { unref_contents(); }
void set_contents(void *p,void (*free_func)(void *p))
{ unref_contents(); content_data = new EST_Content_Data(p,free_func);}
void *get_contents() const
{return (content_data ? content_data->contents() : 0);}
///
int refs() const { return ((content_data == 0) ? 0 :
content_data->the_refs());}
EST_Contents &operator=(const EST_Contents &c)
{ unref_contents();
content_data = c.content_data;
if (content_data != 0) content_data->ref();
return *this; }
};
#endif
+237
View File
@@ -0,0 +1,237 @@
/*************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* */
/* Author : Simon King */
/* Date : February 1999 */
/* --------------------------------------------------------------------- */
/* Double matrix class - copied from FMatrix ! */
/* */
/*************************************************************************/
#ifndef __DMatrix_H__
#define __DMatrix_H__
#include "EST_TSimpleMatrix.h"
#include "EST_TSimpleVector.h"
#include "EST_FMatrix.h"
class EST_DVector;
/** A matrix class for double precision floating point numbers.
EST_DMatrix x should be used instead of double **x wherever
possible.*/
class EST_DMatrix : public EST_TSimpleMatrix<double> {
private:
public:
/// size constructor
EST_DMatrix(int m, int n):EST_TSimpleMatrix<double>(m, n) {}
/// copy constructor
EST_DMatrix(const EST_DMatrix &a):EST_TSimpleMatrix<double>(a) {}
static EST_String default_file_type;
/// CHECK - what does this do???
EST_DMatrix(const EST_DMatrix &a, int b);
/// default constructor
EST_DMatrix():EST_TSimpleMatrix<double>() {}
/// Save in file (ascii or binary)
EST_write_status save(const EST_String &filename,
const EST_String &type =
EST_DMatrix::default_file_type);
/// Load from file (ascii or binary as defined in file)
EST_read_status load(const EST_String &filename);
/// Save in file in est format
EST_write_status est_save(const EST_String &filename,
const EST_String &type);
/// Load from file in est format (binary/ascii defined in file itself)
EST_read_status est_load(const EST_String &filename);
/// Copy 2-d array {\tt x} of size {\tt rows x cols} into matrix.
void copyin(double **x, int rows, int cols);
/// Add elements of 2 same sized matrices.
EST_DMatrix &operator+=(const EST_DMatrix &a);
/// Subtract elements of 2 same sized matrices.
EST_DMatrix &operator-=(const EST_DMatrix &a);
/// elementwise multiply by scalar
EST_DMatrix &operator*=(const double f);
/// elementwise divide by scalar
EST_DMatrix &operator/=(const double f);
/// Multiply all elements of matrix by {\tt x}.
friend EST_DMatrix operator*(const EST_DMatrix &a, const double x);
/// Multiply matrix by vector.
friend EST_DVector operator*(const EST_DMatrix &a, const EST_DVector &v);
/// Multiply vector by matrix
friend EST_DVector operator*(const EST_DVector &v,const EST_DMatrix &a);
/// Multiply matrix by matrix.
friend EST_DMatrix operator*(const EST_DMatrix &a, const EST_DMatrix &b);
};
/** A vector class for double precision floating point
numbers. {\tt EST_DVector x} should be used instead of
{\tt float *x} wherever possible.
*/
class EST_DVector: public EST_TSimpleVector<double> {
public:
/// Size constructor.
EST_DVector(int n): EST_TSimpleVector<double>(n) {}
/// Copy constructor.
EST_DVector(const EST_DVector &a): EST_TSimpleVector<double>(a) {}
/// Default constructor.
EST_DVector(): EST_TSimpleVector<double>() {}
/// elementwise multiply
EST_DVector &operator*=(const EST_DVector &s);
/// elementwise add
EST_DVector &operator+=(const EST_DVector &s);
/// elementwise multiply by scalar
EST_DVector &operator*=(const double d);
/// elementwise divide by scalar
EST_DVector &operator/=(const double d);
EST_write_status est_save(const EST_String &filename,
const EST_String &type);
/// save vector to file <tt> filename</tt>.
EST_write_status save(const EST_String &filename,
const EST_String &type);
/// load vector from file <tt> filename</tt>.
EST_read_status load(const EST_String &filename);
/// Load from file in est format (binary/ascii defined in file itself)
EST_read_status est_load(const EST_String &filename);
};
int square(const EST_DMatrix &a);
/// inverse
int inverse(const EST_DMatrix &a, EST_DMatrix &inv);
int inverse(const EST_DMatrix &a, EST_DMatrix &inv, int &singularity);
/// pseudo inverse (for non-square matrices)
int pseudo_inverse(const EST_DMatrix &a, EST_DMatrix &inv);
int pseudo_inverse(const EST_DMatrix &a, EST_DMatrix &inv,int &singularity);
/// some useful matrix creators
/// make an identity matrix of dimension n
void eye(EST_DMatrix &a, const int n);
/// make already square matrix into I without resizing
void eye(EST_DMatrix &a);
/// the user should use est_seed to seed the random number generator
void est_seed();
void est_seed48();
/// all elements are randomised
void make_random_vector(EST_DVector &M, const double scale);
/// all elements are randomised
void make_random_matrix(EST_DMatrix &M, const double scale);
/// used for variance
void make_random_diagonal_matrix(EST_DMatrix &M, const double scale);
/// used for covariance
void make_random_symmetric_matrix(EST_DMatrix &M, const double scale);
void make_poly_basis_function(EST_DMatrix &T, EST_DVector t);
/// elementwise add
EST_DVector add(const EST_DVector &a,const EST_DVector &b);
/// elementwise subtract
EST_DVector subtract(const EST_DVector &a,const EST_DVector &b);
/// enforce symmetry
void symmetrize(EST_DMatrix &a);
/// stack columns on top of each other to make a vector
void stack_matrix(const EST_DMatrix &M, EST_DVector &v);
/// inplace diagonalise
void inplace_diagonalise(EST_DMatrix &a);
double determinant(const EST_DMatrix &a);
/// not implemented ??
int singular(EST_DMatrix &a);
/// exchange rows and columns
void transpose(const EST_DMatrix &a,EST_DMatrix &b);
EST_DMatrix triangulate(const EST_DMatrix &a);
/// extract leading diagonal as a matrix
EST_DMatrix diagonalise(const EST_DMatrix &a);
/// extract leading diagonal as a vector
EST_DVector diagonal(const EST_DMatrix &a);
/// sum of elements
double sum(const EST_DMatrix &a);
void multiply(const EST_DMatrix &a, const EST_DMatrix &b, EST_DMatrix &c);
int floor_matrix(EST_DMatrix &M, const double floor);
/// matrix product of two vectors (#rows = length of first vector, #cols = length of second vector)
EST_DMatrix cov_prod(const EST_DVector &v1,const EST_DVector &v2);
EST_DMatrix operator*(const EST_DMatrix &a, const EST_DMatrix &b);
EST_DMatrix operator-(const EST_DMatrix &a, const EST_DMatrix &b);
EST_DMatrix operator+(const EST_DMatrix &a, const EST_DMatrix &b);
EST_DVector operator-(const EST_DVector &a, const EST_DVector &b);
EST_DVector operator+(const EST_DVector &a, const EST_DVector &b);
EST_DMatrix sub(const EST_DMatrix &a, int row, int col);
EST_DMatrix DMatrix_abs(const EST_DMatrix &a);
EST_DMatrix row(const EST_DMatrix &a, int row);
EST_DMatrix column(const EST_DMatrix &a, int col);
/// least squares fit
bool
polynomial_fit(EST_DVector &x, EST_DVector &y, EST_DVector &co_effs, int order);
/// weighted least squares fit
bool
polynomial_fit(EST_DVector &x, EST_DVector &y, EST_DVector &co_effs,
EST_DVector &weights, int order);
double
polynomial_value(const EST_DVector &coeffs, const double x);
/// vector dot product
double operator*(const EST_DVector &v1, const EST_DVector &v2);
#endif
+246
View File
@@ -0,0 +1,246 @@
/*************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* */
/* Author : Paul Taylor */
/* Date : April 1996 */
/* --------------------------------------------------------------------- */
/* Matrix class */
/* */
/*************************************************************************/
#ifndef __FMatrix_H__
#define __FMatrix_H__
#include "EST_TSimpleMatrix.h"
#include "EST_TSimpleVector.h"
#include "EST_Val.h"
#include "EST_Val_defs.h"
class EST_FVector;
/** A matrix class for floating point numbers. EST_FMatrix x should be
used instead of float **x wherever possible.
*/
class EST_FMatrix : public EST_TSimpleMatrix<float> {
private:
public:
/// size constructor
EST_FMatrix(int m, int n):EST_TSimpleMatrix<float>(m, n) {}
/// copy constructor
EST_FMatrix(const EST_FMatrix &a):EST_TSimpleMatrix<float>(a) {}
static EST_String default_file_type;
/// CHECK - what does this do???
EST_FMatrix(const EST_FMatrix &a, int b);
/// default constructor
EST_FMatrix():EST_TSimpleMatrix<float>() {}
/// Save in file (ascii or binary)
EST_write_status save(const EST_String &filename,
const EST_String &type =
EST_FMatrix::default_file_type );
/// Load from file (ascii or binary as defined in file)
EST_read_status load(const EST_String &filename);
/// Save in file in est format
EST_write_status est_save(const EST_String &filename,
const EST_String &type);
/// Load from file in est format (binary/ascii defined in file itself)
EST_read_status est_load(const EST_String &filename);
/// Copy 2-d array {\tt x} of size {\tt rows x cols} into matrix.
void copyin(float **x, int rows, int cols);
/// Add elements of 2 same sized matrices.
EST_FMatrix &operator+=(const EST_FMatrix &a);
/// Subtract elements of 2 same sized matrices.
EST_FMatrix &operator-=(const EST_FMatrix &a);
/// elementwise multiply by scalar
EST_FMatrix &operator*=(const float f);
/// elementwise divide by scalar
EST_FMatrix &operator/=(const float f);
/// Multiply all elements of matrix by {\tt x}.
friend EST_FMatrix operator*(const EST_FMatrix &a, const float x);
/// Multiply matrix by vector.
friend EST_FVector operator*(const EST_FMatrix &a, const EST_FVector &v);
/// Multiply vector by matrix
friend EST_FVector operator*(const EST_FVector &v,const EST_FMatrix &a);
/// Multiply matrix by matrix.
friend EST_FMatrix operator*(const EST_FMatrix &a, const EST_FMatrix &b);
};
/** A vector class for floating point numbers.
{\tt EST_FVector x} should be used instead of {\tt float *x}
wherever possible.
*/
class EST_FVector: public EST_TSimpleVector<float> {
public:
/// Size constructor.
EST_FVector(int n): EST_TSimpleVector<float>(n) {}
/// Copy constructor.
EST_FVector(const EST_FVector &a): EST_TSimpleVector<float>(a) {}
/// Default constructor.
EST_FVector(): EST_TSimpleVector<float>() {}
/// elementwise multiply
EST_FVector &operator*=(const EST_FVector &s);
/// elementwise add
EST_FVector &operator+=(const EST_FVector &s);
/// elementwise multiply by scalar
EST_FVector &operator*=(const float f);
/// elementwise divide by scalar
EST_FVector &operator/=(const float f);
EST_write_status est_save(const EST_String &filename,
const EST_String &type);
/// save vector to file <tt> filename</tt>.
EST_write_status save(const EST_String &filename,
const EST_String &type);
/// load vector from file <tt> filename</tt>.
EST_read_status load(const EST_String &filename);
/// Load from file in est format (binary/ascii defined in file itself)
EST_read_status est_load(const EST_String &filename);
};
/// find largest element
float matrix_max(const EST_FMatrix &a);
/// find largest element
float vector_max(const EST_FVector &a);
int square(const EST_FMatrix &a);
/// inverse
int inverse(const EST_FMatrix &a, EST_FMatrix &inv);
int inverse(const EST_FMatrix &a, EST_FMatrix &inv, int &singularity);
/// pseudo inverse (for non-square matrices)
int pseudo_inverse(const EST_FMatrix &a, EST_FMatrix &inv);
int pseudo_inverse(const EST_FMatrix &a, EST_FMatrix &inv,int &singularity);
/// some useful matrix creators
/// make an identity matrix of dimension n
void eye(EST_FMatrix &a, const int n);
/// make already square matrix into I without resizing
void eye(EST_FMatrix &a);
/// the user should use est_seed to seed the random number generator
void est_seed();
void est_seed48();
/// all elements are randomised
void make_random_vector(EST_FVector &M, const float scale);
/// all elements are randomised
void make_random_matrix(EST_FMatrix &M, const float scale);
/// used for variance
void make_random_diagonal_matrix(EST_FMatrix &M, const float scale);
/// used for covariance
void make_random_symmetric_matrix(EST_FMatrix &M, const float scale);
void make_poly_basis_function(EST_FMatrix &T, EST_FVector t);
/// elementwise add
EST_FVector add(const EST_FVector &a,const EST_FVector &b);
/// elementwise subtract
EST_FVector subtract(const EST_FVector &a,const EST_FVector &b);
/// enforce symmetry
void symmetrize(EST_FMatrix &a);
/// stack columns on top of each other to make a vector
void stack_matrix(const EST_FMatrix &M, EST_FVector &v);
/// inplace diagonalise
void inplace_diagonalise(EST_FMatrix &a);
float determinant(const EST_FMatrix &a);
/// not implemented ??
int singular(EST_FMatrix &a);
/// exchange rows and columns
void transpose(const EST_FMatrix &a,EST_FMatrix &b);
EST_FMatrix triangulate(const EST_FMatrix &a);
/// extract leading diagonal as a matrix
EST_FMatrix diagonalise(const EST_FMatrix &a);
/// extract leading diagonal as a vector
EST_FVector diagonal(const EST_FMatrix &a);
/// sum of elements
float sum(const EST_FMatrix &a);
void multiply(const EST_FMatrix &a, const EST_FMatrix &b, EST_FMatrix &c);
int floor_matrix(EST_FMatrix &M, const float floor);
/// matrix product of two vectors (#rows = length of first vector, #cols = length of second vector)
EST_FMatrix cov_prod(const EST_FVector &v1,const EST_FVector &v2);
EST_FMatrix operator*(const EST_FMatrix &a, const EST_FMatrix &b);
EST_FMatrix operator-(const EST_FMatrix &a, const EST_FMatrix &b);
EST_FMatrix operator+(const EST_FMatrix &a, const EST_FMatrix &b);
EST_FVector operator-(const EST_FVector &a, const EST_FVector &b);
EST_FVector operator+(const EST_FVector &a, const EST_FVector &b);
EST_FMatrix sub(const EST_FMatrix &a, int row, int col);
EST_FMatrix fmatrix_abs(const EST_FMatrix &a);
EST_FMatrix row(const EST_FMatrix &a, int row);
EST_FMatrix column(const EST_FMatrix &a, int col);
/// least squares fit
bool
polynomial_fit(EST_FVector &x, EST_FVector &y, EST_FVector &co_effs, int order);
/// weighted least squares fit
bool
polynomial_fit(EST_FVector &x, EST_FVector &y, EST_FVector &co_effs,
EST_FVector &weights, int order);
float
polynomial_value(const EST_FVector &coeffs, const float x);
/// vector dot product
float operator*(const EST_FVector &v1, const EST_FVector &v2);
VAL_REGISTER_CLASS_DCLS(fmatrix,EST_FMatrix)
VAL_REGISTER_CLASS_DCLS(fvector,EST_FVector)
#endif
+162
View File
@@ -0,0 +1,162 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996,1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
#ifndef __EST_FEATURED_H__
#define __EST_FEATURED_H__
#include "EST_Features.h"
/** A class with the mechanisms needed to give an object features and
* access them nicely. Used as a parent class.
*
* @author Richard Caley <rjc@cstr.ed.ac.uk>
* @version $Id: EST_Featured.h,v 1.3 2004/05/04 00:00:16 awb Exp $ */
class EST_Featured {
private:
EST_Features *p_features;
protected:
EST_Featured(void);
EST_Featured(const EST_Featured &f);
~EST_Featured(void);
void init_features();
void copy_features(const EST_Featured &f);
void clear_features();
void ensure_features(void)
{ if (p_features==NULL) p_features= new EST_Features; }
public:
int f_Int(const char *name, int def) const
{ return p_features?p_features->I(name, def):def; }
int f_Int(const char *name) const
{ return p_features?p_features->I(name):0; }
int f_I(const char *name, int def) const
{return f_Int(name, def);}
int f_I(const char *name) const
{return f_Int(name);}
void f_set(const EST_String name, int val)
{ ensure_features(); p_features->set(name, val); }
void f_set_path(const EST_String name, int val)
{ ensure_features(); p_features->set_path(name, val); }
float f_Float(const char *name, float def) const
{ return p_features?p_features->F(name, def):def; }
float f_Float(const char *name) const
{ return p_features?p_features->F(name):0.0; }
float f_F(const char *name, float def) const
{return f_Float(name, def);}
float f_F(const char *name) const
{return f_Float(name);}
void f_set(const EST_String name, float val)
{ ensure_features(); p_features->set(name, val); }
void f_set_path(const EST_String name, float val)
{ ensure_features(); p_features->set_path(name, val); }
EST_String f_String(const char *name, const EST_String &def) const
{ return p_features?p_features->S(name, def):def; }
EST_String f_String(const char *name) const
{ return p_features?p_features->S(name):EST_String::Empty; }
EST_String f_S(const char *name, const EST_String &def) const
{return f_String(name, def);}
EST_String f_S(const char *name) const
{return f_String(name);}
void f_set(const EST_String name, const char *val)
{ ensure_features(); p_features->set(name, val); }
void f_set_path(const EST_String name, const char *val)
{ ensure_features(); p_features->set_path(name, val); }
const EST_Val &f_Val(const char *name, const EST_Val &def) const;
const EST_Val &f_Val(const char *name) const;
const EST_Val &f_V(const char *name, const EST_Val &def) const
{return f_Val(name, def);}
const EST_Val &f_V(const char *name) const
{return f_Val(name);}
void f_set_val(const EST_String name, EST_Val val)
{ ensure_features(); p_features->set_val(name, val); }
void f_set_path(const EST_String name, EST_Val val)
{ ensure_features(); p_features->set_path(name, val); }
void f_set(const EST_Features &f)
{ ensure_features(); *p_features = f; }
int f_present(const EST_String name) const
{return p_features && p_features->present(name); }
void f_remove(const EST_String name)
{ if (p_features) p_features->remove(name); }
// iteration
protected:
struct IPointer_feat { EST_Features::RwEntries i; };
// struct IPointer_feat { EST_TRwStructIterator< EST_Features, EST_Features::IPointer, EST_Features::Entry> i; };
void point_to_first(IPointer_feat &ip) const
{ if (p_features) ip.i.begin(*p_features);}
void move_pointer_forwards(IPointer_feat &ip) const
{ ++(ip.i); }
bool points_to_something(const IPointer_feat &ip) const
{ return ip.i != 0; }
EST_TKVI<EST_String, EST_Val> &points_at(const IPointer_feat &ip)
{ return *(ip.i); }
friend class EST_TIterator< EST_Featured, IPointer_feat, EST_TKVI<EST_String, EST_Val> >;
friend class EST_TStructIterator< EST_Featured, IPointer_feat, EST_TKVI<EST_String, EST_Val> >;
friend class EST_TRwIterator< EST_Featured, IPointer_feat, EST_TKVI<EST_String, EST_Val> >;
friend class EST_TRwStructIterator< EST_Featured, IPointer_feat, EST_TKVI<EST_String, EST_Val> >;
public:
typedef EST_TKVI<EST_String, EST_Val> FeatEntry;
typedef EST_TStructIterator< EST_Featured, IPointer_feat, FeatEntry> FeatEntries;
typedef EST_TRwStructIterator< EST_Featured, IPointer_feat, FeatEntry> RwFeatEntries;
};
#endif
+330
View File
@@ -0,0 +1,330 @@
/*************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1998 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* Author : Alan W Black */
/* Date : March 1998 */
/*-----------------------------------------------------------------------*/
/* A class for feature value pairs */
/*=======================================================================*/
#ifndef __EST_FEATURES_H__
#define __EST_FEATURES_H__
#include "EST_TKVL.h"
#include "EST_Val.h"
#include "EST_types.h"
#include "EST_TIterator.h"
//#include "EST_error.h"
class EST_TokenStream;
class EST_String;
VAL_REGISTER_CLASS_DCLS(feats,EST_Features)
// This shouldn't be here and only is for older code
typedef EST_Val (*EST_Item_featfunc)(class EST_Item *);
EST_Val est_val(const EST_Item_featfunc f);
/** A class for containing feature structures which can hold atomic
values (int, float, string) or other feature structures.
*/
class EST_Features {
protected:
EST_TKVL<EST_String, EST_Val> *features;
void save_fpair(ostream &outf,
const EST_String &fname,
const EST_Val &fvalue) const;
public:
static EST_Val feature_default_value;
EST_Features();
EST_Features(const EST_Features &f);
~EST_Features();
/**@name Access functions which return EST_Val.
Features can
either be simple features, in which their name is the name of
an plain attribute (e.g. "name"), or path features where their
name is a dot separated path of concatenated attributes
(e.g. "df.poa.alveolar").
*/
//@{
/** Look up directly without decomposing name as path (just simple feature)
*/
const EST_Val &val(const char *name) const;
/** Look up directly without decomposing name as path (just simple feature),
returning <parameter>def</parameter> if not found
*/
const EST_Val &val(const char *name, const EST_Val &def) const;
/** Look up feature name, which may be simple feature or path
*/
const EST_Val &val_path(const EST_String &path) const;
/** Look up feature name, which may be simple feature or path,
returning <parameter>def</parameter> if not found
*/
const EST_Val &val_path(const EST_String &path, const EST_Val &def) const;
/** Look up feature name, which may be simple feature or path.
*/
const EST_Val &operator() (const EST_String &path) const
{return val_path(path);}
/** Look up feature name, which may be simple feature or path,
returning <parameter>def</parameter> if not found
*/
const EST_Val &operator() (const EST_String &path, const EST_Val &def) const
{return val_path(path, def);}
/** Look up feature name, which may be simple feature or path.
*/
const EST_Val &f(const EST_String &path) const
{ return val_path(path); }
/** Look up feature name, which may be simple feature or path,
returning <parameter>def</parameter> if not found
*/
const EST_Val &f(const EST_String &path, const EST_Val &def) const
{ return val_path(path,def); }
//@}
/**@name Access functions which return types.
These functions cast
their EST_Val return value to a requested type, either float,
int, string or features (A). In all cases the name can be a
simple feature or a path, in which case their name is a dot
separated string of concatenated attributes
(e.g. "df.poa.alveolar"). */
//@{
/** Look up feature name, which may be simple feature or path, and return
as a float */
const float F(const EST_String &path) const
{return val_path(path).Float(); }
/** Look up feature name, which may be simple feature or path, and
return as a float, returning <parameter>def</parameter> if not
found */
const float F(const EST_String &path, float def) const
{return val_path(path, def).Float(); }
/** Look up feature name, which may be simple feature or path, and return
as an int */
const int I(const EST_String &path) const
{return val_path(path).Int(); }
/** Look up feature name, which may be simple feature or path, and
return as an int, returning <parameter>def</parameter> if not
found */
const int I(const EST_String &path, int def) const
{return val_path(path, def).Int(); }
/** Look up feature name, which may be simple feature or path, and return
as a EST_String */
const EST_String S(const EST_String &path) const
{return val_path(path).string(); }
/** Look up feature name, which may be simple feature or path, and
return as a EST_String, returning <parameter>def</parameter> if not
found */
const EST_String S(const EST_String &path, const EST_String &def) const
{return val_path(path, def).string(); }
/** Look up feature name, which may be simple feature or path, and return
as a EST_Features */
EST_Features &A(const EST_String &path) const
{return *feats(val_path(path));}
/** Look up feature name, which may be simple feature or path, and
return as a EST_Features, returning <parameter>def</parameter> if not
found */
EST_Features &A(const EST_String &path, EST_Features &def) const;
//@}
/**@name Setting features
*/
//@{
/** Add a new feature or set an existing feature <parameter>name<parameter>
to value <parameter>ival</parameter>
*/
void set(const EST_String &name, int ival)
{ EST_Val pv(ival); set_path(name, pv);}
/** Add a new feature or set an existing feature <parameter>name<parameter>
to value <parameter>fval</parameter>
*/
void set(const EST_String &name, float fval)
{ EST_Val pv(fval); set_path(name, pv); }
/** Add a new feature or set an existing feature <parameter>name<parameter>
to value <parameter>dval</parameter>
*/
void set(const EST_String &name, double dval)
{ EST_Val pv((float)dval); set_path(name, pv); }
/** Add a new feature or set an existing feature <parameter>name<parameter>
to value <parameter>sval</parameter>
*/
void set(const EST_String &name, const EST_String &sval)
{ EST_Val pv(sval); set_path(name, pv); }
/** Add a new feature or set an existing feature <parameter>name<parameter>
to value <parameter>cval</parameter>
*/
void set(const EST_String &name, const char *cval)
{ EST_Val pv(cval); set_path(name, pv); }
/** Add a new feature or set an existing feature <parameter>name<parameter>
to value <parameter>val<parameter>. <parameter>Name<parameter> must be
not be a path.
*/
void set_val(const EST_String &name, const EST_Val &sval)
{ features->add_item(name,sval); }
/** Add a new feature or set an existing feature <parameter>name<parameter>
to value <parameter>val<parameter>, where <parameter>name<parameter>
is a path.
*/
void set_path(const EST_String &name, const EST_Val &sval);
/** Add a new feature feature or set an existing feature
<parameter>name<parameter> to value <parameter>f</parameter>, which
is the named of a registered feature function.
*/
void set_function(const EST_String &name, const EST_String &f);
/** Add a new feature or set an existing feature
<parameter>name<parameter> to value <parameter>f</parameter>,
which itself is a EST_Features. The information in
<parameter>f</parameter> is copied into the features. */
void set(const EST_String &name, EST_Features &f)
{ EST_Features *ff = new EST_Features(f);
set_path(name, est_val(ff)); }
//@}
/**@name Utility functions
*/
//@{
/** remove the named feature */
void remove(const EST_String &name)
{ features->remove_item(name,1); }
/** number of features in feature structure */
int length() const { return features->length(); }
/** return 1 if the feature is present */
int present(const EST_String &name) const;
/** Delete all features from object */
void clear() { features->clear(); }
/** Feature assignment */
EST_Features& operator = (const EST_Features& a);
/** Print Features */
friend ostream& operator << (ostream &s, const EST_Features &f)
{ f.save(s); return s; }
//@}
// Iteration
#if 0
EST_Litem *head() const { return features->list.head(); }
EST_String &fname(EST_Litem *p) const { return features->list(p).k; }
EST_Val &val(EST_Litem *p) const { return features->list(p).v; }
float F(EST_Litem *p) const { return features->list(p).v.Float(); }
EST_String S(EST_Litem *p) const { return features->list(p).v.string(); }
int I(EST_Litem *p) const { return features->list(p).v.Int(); }
EST_Features &A(EST_Litem *p) { return *feats(features->list(p).v); }
#endif
protected:
struct IPointer { EST_TKVL<EST_String, EST_Val>::RwEntries i; };
void point_to_first(IPointer &ip) const
{ ip.i.begin(*features);}
void move_pointer_forwards(IPointer &ip) const
{ ++(ip.i); }
bool points_to_something(const IPointer &ip) const
{ return ip.i != 0; }
EST_TKVI<EST_String, EST_Val> &points_at(const IPointer &ip)
{ return *(ip.i); }
friend class EST_TIterator< EST_Features, IPointer, EST_TKVI<EST_String, EST_Val> >;
friend class EST_TStructIterator< EST_Features, IPointer, EST_TKVI<EST_String, EST_Val> >;
friend class EST_TRwIterator< EST_Features, IPointer, EST_TKVI<EST_String, EST_Val> >;
friend class EST_TRwStructIterator< EST_Features, IPointer, EST_TKVI<EST_String, EST_Val> >;
public:
/**@name Iteration
*/
//@{
typedef EST_TKVI<EST_String, EST_Val> Entry;
typedef EST_TStructIterator< EST_Features, IPointer, Entry> Entries;
typedef EST_TRwStructIterator< EST_Features, IPointer, Entry> RwEntries;
//@}
/**@name File I/O
*/
//@{
/// load features from already opened EST_TokenStream
EST_read_status load(EST_TokenStream &ts);
/// load features from sexpression, contained in already opened EST_TokenStream
EST_read_status load_sexpr(EST_TokenStream &ts);
/// save features in already opened ostream
EST_write_status save(ostream &outf) const;
/// save features as s-expression in already opened ostream
EST_write_status save_sexpr(ostream &outf) const;
//@}
};
inline bool operator == (const EST_Features &a,const EST_Features &b)
{(void)a; (void)b; return false;}
void merge_features(EST_Features &to,EST_Features &from);
EST_String error_name(const EST_Features &a);
#endif
+74
View File
@@ -0,0 +1,74 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996,1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
#ifndef __EST_HANDLABLE_H__
#define __EST_HANDLABLE_H__
/** Reference Counting Interface.
*
* This simple class does most of the things an object which is to be
* manipulated by EST_THandle style smart pointers needs to provide.
*
* @see EST_THandle
* @see EST_TBox
* @see EST_TrackMap
* @author Richard Caley <rjc@cstr.ed.ac.uk>
* @version $Id: EST_Handleable.h,v 1.3 2004/05/04 00:00:16 awb Exp $
*/
#include <limits.h>
class EST_Handleable
{
private:
int p_refcount;
public:
# define NOT_REFCOUNTED (INT_MAX)
EST_Handleable(void) { p_refcount=NOT_REFCOUNTED; }
int refcount(void) const { return p_refcount;}
void start_refcounting(int initial=0) {p_refcount=initial;}
void inc_refcount(void) {if (p_refcount!=NOT_REFCOUNTED) p_refcount++;}
void dec_refcount(void) {if (p_refcount!=NOT_REFCOUNTED) p_refcount--;}
int is_unreferenced(void) const {return p_refcount == 0;}
int is_refcounted(void) const {return p_refcount!= NOT_REFCOUNTED;}
//@}
};
#endif
+66
View File
@@ -0,0 +1,66 @@
/*************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* */
/* Author : Paul Taylor */
/* Date : April 1996 */
/* --------------------------------------------------------------------- */
/* Matrix class */
/* */
/*************************************************************************/
#ifndef __IMatrix_H__
#define __IMatrix_H__
#include "EST_TSimpleMatrix.h"
#include "EST_TSimpleVector.h"
/** A matrix class for integers. {\tt EST_IMatrix x} should be
used instead of {\tt int **x} wherever possible.
*/
class EST_IMatrix: public EST_TSimpleMatrix<int> {
private:
public:
/// size constructor
EST_IMatrix(int m, int n):EST_TSimpleMatrix<int>(m, n) {}
/// copy constructor
EST_IMatrix(EST_IMatrix &a):EST_TSimpleMatrix<int>(a) {}
/// CHECK - what does this do???
EST_IMatrix(EST_IMatrix &a, int b);
/// default constructor
EST_IMatrix():EST_TSimpleMatrix<int>() {}
};
/// find largest element
int matrix_max(const EST_IMatrix &a);
#endif
+105
View File
@@ -0,0 +1,105 @@
/*************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1994,1995,1996 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* Author : Paul Taylor */
/* Date : September 1994 */
/*-----------------------------------------------------------------------*/
/* EST_Option Class header file */
/* */
/*=======================================================================*/
#ifndef __EST_OPTION_H__
#define __EST_OPTION_H__
#include "EST_String.h"
#include "EST_TKVL.h"
#include "EST_rw_status.h"
/** Provide a high level interface for String String key value lists.
*/
class EST_Option: public EST_TKVL<EST_String, EST_String> {
public:
/// add prefix to every key
void add_prefix(EST_String prefix);
/// remove prefix from every key
void remove_prefix(EST_String prefix);
/** read keyval list from file. The file type is an ascii file
with each line representing one key value pair. The first entry in
the line defines the key, and the rest, which may contain
whitespaces, defins the value. Lines starting with the comment
character are ignored.
@return returns EST_read_status errors, @see */
EST_read_status load(const EST_String &filename, const EST_String &comment = ";");
/// add to end of list or overwrite. If rval is empty, do nothing
int override_val(const EST_String rkey, const EST_String rval);
/// add to end of list or overwrite. If rval is empty, do nothing
int override_fval(const EST_String rkey, const float rval);
/// add to end of list or overwrite. If rval is empty, do nothing
int override_ival(const EST_String rkey, const int rval);
/** return value of type int relating to key. By default,
an error occurs if the key is not present. Use m=0 if
to get a dummy value returned if key is not present */
int ival(const EST_String &rkey, int m=1) const;
/** return value of type float relating to key. By default,
an error occurs if the key is not present. Use m=0 if
to get a dummy value returned if key is not present */
double dval(const EST_String &rkey, int m=1) const;
/** return value of type float relating to key. By default,
an error occurs if the key is not present. Use m=0 if
to get a dummy value returned if key is not present */
float fval(const EST_String &rkey, int m=1) const;
/** return value of type String relating to key. By default,
an error occurs if the key is not present. Use m=0 if
to get a dummy value returned if key is not present */
const EST_String &sval(const EST_String &rkey, int m=1) const;
/** return value of type String relating to key. By default,
an error occurs if the key is not present. Use m=0 if
to get a dummy value returned if key is not present */
// const EST_String &val(const EST_String &rkey, int m=1) const
// { return sval(rkey,m); }
int add_iitem(const EST_String &rkey, const int &rval);
int add_fitem(const EST_String &rkey, const float &rval);
/// print options
friend ostream& operator << (ostream& s, const EST_Option &kv);
};
#endif // __EST_OPTION_H__
+151
View File
@@ -0,0 +1,151 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/************************************************************************/
#ifndef __EST_REGEX_H__
#define __EST_REGEX_H__
class EST_Regex;
#include "EST_String.h"
/** A Regular expression class to go with the CSTR EST_String class.
*
* The regular expression syntax is the FSF syntax used in emacs and
* in the FSF String library. This is translated into the syntax supported
* by Henry Spensor's regular expression library, this translation is a place
* to look if you find regular expressions not matching where expected.
*
* @see EST_String
* @see string_example
* @author Richard Caley <rjc@cstr.ed.ac.uk>
* @author (regular expression library by Henry Spencer, University of Toronto)
* @version $Id: EST_Regex.h,v 1.3 2004/05/04 00:00:16 awb Exp $
*/
class EST_Regex : protected EST_String {
private:
/// The compiled form.
void *compiled;
/// Compiled form for whole string match.
void *compiled_match;
protected:
/// Compile expression.
void compile();
/// Compile expression in a form which only matches whole string.
void compile_match();
/// Translate the expression into the internally used syntax.
char *regularize(int match) const;
public:
/// Empty constructor, just for form.
EST_Regex(void);
/// Construct from EST_String.
EST_Regex(EST_String s);
/// Construct from C string.
EST_Regex(const char *ex);
/// Copy constructor.
EST_Regex(const EST_Regex &ex);
/// Destructor.
~EST_Regex();
/// Size of the expression.
int size() const { return EST_String::size; };
/// Run to find a matching substring
int run(const char *on, int from, int &start, int &end, int *starts=NULL, int *ends=NULL);
/// Run to see if it matches the entire string.
int run_match(const char *on, int from=0, int *starts=NULL, int *ends=NULL);
/// Get the expression as a string.
EST_String tostring(void) const {return (*this);};
/// Cast operator, disambiguates it for some compilers
operator const char *() const { return (const char *)tostring(); }
int operator == (const EST_Regex ex) const
{ return (const EST_String)*this == (const EST_String)ex; }
int operator != (const EST_Regex ex) const
{ return (const EST_String)*this != (const EST_String)ex; }
/**@name Assignment */
//@{
///
EST_Regex &operator = (const EST_Regex ex);
///
EST_Regex &operator = (const EST_String s);
///
EST_Regex &operator = (const char *s);
//@}
/// Stream output of regular expression.
friend ostream &operator << (ostream &s, const EST_Regex &str);
};
ostream &operator << (ostream &s, const EST_Regex &str);
/**@name Predefined_regular_expressions
* Some regular expressions matching common things are predefined
*/
//@{
/// White space
extern EST_Regex RXwhite; // "[ \n\t\r]+"
/// Sequence of alphabetic characters.
extern EST_Regex RXalpha; // "[A-Za-z]+"
/// Sequence of lower case alphabetic characters.
extern EST_Regex RXlowercase; // "[a-z]+"
/// Sequence of upper case alphabetic characters.
extern EST_Regex RXuppercase; // "[A-Z]+"
/// Sequence of letters and/or digits.
extern EST_Regex RXalphanum; // "[0-9A-Za-z]+"
/// Initial letter or underscore followed by letters underscores or digits.
extern EST_Regex RXidentifier; // "[A-Za-z_][0-9A-Za-z_]+"
/// Integer.
extern EST_Regex RXint; // "-?[0-9]+"
/// Floating point number.
extern EST_Regex RXdouble; // "-?\\(\\([0-9]+\\.[0-9]*\\)\\|\\([0-9]+\\)\\|\\(\\.[0-9]+\\)\\)\\([eE][---+]?[0-9]+\\)?"
//@}
// GCC lets us use the static constant to declare arrays, Sun CC
// doesn't, so for a quiet, if ugly, life we declare it here with a suitable
// value and check in EST_Regex.cc to make sure it`s OK
#define EST_Regex_max_subexpressions 10
#endif
+62
View File
@@ -0,0 +1,62 @@
/*************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* */
/* Author : Paul Taylor */
/* Date : April 1996 */
/* --------------------------------------------------------------------- */
/* Matrix class */
/* */
/*************************************************************************/
#ifndef __SMatrix_H__
#define __SMatrix_H__
#include "EST_TSimpleMatrix.h"
#include "EST_TSimpleVector.h"
class EST_SMatrix: public EST_TSimpleMatrix<short> {
private:
public:
/// size constructor
EST_SMatrix(int m, int n):EST_TSimpleMatrix<short>(m, n) {}
/// copy constructor
EST_SMatrix(EST_SMatrix &a):EST_TSimpleMatrix<short>(a) {}
/// CHECK - what does this do???
EST_SMatrix(EST_SMatrix &a, int b);
/// default constructor
EST_SMatrix():EST_TSimpleMatrix<short>() {}
int rateconv(int old_sr, int new_sr);
};
#endif
+650
View File
@@ -0,0 +1,650 @@
/*************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
#ifndef __EST_STRING_H__
#define __EST_STRING_H__
#ifdef HAVE_CONFIG_H
# include "est_string_config.h"
#endif
class EST_String;
class EST_Regex;
#define EST_Regex_max_subexpressions 10
#include <string.h>
#define NO_EST
#ifdef NO_EST
# include <iostream>
#else
# include "EST_iostream.h"
#endif
#include <limits.h>
#include "EST_Chunk.h"
#include "EST_strcasecmp.h"
#include "EST_bool.h"
/** A non-copyleft implementation of a string class to use with
* compilers that aren't GNU C++.
*
* Strings are reference-counted and reasonably efficient (eg you
* can pass them around, into and out of functions and so on
* without worrying too much about the cost).
*
* The associated class EST_Regex can be used to represent regular
* expressions.
*
* @see EST_Chunk
* @see EST_Regex
* @see string_example
* @author Alan W Black <awb@cstr.ed.ac.uk>
* @author Richard Caley <rjc@cstr.ed.ac.uk>
* @version $Id: EST_String.h,v 1.3 2004/05/04 00:00:16 awb Exp $
*/
class EST_String {
/** For better libg++ compatibility.
*
* Includes String from char constructor which
* tends to mask errors in use. Also reverses the () and [] operators.
*/
# define __FSF_COMPATIBILITY__ (0)
/** Allow gsub() to be used in multi-threaded applications
* This will cause gsub to use a local table of substitution points
* walloced for each gsub. Otherwise one global one is used which
* should be faster, but non reentrant.
*/
# define __GSUB_REENTRANT__ (1)
/// Gripe about weird arguments like Nulls
#define __STRING_ARG_GRIPE__ (1)
/// When we find something to gripe about we die then and there.
#define __GRIPE_FATAL__ (1)
#if __GRIPE_FATAL__
# define gripe(WHAT) (cerr<< ("oops! " WHAT "\n"),abort())
#else
# define gripe(WHAT) (cerr<< ("oops! " WHAT "\n"))
#endif
#if __STRING_ARG_GRIPE__
# define safe_strlen(S) ((S)?strlen(S):(gripe("null strlen"),0))
# define CHECK_STRING_ARG(S) if (!(S)) gripe("null string arg")
#else
# define safe_strlen(S) ((S)?strlen(S):0)
# define CHECK_STRING_ARG(S) /* empty */
#endif
public:
/// Global version string.
static const char *version;
/// Constant empty string
static const EST_String Empty;
/// Type of string size field.
typedef int EST_string_size;
/// Maximum string size.
# define MAX_STRING_SIZE (INT_MAX)
private:
/// Smart pointer to actual memory.
EST_ChunkPtr memory;
/// Size of string.
EST_string_size size;
// Make sure this is exactly the same as an EST_String. This is being too
// clever by half.
struct EST_dumb_string {
EST_ChunkPtr memory;
EST_string_size size;
} ;
/// Flags indicating which bit of a string to extract.
enum EST_chop_direction {
Chop_Before = -1,
Chop_At = 0,
Chop_After = 1
};
/// Simple utility which removes const-ness from memory
static inline EST_ChunkPtr &NON_CONST_CHUNKPTR(const EST_ChunkPtr &ecp)
{ return *((EST_ChunkPtr *)&ecp);}
/// private constructor which uses the buffer given.
EST_String(int len, EST_ChunkPtr cp) {
size=len;
memory = cp;
}
/// Is more than one String represented by the same memory?
int shareing (void) { return memory.shareing();}
/**@name Finding substrings */
//@{
/// Find substring
int locate(const char *it, int len, int from, int &start, int &end) const;
/// Find substring
int locate(const EST_String &s, int from, int &start, int &end) const
{ return locate((const char *)s.memory, s.size, from, start, end); }
/// Find match for regexp.
int locate(EST_Regex &ex, int from, int &start, int &end, int *starts=NULL, int *ends=NULL) const;
//@}
/**@name Extract Substrings */
//@{
int extract(const char *it, int len, int from, int &start, int &end) const;
int extract(const EST_String &s, int from, int &start, int &end) const
{ return extract((const char *)s.memory, s.size, from, start, end); }
int extract(EST_Regex &ex, int from, int &start, int &end) const;
//@}
/**@name Chop out part of string */
//@{
/// Locate subsring and chop.
EST_String chop_internal(const char *s, int length, int pos, EST_chop_direction directionult) const;
/// Chop at given position.
EST_String chop_internal(int pos, int length, EST_chop_direction directionult) const;
/// Locate match for expression and chop.
EST_String chop_internal(EST_Regex &ex, int pos, EST_chop_direction directionult) const;
//@}
/**@name Global search and replace */
//@{
/// Substitute for string
int gsub_internal(const char *os, int olength, const char *s, int length);
/// Substitute for matches of regexp.
int gsub_internal(EST_Regex &ex, const char *s, int length);
//@}
/// Split the string down into parts.
int split_internal(EST_String result[], int max, const char* s_seperator, int slen, EST_Regex *re_separator, char quote) const;
int Int(bool *ok_p) const;
long Long(bool *ok_p) const;
float Float(bool *ok_p) const;
double Double(bool *ok_p) const;
public:
/// Construct an empty string.
EST_String(void) :memory() {size=0;}
/// Construct from char *
EST_String(const char *s);
/// Construct from part of char * or fill with given character.
EST_String(const char *s, int start_or_fill, int len);
/// Construct from C string.
EST_String(const char *s, int s_size, int start, int len);
// Create from EST_String
EST_String(const EST_String &s, int start, int len);
/** Copy constructor
* We have to declare our own copy constructor to lie to the
* compiler about the constness of the RHS.
*/
EST_String(const EST_String &s) {
memory = NON_CONST_CHUNKPTR(s.memory);
size = s.size;
}
#if __FSF_COMPATIBILITY__
/** Construct from single char.
* This constructor is not usually included as it can mask errors.
* @see __FSF_COMPATIBILITY__
*/
EST_String(const char c);
#endif
/// Destructor.
~EST_String() {
size=0;
memory=NULL;
}
/// Length of string ({\em not} length of underlying chunk)
int length(void) const { return size; }
/// Size of underlying chunk.
int space (void) const { return memory.size(); }
/// Get a const-pointer to the actual memory.
const char *str(void) const { return size==0?"":(const char *)memory; }
/// Get a writable pointer to the actual memory.
char *updatable_str(void) { return size==0?(char *)"":(char *)memory; }
void make_updatable(void) { ::make_updatable(memory, size+1);}
/// Build string from a single character.
static EST_String FromChar(const char c)
{ const char s[2] = { c, 0 }; return EST_String(s); }
/// Build string from an integer.
static EST_String Number(int i, int base=10);
/// Build string from a long integer.
static EST_String Number(long i, int base=10);
/// Build string from a double.
static EST_String Number(double d);
/// Build string from a float
static EST_String Number(float f);
/// Convert to an integer
int Int(bool &ok) const { return Int(&ok); }
int Int(void) const { return Int((bool *)NULL); }
/// Convert to a long
long Long(bool &ok) const { return Long(&ok); }
long Long(void) const { return Long((bool *)NULL); }
/// Convert to a float
float Float(bool &ok) const { return Float(&ok); }
float Float(void) const { return Float((bool *)NULL); }
/// Convert to a double
double Double(bool &ok) const { return Double(&ok); }
double Double(void) const { return Double((bool *)NULL); }
/**@name Before */
//@{
/// Part before position
EST_String before(int pos, int len=0) const
{ return chop_internal(pos, len, Chop_Before); }
/// Part before first matching substring after pos.
EST_String before(const char *s, int pos=0) const
{ return chop_internal(s, safe_strlen(s), pos, Chop_Before); }
/// Part before first matching substring after pos.
EST_String before(const EST_String &s, int pos=0) const
{ return chop_internal(s.str(), s.size, pos, Chop_Before); }
/// Part before first match of regexp after pos.
EST_String before(EST_Regex &e, int pos=0) const
{ return chop_internal(e, pos, Chop_Before); }
//@}
/**@name At */
//@{
/// Return part at position
EST_String at(int from, int len=0) const
{ return EST_String(str(),size,from<0?(size+from):from,len); }
/// Return part where substring found (not useful, included for completeness)
EST_String at(const char *s, int pos=0) const
{ return chop_internal(s, safe_strlen(s), pos, Chop_At); }
/// Return part where substring found (not useful, included for completeness)
EST_String at(const EST_String &s, int pos=0) const
{ return chop_internal(s.str(), s.size, pos, Chop_At); }
/// Return part matching regexp.
EST_String at(EST_Regex &e, int pos=0) const
{ return chop_internal(e, pos, Chop_At); }
//@}
/**@name After */
//@{
/// Part after pos+len
EST_String after(int pos, int len=1) const
{ return chop_internal(pos, len, Chop_After); }
/// Part after substring.
EST_String after(const char *s, int pos=0) const
{ return chop_internal(s, safe_strlen(s), pos, Chop_After); }
/// Part after substring.
EST_String after(const EST_String &s, int pos=0) const
{ return chop_internal(s.str(), s.size, pos, Chop_After); }
/// Part after match of regular expression.
EST_String after(EST_Regex &e, int pos=0) const
{ return chop_internal(e, pos, Chop_After); }
//@}
/**@name Search for something */
//@{
/// Find a substring.
int search(const char *s, int len, int &mlen, int pos=0) const
{ int start, end;
if (locate(s, len, pos, start, end))
{ mlen=end-start; return start; }
return -1;
}
/// Find a substring.
int search(const EST_String s, int &mlen, int pos=0) const
{ int start, end;
if (locate(s, pos, start, end))
{ mlen=end-start; return start; }
return -1;
}
/// Find a match of the regular expression.
int search(EST_Regex &re, int &mlen, int pos=0, int *starts=NULL, int *ends=NULL) const
{ int start, end;
if (locate(re, pos, start, end, starts, ends))
{ mlen=end-start; return start; }
return -1;
}
//@}
/**@name Get position of something */
//@{
/// Position of substring (starting at pos)
int index(const char *s, int pos=0) const
{ int start, end; return locate(s, safe_strlen(s), pos, start, end)?start:-1; }
/// Position of substring (starting at pos)
int index(const EST_String &s, int pos=0) const
{ int start, end; return locate(s, pos, start, end)?start:-1; }
/// Position of match of regexp (starting at pos)
int index(EST_Regex &ex, int pos=0) const
{ int start, end; return locate(ex, pos, start, end)?start:-1; }
//@}
/**@name Does string contain something? */
//@{
/// Does it contain this substring?
int contains(const char *s, int pos=-1) const
{ int start, end; return extract(s, safe_strlen(s), pos, start, end); }
/// Does it contain this substring?
int contains(const EST_String &s, int pos=-1) const
{ int start, end; return extract(s, pos, start, end); }
/// Does it contain this character?
int contains(const char c, int pos=-1) const
{ int start, end; char s[2] = {c,0}; return extract(s, 1, pos, start, end); }
/// Does it contain a match for this regular expression?
int contains(EST_Regex &ex, int pos=-1) const
{ int start, end; return extract(ex, pos, start, end); }
//@}
/**@name Does string exactly match? */
//@{
/// Exactly match this string?
int matches(const char *e, int pos=0) const;
/// Exactly match this string?
int matches(const EST_String &e, int pos=0) const;
/// Exactly matches this regular expression, can return ends of sub-expressions.
int matches(EST_Regex &e, int pos=0, int *starts=NULL, int *ends=NULL) const;
//@}
/**@name Global replacement */
//@{
/// Substitute one string for another.
int gsub(const char *os, const EST_String &s)
{ return gsub_internal(os, safe_strlen(os), s, s.size); }
/// Substitute one string for another.
int gsub(const char *os, const char *s)
{ return gsub_internal(os, safe_strlen(os), s, safe_strlen(s)); }
/// Substitute one string for another.
int gsub(const EST_String &os, const EST_String &s)
{ return gsub_internal(os, os.size, s, s.size); }
/// Substitute one string for another.
int gsub(const EST_String &os, const char *s)
{ return gsub_internal(os, os.size, s, safe_strlen(s)); }
/// Substitute string for matches of regular expression.
int gsub(EST_Regex &ex, const EST_String &s)
{ return gsub_internal(ex, s, s.size); }
/// Substitute string for matches of regular expression.
int gsub(EST_Regex &ex, const char *s)
{ return gsub_internal(ex, s, safe_strlen(s)); }
/// Substitute string for matches of regular expression.
int gsub(EST_Regex &ex, int bracket_num)
{ return gsub_internal(ex, NULL, bracket_num); }
/// Substitute the result of a match into a string.
int subst(EST_String source,
int (&starts)[EST_Regex_max_subexpressions],
int (&ends)[EST_Regex_max_subexpressions]);
//@}
/**@name Frequency counts */
//@{
/// Number of occurrences of substring
int freq(const char *s) const;
/// Number of occurrences of substring
int freq(const EST_String &s) const;
/// Number of matches of regular expression.
int freq(EST_Regex &s) const;
//@}
/**@name Quoting */
//@{
/// Return the string in quotes with internal quotes protected.
EST_String quote(const char quotec) const;
/// Return in quotes if there is something to protect (e.g. spaces)
EST_String quote_if_needed(const char quotec) const;
/// Remove quotes and unprotect internal quotes.
EST_String unquote(const char quotec) const;
/// Remove quotes if any.
EST_String unquote_if_needed(const char quotec) const;
//@}
#if __FSF_COMPATIBILITY__
const char operator [] (int i) const { return memory[i]; }
char &operator () (int i) { return memory(i); }
#else
/**@name Operators */
//@{
/// Function style access to constant strings.
const char operator () (int i) const { return memory[i]; }
/// Array style access to writable strings.
char &operator [] (int i) { return memory(i); }
#endif
/// Cast to const char * by simply giving access to pointer.
operator const char*() const {return str(); }
operator const char*() {return str(); }
/// Cast to char *, may involve copying.
operator char*() { return updatable_str(); }
/**@name Add to end of string. */
//@{
/// Add C string to end of EST_String
EST_String &operator += (const char *b);
/// Add EST_String to end of EST_String
EST_String &operator += (const EST_String b);
//@}
/**@name Assignment */
//@{
/// Assign C string to EST_String
EST_String &operator = (const char *str);
/// Assign single character to EST_String
EST_String &operator = (const char c);
/// Assign EST_String to EST_String.
EST_String &operator = (const EST_String &s);
//@}
/**@name Concatenation */
//@{
/// Concatenate two EST_Strings
friend EST_String operator + (const EST_String &a, const EST_String &b);
/// Concatenate C String with EST_String
friend EST_String operator + (const char *a, const EST_String &b);
/// Concatenate EST_String with C String
friend EST_String operator + (const EST_String &a, const char *b);
//@}
/// Repeat string N times
friend EST_String operator * (const EST_String &s, int n);
/**@name relational operators */
//@{
///
friend int operator == (const char *a, const EST_String &b);
///
friend int operator == (const EST_String &a, const char *b)
{ return b == a; }
///
friend int operator == (const EST_String &a, const EST_String &b);
///
friend int operator != (const char *a, const EST_String &b)
{ return !(a==b); }
///
friend int operator != (const EST_String &a, const char *b)
{ return !(a==b); }
///
friend int operator != (const EST_String &a, const EST_String &b)
{ return !(a==b); }
///
friend inline int operator < (const char *a, const EST_String &b)
{ return compare(a,b) < 0; }
///
friend inline int operator < (const EST_String &a, const char *b)
{ return compare(a,b) < 0; }
///
friend inline int operator < (const EST_String &a, const EST_String &b)
{ return compare(a,b) < 0; }
///
friend inline int operator > (const char *a, const EST_String &b)
{ return compare(a,b) > 0; }
///
friend inline int operator > (const EST_String &a, const char *b)
{ return compare(a,b) > 0; }
///
friend inline int operator > (const EST_String &a, const EST_String &b)
{ return compare(a,b) > 0; }
///
friend inline int operator <= (const char *a, const EST_String &b)
{ return compare(a,b) <= 0; }
///
friend inline int operator <= (const EST_String &a, const char *b)
{ return compare(a,b) <= 0; }
///
friend inline int operator <= (const EST_String &a, const EST_String &b)
{ return compare(a,b) <= 0; }
///
friend inline int operator >= (const char *a, const EST_String &b)
{ return compare(a,b) >= 0; }
///
friend inline int operator >= (const EST_String &a, const char *b)
{ return compare(a,b) >= 0; }
///
friend inline int operator >= (const EST_String &a, const EST_String &b)
{ return compare(a,b) >= 0; }
//@}
//@}
/**@name String comparison.
* All these operators return -1, 0 or 1 to indicate the sort
* order of the strings.
*/
//@{
///
friend int compare(const EST_String &a, const EST_String &b);
///
friend int compare(const EST_String &a, const char *b);
///
friend inline int compare(const char *a, const EST_String &b)
{ return -compare(b,a); }
/** Case folded comparison.
*
* The table argument can defined how upper and lower
* case characters correspond. The default works for
* ASCII.
*/
//@{
friend int fcompare(const EST_String &a, const EST_String &b,
const unsigned char *table=NULL);
friend int fcompare(const EST_String &a, const char *b,
const unsigned char *table=NULL);
///
friend inline int fcompare(const EST_String &a, const EST_String &b,
const EST_String &table)
{ return fcompare(a, b, (const unsigned char *)(const char *)table); }
//@}
//@}
//@}
/**@name Split a string into parts.
*
* These functions divide up a string producing an array of
* substrings.
*/
//@{
/// Split at a given separator.
friend int split(const EST_String & s, EST_String result[],
int max, const EST_String& seperator, char quote=0)
{ return s.split_internal(result, max, (const char *)seperator, seperator.length(), NULL, quote); }
/// Split at a given separator.
friend int split(const EST_String &s, EST_String result[],
int max, const char *seperator, char quote=0)
{ return s.split_internal(result, max, seperator, strlen(seperator), NULL, quote); }
/// Split at each match of the regular expression.
friend int split(const EST_String & s, EST_String result[], int max,
EST_Regex& seperator, char quote=0)
{ return s.split_internal(result, max, NULL, 0, &seperator, quote); }
//@}
/// Convert to upper case.
friend EST_String upcase(const EST_String &s);
/// Convert to lower case.
friend EST_String downcase(const EST_String &s);
/** Concatenate a number of strings.
* This is more efficient than multiple uses of + or +=
*/
static EST_String cat(const EST_String s1,
const EST_String s2 = Empty,
const EST_String s3 = Empty,
const EST_String s4 = Empty,
const EST_String s5 = Empty,
const EST_String s6 = Empty,
const EST_String s7 = Empty,
const EST_String s8 = Empty,
const EST_String s9 = Empty
);
/* Hacky way to ignore volatile */
EST_String & ignore_volatile(void) volatile { return *((EST_String *)(void *)this); }
/// Stream output for EST_String.
friend ostream &operator << (ostream &s, const EST_String &str);
friend class EST_Regex;
};
int operator == (const char *a, const EST_String &b);
int operator == (const EST_String &a, const EST_String &b);
ostream &operator << (ostream &s, const EST_String &str);
#include "EST_Regex.h"
#endif
+155
View File
@@ -0,0 +1,155 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996,1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
#ifndef __EST_THANDLE_H__
#define __EST_THANDLE_H__
#include "EST_iostream.h"
#include "EST_bool.h"
/** A `smart' pointer which does reference counting.
*
* Behaves almost like a pointer as far as naive code is concerned, but
* keeps count of how many handles are holding on to the contents
* and deletes it when there are none.
*
* You need to be careful there are no dumb C++ pointers to things which
* are being handled this way.
*
* Things to be handled should implement the same interface as EST_Handleable
* (either by taking that as a superclass or by reimplementing it) and in
* addition define {\tt object_ptr()}. See EST_TBox for an example.
*
* There are two parameter types. In most cases the thing which contains the
* reference count and the data it represents will be the same object, but
* in the case of boxed values it may not be, so you can specify the type
* of both independently.
*
* @see EST_Handleable
* @see EST_TBox
* @see EST_THandle:example
*
* @author Richard Caley <rjc@cstr.ed.ac.uk>
* @version $Id: EST_THandle.h,v 1.3 2004/05/04 00:00:16 awb Exp $
*/
template<class BoxT, class ObjectT>
class EST_THandle {
private:
BoxT *ptr;
public:
EST_THandle(void) { ptr = (BoxT *)NULL; }
EST_THandle(BoxT *p) { if ((ptr=p)) p->inc_refcount(); }
EST_THandle(const EST_THandle &cp) {
ptr=cp.ptr;
if (ptr)
ptr->inc_refcount();
}
~EST_THandle(void) {
if (ptr)
ptr->dec_refcount();
if (ptr && ptr->is_unreferenced())
delete ptr;
}
bool null() const { return ptr == NULL; }
int shareing(void) const { return ptr?(ptr->refcount() > 1):0; }
EST_THandle &operator = (EST_THandle h) {
// doing it in this order means self assignment is safe.
if (h.ptr)
(h.ptr)->inc_refcount();
if (ptr)
ptr->dec_refcount();
if (ptr && ptr->is_unreferenced())
delete ptr;
ptr=h.ptr;
return *this;
}
// If they manage to get hold of one...
// Actually usually used to assign NULL and so (possibly) deallocate
// the object currently pointed to.
EST_THandle &operator = (BoxT *t_ptr) {
// doing it in this order means self assignment is safe.
if (t_ptr)
t_ptr->inc_refcount();
if (ptr)
ptr->dec_refcount();
if (ptr && ptr->is_unreferenced())
delete ptr;
ptr=t_ptr;
return *this;
}
operator ObjectT *() {
return ptr?(ptr->object_ptr()):(ObjectT *)NULL;
}
operator const ObjectT *() const {
return ptr?(ptr->object_ptr()):(const ObjectT *)NULL;
}
int operator == (const BoxT *p) const { return ptr == p; }
int operator != (const BoxT *p) const { return !(*this == p); }
const ObjectT& operator *() const { return *(ptr->object_ptr()); }
ObjectT& operator *() { return *(ptr->object_ptr()); }
const ObjectT* operator ->() const { return (ptr->object_ptr()); }
ObjectT* operator ->() { return (ptr->object_ptr()); }
friend int operator == (const EST_THandle< BoxT, ObjectT > &a, const EST_THandle< BoxT, ObjectT > & b);
friend int operator != (const EST_THandle< BoxT, ObjectT > &a, const EST_THandle< BoxT, ObjectT > & b);
friend ostream & operator << (ostream &s, const EST_THandle< BoxT, ObjectT > &a);
};
template<class BoxT, class ObjectT>
int operator == (const EST_THandle< BoxT, ObjectT > &a, const EST_THandle< BoxT, ObjectT > & b) { return a.ptr==b.ptr; }
template<class BoxT, class ObjectT>
int operator != (const EST_THandle< BoxT, ObjectT > &a, const EST_THandle< BoxT, ObjectT > & b) { return !( a==b ); }
template<class BoxT, class ObjectT>
ostream & operator << (ostream &s, const EST_THandle< BoxT, ObjectT > &a) { return s << "HANDLE"; }
#endif
+298
View File
@@ -0,0 +1,298 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996,1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/************************************************************************/
#ifndef __EST_TITERATOR_H__
#define __EST_TITERATOR_H__
/** Template class defining interface to an iterator, i.e an object
* which returns elements from a structure one at a time.
*
* This is template is usually hidden in the declaration of the
* container classes with a typedef for Entries providing a more
* convenient name for the iterator. However the interface is that
* defined here.
*
* We support two interfaces, a pointer like interface similar to
* specialised iteration code elsewhere in the speech tools library
* and to the iterators in the C++ standard template library and an
* interface similar to that of Enumerations in Java.
*
* <programlisting arch='c++'>
* MyContainer::Entries them;
*
* for(them.begin(container); them; them++)
* {
* MyContainer::Entry &it = *them;
* // Do Something With it
* }</programlisting>
*
* <programlisting arch='c++'>
* MyContainer::Entries them;
*
* them.begin(container);
* while (them.has_more_entries())
* {
* MyContainer::Entry &it = them.next_entry();
* // Do Something With it
* }</programlisting>
*
* @author Richard Caley <rjc@cstr.ed.ac.uk>
* @version $Id: EST_TIterator.h,v 1.6 2004/05/04 00:00:16 awb Exp $
*/
template <class Container, class IPointer, class Entry>
class EST_TStructIterator;
template <class Container, class IPointer, class Entry>
class EST_TRwIterator;
template <class Container, class IPointer, class Entry>
class EST_TRwStructIterator;
template <class Container, class IPointer, class Entry>
class EST_TIterator
{
protected:
/// The container we are looking at.
Container *cont;
/// Position in the structure. May or may not be useful.
unsigned int pos;
/** Structure defined by the container class which contains the
* current state of the iteration.
*/
IPointer pointer;
public:
/// Name for an iterator like this
typedef EST_TIterator<Container, IPointer, Entry> Iter;
/// Create an iterator not associated with any specific container.
EST_TIterator() {cont=NULL;}
/// Create an iterator ready to run over the given container.
EST_TIterator(const Container &over)
{ begin(over); }
/// Copy an iterator by assignment
Iter &operator = (const Iter &orig)
{ cont=orig.cont; pos=orig.pos; pointer=orig.pointer; return *this;}
/// Assigning a container to an iterator sets it ready to start.
Iter &operator = (const Container &over)
{ begin(over); return *this;}
/// Set the iterator ready to run over this container.
void begin(const Container &over)
{cont=((Container *)(void *)&over); beginning();}
/// Reset to the start of the container.
void beginning()
{if (cont) cont->point_to_first(pointer); pos=0;}
/**@name End Tests
*/
//@{
/// True if there are more elements to look at.
bool has_more_elements() const
{return cont && cont->points_to_something(pointer);}
/// True when there are no more.
bool at_end() const
{return !has_more_elements();}
/** Viewing the iterator as an integer (for instance in a test)
* sees a non-zero value iff there are elements still to look at.
*/
operator int() const
{return has_more_elements();}
//@}
/**@name Moving Forward
*/
//@{
/// Next moves to the next entry.
void next()
{cont->move_pointer_forwards(pointer); pos++;}
/// The increment operator does the same as next.
Iter &operator ++()
{next(); return *this;}
Iter operator ++(int dummy)
{
(void)dummy;
Iter old =*this;
next();
return old;
}
//@}
/**@name Access
*/
//@{
/// Return the element currently pointed to.
const Entry& current() const
{return cont->points_at(pointer);}
/// The * operator returns the current element.
const Entry &operator *() const
{return current();}
#if 0
// This only works for some Entry types.
const Entry *operator ->() const
{return &current();}
#endif
/// Return the current element and move the pointer forwards.
const Entry& next_element()
{
const Entry &it = cont->points_at(pointer);
cont->move_pointer_forwards(pointer);
return it;
}
/// Return the current position
unsigned int n() const { return pos; }
//@}
friend class EST_TStructIterator <Container, IPointer, Entry>;
friend class EST_TRwIterator <Container, IPointer, Entry>;
friend class EST_TRwStructIterator <Container, IPointer, Entry>;
};
template <class Container, class IPointer, class Entry>
class EST_TStructIterator
: public EST_TIterator<Container, IPointer, Entry>
{
public:
typedef EST_TIterator<Container, IPointer, Entry> Iter;
/// Create an iterator not associated with any specific container.
EST_TStructIterator() {this->cont=NULL;}
/// Copy an iterator by assignment
Iter &operator = (const Iter &orig)
{ this->cont=orig.cont; this->pos=orig.pos; this->pointer=orig.pointer; return *this;}
/// Create an iterator ready to run over the given container.
EST_TStructIterator(const Container &over)
{ begin(over); }
const Entry *operator ->() const
{return &this->current();}
};
template <class Container, class IPointer, class Entry>
class EST_TRwIterator
: public EST_TIterator<Container, IPointer, Entry>
{
private:
/// Can't access constant containers this way.
// EST_TRwIterator(const Container &over) { (void) over; }
/// Can't access constant containers this way.
// void begin(const Container &over) { (void) over; }
public:
typedef EST_TIterator<Container, IPointer, Entry> Iter;
/// Create an iterator not associated with any specific container.
EST_TRwIterator() {this->cont=NULL;}
/// Copy an iterator by assignment
Iter &operator = (const Iter &orig)
{ this->cont=orig.cont; this->pos=orig.pos; this->pointer=orig.pointer; return *this;}
/// Create an iterator ready to run over the given container.
EST_TRwIterator(Container &over)
{ begin(over); }
/// Set the iterator ready to run over this container.
void begin(Container &over)
{this->cont=&over; this->beginning();}
/**@name Access
*/
//@{
/// Return the element currently pointed to.
Entry& current() const
{return this->cont->points_at(this->pointer);}
/// The * operator returns the current element.
Entry &operator *() const
{return current();}
#if 0
Entry *operator ->() const
{return &current();}
#endif
/// Return the current element and move the pointer forwards.
Entry& next_element()
{
Entry &it = this->cont->points_at(this->pointer);
this->cont->move_pointer_forwards(this->pointer);
return it;
}
//@}
};
template <class Container, class IPointer, class Entry>
class EST_TRwStructIterator
: public EST_TRwIterator<Container, IPointer, Entry>
{
public:
typedef EST_TIterator<Container, IPointer, Entry> Iter;
/// Create an iterator not associated with any specific container.
EST_TRwStructIterator() {this->cont=NULL;}
/// Copy an iterator by assignment
Iter &operator = (const Iter &orig)
{ this->cont=orig.cont; this->pos=orig.pos; this->pointer=orig.pointer; return *this;}
/// Create an iterator ready to run over the given container.
EST_TRwStructIterator(Container &over)
{ begin(over); }
Entry *operator ->() const
{return &this->current();}
};
#endif
+59
View File
@@ -0,0 +1,59 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996,1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
#ifndef __EST_TITERATORI_H__
#define __EST_TITERATORI_H__
/** Instantiate an iterator.
*
* @author Richard Caley <rjc@cstr.ed.ac.uk>
* @version $Id: EST_TIteratorI.h,v 1.2 2001/04/04 13:11:27 awb Exp $
*/
#define Instantiate_TIterator_T(CONTAINER, IP, ENTRY, TAG) \
template class EST_TIterator<CONTAINER, IP, ENTRY>; \
template class EST_TRwIterator<CONTAINER, IP, ENTRY>;
#define Declare_TIterator_T(CONTAINER, IP, ENTRY, TAG)\
/* EMPTY */
#define Instantiate_TStructIterator_T(CONTAINER, IP, ENTRY, TAG) \
template class EST_TStructIterator<CONTAINER, IP, ENTRY>; \
template class EST_TRwStructIterator<CONTAINER, IP, ENTRY>;
#define Declare_TIterator_T(CONTAINER, IP, ENTRY, TAG)\
/* EMPTY */
#endif
+201
View File
@@ -0,0 +1,201 @@
/*************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1995,1996 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* Author : Paul Taylor */
/* Date : January 1995 */
/*-----------------------------------------------------------------------*/
/* Key/Value list template class */
/* */
/*=======================================================================*/
#ifndef __EST_TKVL_H__
#define __EST_TKVL_H__
#include <math.h>
#include "EST_TList.h"
#include "EST_TKVLI.h"
#include "EST_TIterator.h"
class EST_String;
/** Templated Key-Value Item. Serves as the items in the list of the
EST_TKVL class. */
template<class K, class V> class EST_TKVI {
public:
K k;
V v;
inline bool operator==(const EST_TKVI<K,V> &i){
return( (i.k == k) && (i.v == v) );
}
friend ostream& operator << (ostream& s, EST_TKVI<K,V> const &i);
};
/** Templated Key-Value list. Objects of type EST_TKVL contain lists which
are accessed by a key of type {\bf K}, which returns a value of type
{\bf V}. */
template<class K, class V> class EST_TKVL {
private:
EST_Litem *find_pair_key(const K &key) const;
EST_Litem *find_pair_val(const V &val) const;
public:
/**@name Constructor functions */
//@{
/// default constructor
EST_TKVL() {;}
/// copy constructor
EST_TKVL(const EST_TKVL<K, V> &kv);
//@}
/// default value, returned when there is no such entry.
static V *default_val;
/// default value, returned when there is no such entry.
static K *default_key;
/// Linked list of key-val pairs. Don't use
/// this as it will be made private in the future
EST_TList< EST_TKVI<K,V> > list;
/// number of key value pairs in list
const int length() const {return list.length();}
/// Return First key value pair in list
EST_Litem * head() const {return list.head();};
/// Empty list.
void clear();
/**@name Access functions.
*/
//@{
/// return value according to key (const)
const V &val(const K &rkey, bool m=0) const;
/// return value according to key (non-const)
V &val(const K &rkey, bool m=0);
/// return value according to ptr
const V &val(EST_Litem *ptr, bool m=0) const;
/// return value according to ptr
V &val(EST_Litem *ptr, bool m=0);
/// value or default
const V &val_def(const K &rkey, const V &def) const;
/// find key, reference by ptr
const K &key(EST_Litem *ptr, int m=1) const;
/// find key, reference by ptr
K &key(EST_Litem *ptr, int m=1);
/// return first matching key, referenced by val
const K &key(const V &v, int m=1) const;
/** change key-val pair. If no corresponding entry is present, add
to end of list.
*/
int change_val(const K &rkey,const V &rval);
/** change key-val pair. If no corresponding entry is present, add
to end of list.*/
int change_val(EST_Litem *ptr,const V &rval); // change key-val pair.
/// change name of key pair.
int change_key(EST_Litem *ptr,const K &rkey);
/// add key-val pair to list
int add_item(const K &rkey,const V &rval, int no_search = 0);
/// remove key and val pair from list
int remove_item(const K &rkey, int quiet = 0);
//@}
/// Returns true if key is present.
const int present(const K &rkey) const;
/// apply function to each pair
void map(void (*func)(K&, V&));
friend ostream& operator << (ostream& s, EST_TKVL<K,V> const &kv);
/// full copy of KV list.
EST_TKVL<K, V> & operator = (const EST_TKVL<K,V> &kv);
/// add kv after existing list.
EST_TKVL<K, V> & operator += (const EST_TKVL<K,V> &kv);
/// make new concatenated list
EST_TKVL<K, V> operator + (const EST_TKVL<K,V> &kv);
// Iteration support
protected:
struct IPointer { EST_Litem *p; };
void point_to_first(IPointer &ip) const { ip.p = list.head(); }
void move_pointer_forwards(IPointer &ip) const { ip.p = next(ip.p); }
bool points_to_something(const IPointer &ip) const { return ip.p != NULL; }
EST_TKVI<K, V> &points_at(const IPointer &ip) { return list(ip.p); }
friend class EST_TIterator< EST_TKVL<K, V>, IPointer, EST_TKVI<K, V> >;
friend class EST_TStructIterator< EST_TKVL<K, V>, IPointer, EST_TKVI<K, V> >;
friend class EST_TRwIterator< EST_TKVL<K, V>, IPointer, EST_TKVI<K, V> >;
friend class EST_TRwStructIterator< EST_TKVL<K, V>, IPointer, EST_TKVI<K, V> >;
public:
typedef EST_TKVI<K, V> Entry;
typedef EST_TStructIterator< EST_TKVL<K, V>, IPointer, Entry> Entries;
typedef EST_TRwStructIterator< EST_TKVL<K, V>, IPointer, Entry> RwEntries;
// Iteration support
protected:
struct IPointer_k { EST_Litem *p; };
void point_to_first(IPointer_k &ip) const { ip.p = list.head(); }
void move_pointer_forwards(IPointer_k &ip) const { ip.p = next(ip.p); }
bool points_to_something(const IPointer_k &ip) const { return ip.p != NULL; }
K &points_at(const IPointer_k &ip) { return list(ip.p).k; }
friend class EST_TIterator< EST_TKVL<K, V>, IPointer_k, K >;
friend class EST_TRwIterator< EST_TKVL<K, V>, IPointer_k, K >;
public:
typedef K KeyEntry;
typedef EST_TIterator< EST_TKVL<K, V>, IPointer_k, KeyEntry> KeyEntries;
typedef EST_TRwIterator< EST_TKVL<K, V>, IPointer_k, KeyEntry> KeyRwEntries;
};
template<class K, class V>
extern ostream& operator << (ostream& s, EST_TKVI<K,V> const &i);
template<class K, class V>
extern ostream& operator << (ostream& s, EST_TKVL<K,V> const &l);
#endif // __KVL_H__
+125
View File
@@ -0,0 +1,125 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996,1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
#ifndef __EST_KVL_I_H__
#define __EST_KVL_I_H__
/** Instantiate rules for list template.
*
* @author Richard Caley <rjc@cstr.ed.ac.uk>
* @version $Id: EST_TKVLI.h,v 1.3 2004/05/04 00:00:17 awb Exp $
*/
#include "EST_TListI.h"
#include "EST_TIteratorI.h"
// Instantiation Macros
// the typedef is purely to get the type name through the following macro.
#define Instantiate_KVL_T(KEY, VAL, TAG) \
template class EST_TKVL<KEY, VAL>; \
template class EST_TKVI<KEY, VAL>; \
ostream &operator<<(ostream &s, EST_TKVI< KEY , VAL > const &i){ return s << i.k << "\t" << i.v << "\n"; } \
ostream& operator << (ostream& s, EST_TKVL< KEY , VAL > const &l) {EST_Litem *p; for (p = l.list.head(); p ; p = next(p)) s << l.list(p).k << "\t" << l.list(p).v << endl; return s;} \
Instantiate_TIterator_T(KVL_ ## TAG ## _t, KVL_ ## TAG ## _t::IPointer_k, KEY, KVL_ ## TAG ##_kitt) \
Instantiate_TStructIterator_T(KVL_ ## TAG ## _t, KVL_ ## TAG ## _t::IPointer, KVI_ ## TAG ## _t, KVL_ ## TAG ##_itt) \
Instantiate_TIterator_T(KVL_ ## TAG ## _t, KVL_ ## TAG ## _t::IPointer, KVI_ ## TAG ## _t, KVL_ ## TAG ##_itt) \
Instantiate_TList(KVI_ ## TAG ## _t)
// template ostream & operator<<(ostream &s, EST_TKVI<KEY, VAL> const &i);
#define Instantiate_KVL(KEY, VAL) \
Instantiate_KVL_T(KEY, VAL, KEY ## VAL)
#define Declare_KVL_TN(KEY, VAL, MaxFree, TAG) \
typedef EST_TKVI<KEY, VAL> KVI_ ## TAG ## _t; \
typedef EST_TKVL<KEY, VAL> KVL_ ## TAG ## _t; \
\
static VAL TAG##_kv_def_val_s; \
static KEY TAG##_kv_def_key_s; \
\
template <> VAL *EST_TKVL< KEY, VAL >::default_val=&TAG##_kv_def_val_s; \
template <> KEY *EST_TKVL< KEY, VAL >::default_key=&TAG##_kv_def_key_s; \
\
Declare_TList_N(KVI_ ## TAG ## _t, MaxFree)
#define Declare_KVL_T(KEY, VAL, TAG) \
Declare_KVL_TN(KEY, VAL, 0, TAG)
#define Declare_KVL_Base_TN(KEY, VAL, DEFV, DEFK, MaxFree, TAG) \
typedef EST_TKVI<KEY, VAL> KVI_ ## TAG ## _t; \
typedef EST_TKVL<KEY, VAL> KVL_ ## TAG ## _t; \
\
static VAL TAG##_kv_def_val_s=DEFV; \
static KEY TAG##_kv_def_key_s=DEFK; \
\
template <> VAL *EST_TKVL< KEY, VAL >::default_val=&TAG##_kv_def_val_s; \
template <> KEY *EST_TKVL< KEY, VAL >::default_key=&TAG##_kv_def_key_s; \
\
Declare_TList_N(KVI_ ## TAG ## _t, MaxFree)
#define Declare_KVL_Base_T(KEY, VAL, DEFV, DEFK, TAG) \
Declare_KVL_Base_TN(KEY, VAL, DEFV, DEFK, 0, TAG)
#define Declare_KVL_Class_TN(KEY, VAL, DEFV, DEFK, MaxFree, TAG) \
typedef EST_TKVI<KEY, VAL> KVI_ ## TAG ## _t; \
typedef EST_TKVL<KEY, VAL> KVL_ ## TAG ## _t; \
\
static VAL TAG##_kv_def_val_s(DEFV); \
static KEY TAG##_kv_def_key_s(DEFK); \
\
template <> VAL *EST_TKVL< KEY, VAL >::default_val=&TAG##_kv_def_val_s; \
template <> KEY *EST_TKVL< KEY, VAL >::default_key=&TAG##_kv_def_key_s; \
\
Declare_TList_N(KVI_ ## TAG ## _t, MaxFree)
#define Declare_KVL_Class_T(KEY, VAL, DEFV, DEFK,TAG) \
Declare_KVL_Class_TN(KEY, VAL, DEFV, DEFK, 0, TAG)
#define Declare_KVL_N(KEY, VAL, MaxFree) \
Declare_KVL_TN(KEY, VAL, MaxFree, KEY ## VAL)
#define Declare_KVL(KEY, VAL) \
Declare_KVL_N(KEY, VAL, 0)
#define Declare_KVL_Base_N(KEY, VAL, DEFV, DEFK, MaxFree) \
Declare_KVL_Base_TN(KEY, VAL, DEFV, DEFK, , MaxFree, KEY ## VAL)
#define Declare_KVL_Base(KEY, VAL, DEFV, DEFK) \
Declare_KVL_Base_N(KEY, VAL, DEFV, DEFK, 0)
#define Declare_KVL_Class_N(KEY, VAL, DEFV, DEFK, MaxFree) \
Declare_KVL_Class_TN(KEY, VAL, DEFV, DEFK, MaxFree, KEY ## VAL)
#define Declare_KVL_Class(KEY, VAL, DEFV, DEFK) \
Declare_KVL_Class_N(KEY, VAL, DEFV, DEFK, 0)
#endif
+315
View File
@@ -0,0 +1,315 @@
/*************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1995,1996 */
/* All Rights Reserved. */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* */
/* Author : Paul Taylor */
/* Date : April 1995 */
/* --------------------------------------------------------------------- */
/* Double linked list class */
/* */
/* Modified by RJC, 21/7/97. Now much of the working code is in the */
/* UList class, this template class provides a type safe front end to */
/* the untyped list. */
/* */
/*************************************************************************/
#ifndef __Tlist_H__
#define __Tlist_H__
#include <iostream>
#include "EST_common.h"
#include "EST_UList.h"
#include "EST_TSortable.h"
#include "EST_TIterator.h"
#include "EST_TListI.h"
class EST_String;
template<class T> class EST_TList;
template<class T> class EST_TItem : public EST_UItem {
private:
static void *operator new(size_t not_used, void *place)
{(void)not_used; return place;}
static void *operator new(size_t size)
{return malloc(size);}
static void operator delete(void *p)
{free(p);}
static EST_TItem *s_free;
static unsigned int s_nfree;
static unsigned int s_maxFree;
protected:
static EST_TItem *make(const T &val);
static void release(EST_TItem<T> *it);
friend class EST_TList<T>;
public:
T val;
EST_TItem(const T &v) : val(v)
{ init(); };
EST_TItem()
{ init();};
};
// pretty name
typedef EST_UItem EST_Litem;
/**
A Template doubly linked list class. This class contains doubly linked
lists of a type denoted by {\tt T}. A pointer of type \Ref{EST_Litem}
is used to access items in the list. The class supports a variety of
ways of adding, removing and accessing items in the list. For examples
of how to operate lists, see \Ref{list_example}.
Iteration through the list is performed using a pointer of type
\Ref{EST_Litem}. See \Ref{Iteration} for example code.
*/
template <class T> class EST_TList : public EST_UList
{
private:
void copy_items(const EST_TList<T> &l);
public:
void init() { EST_UList::init(); };
static void free_item(EST_UItem *item);
/**@name Constructor functions */
//@{
/// default constructor
EST_TList() { };
/// copy constructor
EST_TList(const EST_TList<T> &l);
~ EST_TList() { clear_and_free(free_item); }
//@}
/**@name Access functions for reading and writing items.
See \Ref{EST_TList_Accessing} for examples.*/
//@{
/** return the value associated with the EST_Litem pointer. This
has the same functionality as the overloaded () operator.
*/
T &item(const EST_Litem *p)
{ return ((EST_TItem<T> *)p) -> val; };
/** return a const value associated with the EST_Litem pointer.*/
const T &item(const EST_Litem *p) const
{ return ((EST_TItem<T> *)p) -> val; };
/// return the Nth value
T &nth(int n)
{ return item(nth_pointer(n)); };
/// return a const Nth value
const T &nth(int n) const
{ return item(nth_pointer(n)); };
/// return const reference to first item in list
const T &first() const
{ return item(head()); };
/// return const reference to last item in list
const T &last() const
{ return item(tail()); };
/** return reference to first item in list
* @see last
*/
T &first()
{ return item(head()); };
/// return reference to last item in list
T &last()
{ return item(tail()); };
/// return const reference to item in list pointed to by {\tt ptr}
const T &operator () (const EST_Litem *ptr) const
{ return item(ptr); };
/// return non-const reference to item in list pointed to by {\tt ptr}
T &operator () (const EST_Litem *ptr)
{ return item(ptr); };
//@}
/**@name Removing items in a list.
more.
*/
//@{
/** remove item pointed to by {\tt ptr}, return pointer to previous item.
See \Ref{Removing} for example code.*/
EST_Litem *remove(EST_Litem *ptr)
{ return EST_UList::remove(ptr, free_item); };
/// remove nth item, return pointer to previous item
EST_Litem *remove_nth(int n)
{ return EST_UList::remove(n, free_item); };
//@}
/**@name Adding items to a list.
In all cases, a complete copy of
the item is made and added to the list. See \Ref{Addition} for examples.
*/
//@{
/// add item onto end of list
void append(const T &item)
{ EST_UList::append(EST_TItem<T>::make(item)); };
/// add item onto start of list
void prepend(const T &item)
{ EST_UList::prepend(EST_TItem<T>::make(item)); };
/** add {\tt item} after position given by {\tt ptr}, return pointer
to added item. */
EST_Litem *insert_after(EST_Litem *ptr, const T &item)
{ return EST_UList::insert_after(ptr, EST_TItem<T>::make(item)); };
/** add {\tt item} before position given by {\tt ptr}, return
pointer to added item. */
EST_Litem *insert_before(EST_Litem *ptr, const T &item)
{ return EST_UList::insert_before(ptr, EST_TItem<T>::make(item)); };
//@}
/**@name Exchange */
//@{
/// exchange 1
void exchange(EST_Litem *a, EST_Litem *b)
{ EST_UList::exchange(a, b); };
/// exchange 2
void exchange(int i, int j)
{ EST_UList::exchange(i,j); };
/// exchange 3
static void exchange_contents(EST_Litem *a, EST_Litem *b);
//@}
/**@name General functions */
//@{
/// make full copy of list
EST_TList<T> &operator=(const EST_TList<T> &a);
/// Add list onto end of existing list
EST_TList<T> &operator +=(const EST_TList<T> &a);
/// print list
friend ostream& operator << (ostream &st, EST_TList<T> const &list);
/// remove all items in list
void clear(void)
{ clear_and_free(free_item); };
//@}
// Iteration support
protected:
struct IPointer { EST_Litem *p; };
void point_to_first(IPointer &ip) const { ip.p = head(); }
void move_pointer_forwards(IPointer &ip) const { ip.p = next(ip.p); }
bool points_to_something(const IPointer &ip) const { return ip.p != NULL; }
T &points_at(const IPointer &ip) { return item(ip.p); }
friend class EST_TIterator< EST_TList<T>, IPointer, T >;
friend class EST_TRwIterator< EST_TList<T>, IPointer, T >;
public:
typedef T Entry;
typedef EST_TIterator< EST_TList<T>, IPointer, T > Entries;
typedef EST_TRwIterator< EST_TList<T>, IPointer, T > RwEntries;
};
template<class T>
extern ostream& operator << (ostream &st, EST_TList< T > const &list);
template<class T>
bool operator==(const EST_TList<T> &a, const EST_TList<T> &b)
{
return EST_UList::operator_eq(a, b, EST_TSortable<T>::items_eq);
}
template<class T>
int index(EST_TList<T> &l, T& val, bool (*eq)(const EST_UItem *, const EST_UItem *) = NULL)
{
EST_TItem<T> item(val);
return EST_UList::index(l, item, eq?eq:EST_TSortable<T>::items_eq);
}
template<class T>
void sort(EST_TList<T> &a, bool (*gt)(const EST_UItem *, const EST_UItem *) = NULL)
{
EST_UList::sort(a, gt?gt:EST_TSortable<T>::items_gt);
}
template<class T>
void ptr_sort(EST_TList<T> &a)
{
EST_UList::sort(a, EST_TSortable<T *>::items_gt);
}
template<class T>
void qsort(EST_TList<T> &a, bool (*gt)(const EST_UItem *, const EST_UItem *) = NULL)
{
EST_UList::qsort(a, gt?gt:EST_TSortable<T>::items_gt, EST_TList<T>::exchange_contents);
}
template<class T>
void ptr_qsort(EST_TList<T> &a)
{
EST_UList::qsort(a, EST_TSortable<T *>::items_gt, EST_TList<T>::exchange_contents);
}
template<class T>
void sort_unique(EST_TList<T> &l)
{
EST_UList::sort_unique(l,
EST_TSortable<T>::items_eq,
EST_TSortable<T>::items_gt,
EST_TList<T>::free_item);
}
template<class T>
void merge_sort_unique(EST_TList<T> &l, EST_TList<T> &m)
{
EST_UList::merge_sort_unique(l, m,
EST_TSortable<T>::items_eq,
EST_TSortable<T>::items_gt,
EST_TList<T>::free_item);
}
template<class T>
const char *error_name(EST_TList<T> val) { (void)val; return "<<TLIST>>"; }
#endif
+92
View File
@@ -0,0 +1,92 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996,1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
#ifndef __EST_TLIST_I_H__
#define __EST_TLIST_I_H__
/** Instantiate rules for list template.
*
* @author Richard Caley <rjc@cstr.ed.ac.uk>
* @version $Id: EST_TListI.h,v 1.3 2004/05/04 00:00:17 awb Exp $
*/
// Instantiation Macros
#include <iostream>
#include "EST_TIteratorI.h"
#define Instantiate_TList_T_MIN(TYPE, TAG) \
template class EST_TList< TLIST_ ## TAG ## _VAL >; \
template class EST_TItem< TLIST_ ## TAG ## _VAL >; \
template const char *error_name(EST_TList< TYPE > val); \
Instantiate_TIterator_T( EST_TList<TYPE>, EST_TList<TYPE>::IPointer, TYPE, TList_ ## TAG ## _itt);
#define Instantiate_TList_T(TYPE, TAG) \
Instantiate_TList_T_MIN(TYPE, TAG) \
\
ostream& operator << (ostream &st, EST_TList< TYPE > const &list) { EST_Litem *ptr; for (ptr = list.head(); ptr != 0; ptr = next(ptr)) st << list.item(ptr) << " "; return st;}
#define Instantiate_TList(TYPE) Instantiate_TList_T(TYPE, TYPE)
#define Declare_TList_TN(TYPE,MaxFree,TAG) \
typedef TYPE TLIST_ ## TAG ## _VAL; \
template <> EST_TItem< TYPE > * EST_TItem< TYPE >::s_free=NULL; \
template <> unsigned int EST_TItem< TYPE >::s_maxFree=MaxFree; \
template <> unsigned int EST_TItem< TYPE >::s_nfree=0;
#define Declare_TList_T(TYPE,TAG) \
Declare_TList_TN(TYPE,0,TAG)
#define Declare_TList_Base_TN(TYPE,MaxFree,TAG) \
Declare_TList_TN(TYPE,MaxFree,TAG)
#define Declare_TList_Base_T(TYPE,TAG) \
Declare_TList_Base_TN(TYPE,0,TAG) \
#define Declare_TList_Class_TN(TYPE,MaxFree,TAG) \
Declare_TList_TN(TYPE,MaxFree,TAG)
#define Declare_TList_Class_T(TYPE,TAG) \
Declare_TList_Class_TN(TYPE,0,TAG) \
#define Declare_TList_N(TYPE,MaxFree) Declare_TList_TN(TYPE,MaxFree,TYPE)
#define Declare_TList_Base_N(TYPE,MaxFree) Declare_TList_Base_TN(TYPE,MaxFree,TYPE)
#define Declare_TList_Class_N(TYPE,MaxFree) Declare_TList_Class_TN(TYPE,MaxFree,TYPE)
#define Declare_TList(TYPE) Declare_TList_N(TYPE,0)
#define Declare_TList_Base(TYPE) Declare_TList_Base_N(TYPE,0)
#define Declare_TList_Class(TYPE) Declare_TList_Class_N(TYPE,0)
#endif
+321
View File
@@ -0,0 +1,321 @@
/*************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* */
/* Author : Paul Taylor */
/* Rewritten : Richard Caley */
/* --------------------------------------------------------------------- */
/* Matrix class */
/* */
/*************************************************************************/
#ifndef __TMatrix_H__
#define __TMatrix_H__
#include <iostream>
#include "EST_rw_status.h"
#include "EST_TVector.h"
#include "EST_TMatrixI.h"
/* When set bounds checks (safe but slow) are done on matrix access */
#ifndef TMATRIX_BOUNDS_CHECKING
# define TMATRIX_BOUNDS_CHECKING 0
#endif
#if TMATRIX_BOUNDS_CHECKING
#define A_CHECK a_check
#else
#define A_CHECK a_no_check
#endif
#define INLINE inline
/* This doesn't work as I thought so I have disabled it for now.
*/
#if defined(__GNUC__) && 0
# define mx_move_pointer(P, TY, STEP, N) \
((TY *)\
((void *) (((char (*) [sizeof(TY)*STEP])P) + N) ) \
)
# define fast_a_m_gcc(R,C) \
( * mx_move_pointer(mx_move_pointer(p_memory,T,p_column_step,C),T,p_row_step,R))
# define fast_a_m_x(R,C) (fast_a_m_gcc(R,C))
#else
# define fast_a_m_x(R,C) (fast_a_m(R,C))
#endif
/** Template Matrix class.
*
* This is an extension of the EST_TVector class to two dimensions.
*
* @see matrix_example
* @see EST_TVector
*/
template <class T>
class EST_TMatrix : public EST_TVector<T>
{
protected:
/// Visible shape
unsigned int p_num_rows;
/// How to access the memory
unsigned int p_row_step;
INLINE unsigned int mcell_pos(int r, int c,
int rs, int cs) const
{ return (rs==1?r:(r*rs)) + (cs==1?c:(c*cs));}
INLINE unsigned int mcell_pos(int r, int c) const
{
return mcell_pos(r, c,
this->p_row_step, this->p_column_step);
}
INLINE unsigned int mcell_pos_1(int r, int c) const
{
(void)r;
return c;
}
/// quick method for returning {\tt x[m][n]}
INLINE const T &fast_a_m(int r, int c) const
{ return this->p_memory[mcell_pos(r,c)]; }
INLINE T &fast_a_m(int r, int c)
{ return this->p_memory[mcell_pos(r,c)]; }
INLINE const T &fast_a_1(int r, int c) const
{ return this->p_memory[mcell_pos_1(r,c)]; }
INLINE T &fast_a_1(int r, int c)
{ return this->p_memory[mcell_pos_1(r,c)]; }
/// Get and set values from array
void set_values(const T *data,
int r_step, int c_step,
int start_r, int num_r,
int start_c, int num_c
);
void get_values(T *data,
int r_step, int c_step,
int start_r, int num_r,
int start_c, int num_c
) const;
/// private resize and copy function.
void copy(const EST_TMatrix<T> &a);
/// just copy data, no resizing, no size check.
void copy_data(const EST_TMatrix<T> &a);
/// resize the memory and reset the bounds, but don't set values.
void just_resize(int new_rows, int new_cols, T** old_vals);
/// sets data and length to default values (0 in both cases).
void default_vals();
public:
///default constructor
EST_TMatrix();
/// copy constructor
EST_TMatrix(const EST_TMatrix<T> &m);
/// "size" constructor
EST_TMatrix(int rows, int cols);
/// construct from memory supplied by caller
EST_TMatrix(int rows, int cols,
T *memory, int offset=0, int free_when_destroyed=0);
/// EST_TMatrix
~EST_TMatrix();
/**@name access
* Basic access methods for matrices.
*/
//@{
/// return number of rows
int num_rows() const {return this->p_num_rows;}
/// return number of columns
int num_columns() const {return this->p_num_columns;}
/// const access with no bounds check, care recommend
INLINE const T &a_no_check(int row, int col) const
{ return fast_a_m_x(row,col); }
/// access with no bounds check, care recommend
INLINE T &a_no_check(int row, int col)
{ return fast_a_m_x(row,col); }
INLINE const T &a_no_check_1(int row, int col) const { return fast_a_1(row,col); }
INLINE T &a_no_check_1(int row, int col) { return fast_a_1(row,col); }
/// const element access function
const T &a_check(int row, int col) const;
/// non-const element access function
T &a_check(int row, int col);
const T &a(int row, int col) const { return A_CHECK(row,col); }
T &a(int row, int col) { return A_CHECK(row,col); }
/// const element access operator
const T &operator () (int row, int col) const { return a(row,col); }
/// non-const element access operator
T &operator () (int row, int col) { return a(row,col); }
//@}
bool have_rows_before(int n) const;
bool have_columns_before(int n) const;
/** resize matrix. If {\tt set=1}, then the current values in
the matrix are preserved up to the new size {\tt n}. If the
new size exceeds the old size, the rest of the matrix is
filled with the {\tt def_val}
*/
void resize(int rows, int cols, int set=1);
/// fill matrix with value v
void fill(const T &v);
void fill() { fill(*this->def_val); }
/// assignment operator
EST_TMatrix &operator=(const EST_TMatrix &s);
/// The two versions of what might have been operator +=
EST_TMatrix &add_rows(const EST_TMatrix &s);
EST_TMatrix &add_columns(const EST_TMatrix &s);
/**@name Sub-Matrix/Vector Extraction
*
* All of these return matrices and vectors which share
* memory with the original, so altering values them alters
* the original.
*/
//@{
/// Make the vector {\tt rv} a window onto row {\tt r}
void row(EST_TVector<T> &rv, int r, int start_c=0, int len=-1);
/// Make the vector {\tt cv} a window onto column {\tt c}
void column(EST_TVector<T> &cv, int c, int start_r=0, int len=-1);
/// Make the matrix {\tt sm} a window into this matrix.
void sub_matrix(EST_TMatrix<T> &sm,
int r=0, int numr=EST_ALL,
int c=0, int numc=EST_ALL);
//@}
/**@name Copy in and out
* Copy data between buffers and the matrix.
*/
//@{
/** Copy row {\tt r} of matrix to {\tt buf}. {\tt buf}
should be pre-malloced to the correct size.
*/
void copy_row(int r, T *buf, int offset=0, int num=-1) const;
/** Copy row <parameter>r</parameter> of matrix to
<parameter>buf</parameter>. <parameter>buf</parameter> should be
pre-malloced to the correct size. */
void copy_row(int r, EST_TVector<T> &t, int offset=0, int num=-1) const;
/** Copy column {\tt c} of matrix to {\tt buf}. {\tt buf}
should be pre-malloced to the correct size.
*/
void copy_column(int c, T *buf, int offset=0, int num=-1) const;
/** Copy column <parameter>c</parameter> of matrix to
<parameter>buf</parameter>. <parameter>buf</parameter> should
be pre-malloced to the correct size. */
void copy_column(int c, EST_TVector<T> &t, int offset=0, int num=-1)const;
/** Copy buf into row {\tt n} of matrix.
*/
void set_row(int n, const T *buf, int offset=0, int num=-1);
void set_row(int n, const EST_TVector<T> &t, int offset=0, int num=-1)
{ set_row(n, t.memory(), offset, num); }
void set_row(int r,
const EST_TMatrix<T> &from, int from_r, int from_offset=0,
int offset=0, int num=-1); // set nth row
/** Copy buf into column {\tt n} of matrix.
*/
void set_column(int n, const T *buf, int offset=0, int num=-1);
void set_column(int n, const EST_TVector<T> &t, int offset=0, int num=-1)
{ set_column(n, t.memory(), offset, num); }
void set_column(int c,
const EST_TMatrix<T> &from, int from_c, int from_offset=0,
int offset=0, int num=-1); // set nth column
/** For when you absolutely have to have access to the memory.
*/
void set_memory(T *buffer, int offset, int rows, int columns,
int free_when_destroyed=0);
//@}
/**@name io
* Matrix file io.
*/
//@{
/// load Matrix from file - Not currently implemented.
EST_read_status load(const class EST_String &filename);
/// save Matrix to file {\tt filename}
EST_write_status save(const class EST_String &filename) const;
/// print matrix.
friend ostream& operator << (ostream &st,const EST_TMatrix<T> &a);
//@}
};
#undef A_CHECK
template <class T>
extern ostream& operator << (ostream &st,const EST_TMatrix<T> &a);
#endif
+64
View File
@@ -0,0 +1,64 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996,1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
#ifndef __EST_TMATRIX_I_H__
#define __EST_TMATRIX_I_H__
/** Instantiate rules for matrix template.
*
* @author Richard Caley <rjc@cstr.ed.ac.uk>
* @version $Id: EST_TMatrixI.h,v 1.2 2001/04/04 13:11:27 awb Exp $
*/
// Instantiation Macros
#define Instantiate_TMatrix(TYPE) \
template class EST_TMatrix< TYPE >; \
\
ostream& operator << (ostream &st, const EST_TMatrix< TYPE > &a) {int i, j; for (i = 0; i < a.num_rows(); ++i) {for (j = 0; j < a.num_columns(); ++j) st << a.a_no_check(i, j) << " "; st << endl;} return st;}
#define Declare_TMatrix_T(TYPE,TAG)
#define Declare_TMatrix_Base_T(TYPE,DEFAULT,ERROR,TAG)
#define Declare_TMatrix_Class_T(TYPE,DEFAULT,ERROR,TAG)
#define Declare_TMatrix(TYPE) Declare_TMatrix_T(TYPE,TYPE)
#define Declare_TMatrix_Base(TYPE,DEFAULT,ERROR) Declare_TMatrix_Base_T(TYPE,DEFAULT,ERROR,TYPE)
#define Declare_TMatrix_Class(TYPE,DEFAULT,ERROR) Declare_TMatrix_Class_T(TYPE,DEFAULT,ERROR,TYPE)
#endif
+166
View File
@@ -0,0 +1,166 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996,1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/************************************************************************/
/* Author: Richard Caley (rjc@cstr.ed.ac.uk) */
/* Date: Fri Feb 28 1997 */
/************************************************************************/
/* */
/* A template class which allows names (const char *s) to be */
/* associated with enums, providing conversion. */
/* */
/* EST_TValuesEnum is the obvious generalisation to associating */
/* things other than const char * with each value. */
/* */
/* EST_T{Named/Valued}EnumI can include extra information for each */
/* enum element. */
/* */
/* This should be rewritten as something other than linear search. At */
/* least sort them. */
/* */
/************************************************************************/
#ifndef __EST_TNAMEDENUM_H__
#define __EST_TNAMEDENUM_H__
#include <string.h>
#include "EST_String.h"
#include "EST_rw_status.h"
#define NAMED_ENUM_MAX_SYNONYMS (10)
// Used in the type of tables with no info field.
typedef char NO_INFO;
// struct used to define the mapping.
template<class ENUM, class VAL, class INFO>
struct EST_TValuedEnumDefinition {
public:
ENUM token;
VAL values[NAMED_ENUM_MAX_SYNONYMS];
INFO info;
} ;
// This is the most general case, a mapping from enum to some other type
// with extra info.
template<class ENUM, class VAL, class INFO> class EST_TValuedEnumI {
protected:
int ndefinitions;
ENUM p_unknown_enum;
VAL p_unknown_value;
EST_TValuedEnumDefinition<ENUM,VAL,INFO> *definitions;
virtual int eq_vals(VAL v1, VAL v2) const {return v1 == v2; };
// This is only a void * because INFO can`t manage to get the
// parameter declaration in the definition past gcc with the actual type.
void initialise(const void *defs);
void initialise(const void *defs, ENUM (*conv)(const char *));
void initialise(void) {ndefinitions=0; definitions=NULL;};
void initialise(ENUM unknown_e, VAL unknown_v) {initialise(); p_unknown_enum=unknown_e; p_unknown_value = unknown_v;};
protected:
EST_TValuedEnumI(void) {initialise();};
public:
EST_TValuedEnumI(EST_TValuedEnumDefinition<ENUM,VAL,INFO> defs[])
{initialise((const void *)defs); };
EST_TValuedEnumI(EST_TValuedEnumDefinition<const char *,VAL,INFO> defs[], ENUM (*conv)(const char *))
{initialise((const void *)defs, conv); };
virtual ~EST_TValuedEnumI(void);
int n(void) const;
ENUM token(VAL value) const;
ENUM token(int n) const { return nth_token(n); }
ENUM nth_token(int n) const;
VAL value(ENUM token, int n=0) const;
INFO &info(ENUM token) const;
ENUM unknown_enum(void) const {return p_unknown_enum;};
VAL unknown_value(void) const {return p_unknown_value;};
int valid(ENUM token) const { return !eq_vals(value(token),p_unknown_value); };
};
// This is a special case for names. This saves typing and also
// takes care of the fact that strings need their own compare function.
template<class ENUM, class INFO> class EST_TNamedEnumI : public EST_TValuedEnumI<ENUM, const char *, INFO> {
protected:
EST_TNamedEnumI(void) : EST_TValuedEnumI<ENUM, const char *, INFO>() {};
int eq_vals(const char *v1, const char *v2) const {return strcmp(v1,v2) ==0; };
public:
EST_TNamedEnumI(EST_TValuedEnumDefinition<ENUM,const char *,INFO> defs[])
{this->initialise((const void *)defs); };
EST_TNamedEnumI(EST_TValuedEnumDefinition<const char *,const char *,INFO> defs[], ENUM (*conv)(const char *))
{this->initialise((const void *)defs, conv); };
const char *name(ENUM tok, int n=0) const {return value(tok,n); };
};
// Now the simple cases with no extra information
template<class ENUM, class VAL> class EST_TValuedEnum : public EST_TValuedEnumI<ENUM,VAL,NO_INFO> {
public:
EST_TValuedEnum(EST_TValuedEnumDefinition<ENUM,VAL,NO_INFO> defs[])
{this->initialise((const void *)defs);};
EST_TValuedEnum(EST_TValuedEnumDefinition<const char *,VAL,NO_INFO> defs[], ENUM (*conv)(const char *))
{this->initialise((const void *)defs, conv);};
};
template<class ENUM> class EST_TNamedEnum : public EST_TNamedEnumI<ENUM,NO_INFO> {
private:
EST_read_status priv_load(EST_String name, EST_TNamedEnum *definitive);
EST_write_status priv_save(EST_String name, EST_TNamedEnum *definitive, char quote) const;
public:
EST_TNamedEnum(ENUM undef_e, const char *undef_n = NULL)
{this->initialise(undef_e, undef_n);};
EST_TNamedEnum(EST_TValuedEnumDefinition<ENUM,const char *,NO_INFO> defs[])
{this->initialise((const void *)defs);};
EST_TNamedEnum(EST_TValuedEnumDefinition<const char *,const char *,NO_INFO> defs[], ENUM (*conv)(const char *))
{this->initialise((const void *)defs, conv);};
EST_read_status load(EST_String name) { return priv_load(name, NULL); };
EST_read_status load(EST_String name, EST_TNamedEnum &definitive) { return priv_load(name, &definitive); };
EST_write_status save(EST_String name, char quote='"') const { return priv_save(name, NULL, quote); };
EST_write_status save(EST_String name, EST_TNamedEnum &definitive, char quote='"') const { return priv_save(name, &definitive, quote); };
};
#include "EST_TNamedEnumI.h"
#endif
+157
View File
@@ -0,0 +1,157 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996,1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
#ifndef __EST_TNamedEnum_I_H__
#define __EST_TNamedEnum_I_H__
/** Instantiate rules for named enum template.
*
* @author Richard Caley <rjc@cstr.ed.ac.uk>
* @version $Id: EST_TNamedEnumI.h,v 1.2 2001/04/04 13:11:27 awb Exp $
*/
// Instantiation Macros
#define Instantiate_TValuedEnumI_T(ENUM, VAL, INFO, TAG) \
template class EST_TValuedEnumI< ENUM, VAL, INFO >; \
#define Instantiate_TValuedEnum_T(ENUM, VAL, TAG) \
Instantiate_TValuedEnumI_T(ENUM, VAL, NO_INFO, TAG)
#define Instantiate_TNamedEnumI_T(ENUM, INFO, TAG) \
template class EST_TNamedEnumI< ENUM, INFO >; \
Instantiate_TValuedEnumI_T(ENUM, const char *, INFO, TAG)
#define Instantiate_TNamedEnum_T(ENUM, TAG) \
Instantiate_TValuedEnumI_T(ENUM, const char *, NO_INFO, TAG) \
template class EST_TNamedEnum< ENUM >; \
template class EST_TNamedEnumI< ENUM, NO_INFO >;
#define Instantiate_TValuedEnumI(ENUM, VAL, INFO) \
Instantiate_TValuedEnumI_T(ENUM, VAL, INFO, ENUM ## VAL ## INFO )
#define Instantiate_TValuedEnum(ENUM, VAL) \
template class EST_TValuedEnum< ENUM, VAL >; \
Instantiate_TValuedEnum_T(ENUM, VAL, ENUM ## VAL)
#define Instantiate_TNamedEnumI(ENUM, INFO) \
Instantiate_TNamedEnumI_T(ENUM, INFO, ENUM ## INFO)
#define Instantiate_TNamedEnum(ENUM) \
Instantiate_TNamedEnum_T(ENUM, ENUM) \
// declaration macros. NULL at the moment.
#define Declare_TValuedEnumI_T(ENUM, VAL, INFO, TAG) \
/* EMPTY */
#define Declare_TValuedEnum_T(ENUM, VAL, TAG) \
Declare_TValuedEnumI_T(ENUM, VAL, NO_INFO, TAG)
#define Declare_TNamedEnumI_T(ENUM, INFO, TAG) \
Declare_TValuedEnumI_T(ENUM, const char *, INFO, TAG)
#define Declare_TNamedEnum_T(ENUM, TAG) \
Declare_TNamedEnumI_T(ENUM, NO_INFO, TAG)
#define Declare_TValuedEnumI(ENUM, VAL, INFO) \
Declare_TValuedEnumI_T(ENUM, VAL, INFO, ENUM ## VAL ## INFO )
#define Declare_TValuedEnum(ENUM, VAL) \
Declare_TValuedEnum_T(ENUM, VAL, ENUM ## VAL)
#define Declare_TNamedEnumI(ENUM, INFO) \
Declare_TNamedEnumI_T(ENUM, INFO, ENUM ## INFO)
#define Declare_TNamedEnum(ENUM) \
Declare_TNamedEnum_T(ENUM, ENUM)
// Actual table declaration macros
#define Create_TValuedEnumDefinition(ENUM, VAL, INFO, TAG) \
static EST_TValuedEnumDefinition< ENUM, VAL, INFO> TAG ## _names[]
#define Create_TNamedEnumDefinition(ENUM, INFO, TAG) \
Create_TValuedEnumDefinition(ENUM, const char *, INFO, TAG)
#define Start_TValuedEnumI_T(ENUM, VAL, INFO, NAME, TAG) \
Create_TValuedEnumDefinition(ENUM, VAL, INFO, TAG) = {
#define End_TValuedEnumI_T(ENUM, VAL, INFO, NAME, TAG) \
}; \
EST_TValuedEnumI< ENUM, VAL, INFO > NAME (TAG ## _names);
#define Start_TNamedEnumI_T(ENUM, INFO, NAME, TAG) \
Create_TValuedEnumDefinition(ENUM, const char *, INFO, TAG) = {
#define End_TNamedEnumI_T(ENUM, INFO, NAME, TAG) \
}; \
EST_TNamedEnumI< ENUM, INFO > NAME (TAG ## _names);
#define Start_TValuedEnumI(ENUM, VAL, INFO, NAME) \
Start_TValuedEnumI_T(ENUM, VAL, INFO, NAME, NAME)
#define End_TValuedEnumI(ENUM, VAL, INFO, NAME) \
End_TValuedEnumI_T(ENUM, VAL, INFO, NAME, NAME)
#define Start_TNamedEnumI(ENUM, INFO, NAME) \
Start_TNamedEnumI_T(ENUM, INFO, NAME, NAME)
#define End_TNamedEnumI(ENUM, INFO, NAME) \
End_TNamedEnumI_T(ENUM, INFO, NAME, NAME)
#define Start_TValuedEnum_T(ENUM, VAL, NAME, TAG) \
Create_TValuedEnumDefinition(ENUM, VAL, NO_INFO, TAG) = {
#define End_TValuedEnum_T(ENUM, VAL, NAME, TAG) \
}; \
EST_TValuedEnum< ENUM, VAL > NAME (TAG ## _names);
#define Start_TNamedEnum_T(ENUM, NAME, TAG) \
Create_TValuedEnumDefinition(ENUM, const char *, NO_INFO, TAG) = {
#define End_TNamedEnum_T(ENUM, NAME, TAG) \
}; \
EST_TNamedEnum< ENUM > NAME (TAG ## _names);
#define Start_TValuedEnum(ENUM, VAL, NAME) \
Start_TValuedEnum_T(ENUM, VAL, NAME, NAME)
#define End_TValuedEnum(ENUM, VAL, NAME) \
End_TValuedEnum_T(ENUM, VAL, NAME, NAME)
#define Start_TNamedEnum(ENUM, NAME) \
Start_TNamedEnum_T(ENUM, NAME, NAME)
#define End_TNamedEnum(ENUM, NAME) \
End_TNamedEnum_T(ENUM, NAME, NAME)
#endif
+74
View File
@@ -0,0 +1,74 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996,1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* */
/* Author: Richard Caley (rjc@cstr.ed.ac.uk) */
/* Date: Fri Oct 10 1997 */
/* -------------------------------------------------------------------- */
/* A subclass of TMatrix which copies using memcopy. This isn't */
/* suitable for matrices of class objects which have to be copied */
/* using a constructor or specialised assignment operator. */
/* */
/*************************************************************************/
#ifndef __EST_TSIMPLEMATRIX_H__
#define __EST_TSIMPLEMATRIX_H__
#include "EST_TMatrix.h"
#include "EST_TSimpleMatrixI.h"
template<class T>
class EST_TSimpleMatrix : public EST_TMatrix<T> {
protected:
// just copy data, no resizing.
void copy_data(const EST_TSimpleMatrix<T> &a);
public:
/// default constructor
EST_TSimpleMatrix(void) : EST_TMatrix<T>() {};
/// size constructor
EST_TSimpleMatrix(int m, int n) : EST_TMatrix<T>(m, n) {};
/// copy constructor
EST_TSimpleMatrix(const EST_TSimpleMatrix<T> &m);
/// copy one matrix into another
void copy(const EST_TSimpleMatrix<T> &a);
/// resize matrix
void resize(int rows, int cols, int set=1);
/// assignment operator
EST_TSimpleMatrix<T> &operator=(const EST_TSimpleMatrix<T> &s);
};
#endif
+52
View File
@@ -0,0 +1,52 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996,1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
#ifndef __EST_TSIMPLEMATRIX_I_H__
#define __EST_TSIMPLEMATRIX_I_H__
/** Instantiate rules for simple-matrix template.
*
* @author Richard Caley <rjc@cstr.ed.ac.uk>
* @version $Id: EST_TSimpleMatrixI.h,v 1.2 2001/04/04 13:11:27 awb Exp $
*/
#define Instantiate_TSimpleMatrix(TYPE) \
template class EST_TSimpleMatrix<TYPE>;
#define Declare_TSimpleMatrix_T(TYPE,TAG)
#define Declare_TSimpleMatrix(TYPE) Declare_TSimpleMatrix_T(TYPE,TYPE)
#endif
+80
View File
@@ -0,0 +1,80 @@
/*************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* */
/* Author: Richard Caley (rjc@cstr.ed.ac.uk) */
/* Date: Fri Oct 10 1997 */
/* -------------------------------------------------------------------- */
/* A subclass of TVector which copies using memcopy. This isn't */
/* suitable for matrices of class objects which have to be copied */
/* using a constructor or specialised assignment operator. */
/* */
/*************************************************************************/
#ifndef __EST_TSimpleVector_H__
#define __EST_TSimpleVector_H__
#include "EST_TVector.h"
#include "EST_TSimpleVectorI.h"
/** A derived class from <tt>EST_TVector</tt> which is used for
containing simple types, such as <tt>float</tt> or <tt>int</tt>.
*/
template <class T> class EST_TSimpleVector : public EST_TVector<T> {
private:
/// private copy function
void copy(const EST_TSimpleVector<T> &a);
public:
///default constructor
EST_TSimpleVector() : EST_TVector<T>() {};
/// copy constructor
EST_TSimpleVector(const EST_TSimpleVector<T> &v);
/// "size" constructor
EST_TSimpleVector(int n): EST_TVector<T>(n) {};
/// resize vector
void resize(int n, int set=1);
/// assignment operator
EST_TSimpleVector &operator=(const EST_TSimpleVector<T> &s);
void copy_section(T* dest, int offset=0, int num=-1) const;
void set_section(const T* src, int offset=0, int num=-1);
/// Fill entire array with 0 bits.
void zero(void);
/// Fill vector with default value
void empty(void) { if (*this->def_val == 0) zero(); else fill(*this->def_val); }
};
#endif
+52
View File
@@ -0,0 +1,52 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996,1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
#ifndef __EST_TSIMPLEVECTOR_I_H__
#define __EST_TSIMPLEVECTOR_I_H__
/** Instantiate rules for simple-vector template.
*
* @author Richard Caley <rjc@cstr.ed.ac.uk>
* @version $Id: EST_TSimpleVectorI.h,v 1.2 2001/04/04 13:11:27 awb Exp $
*/
#define Instantiate_TSimpleVector(TYPE) \
template class EST_TSimpleVector<TYPE>; \
#define Declare_TSimpleVector_T(TYPE,TAG)
#define Declare_TSimpleVector(TYPE) Declare_TSimpleVector_T(TYPE,TYPE)
#endif
+58
View File
@@ -0,0 +1,58 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996,1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* */
/* Author: Richard Caley (rjc@cstr.ed.ac.uk) */
/* Date: Thu Sep 4 1997 */
/* -------------------------------------------------------------------- */
/* A record which defines a sorting order. */
/* */
/*************************************************************************/
#ifndef __EST_TSORTABLE_H__
#define __EST_TSORTABLE_H__
#include "EST_UList.h"
#include "EST_TSortableI.h"
template<class T>
class EST_TSortable
{
public:
static bool items_eq(const EST_UItem *item1, const EST_UItem *item2);
static bool items_lt(const EST_UItem *item1, const EST_UItem *item2);
static bool items_gt(const EST_UItem *item1, const EST_UItem *item2);
};
#endif
+75
View File
@@ -0,0 +1,75 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996,1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
#ifndef __EST_TSORTABLE_I_H__
#define __EST_TSORTABLE_I_H__
/** Instantiate rules for sortable template.
*
* @author Richard Caley <rjc@cstr.ed.ac.uk>
* @version $Id: EST_TSortableI.h,v 1.2 2001/04/04 13:11:27 awb Exp $
*/
// Instantiation Macros
#define Instantiate_TSortable_T(TYPE, TAG) \
template class EST_TSortable<TYPE>; \
template class EST_TSortable<TYPE *>; \
\
template void sort(EST_TList<TYPE> &, bool (*gt)(const EST_UItem *, const EST_UItem *)); \
template void qsort(EST_TList<TYPE> &, bool (*gt)(const EST_UItem *, const EST_UItem *)); \
template void ptr_sort(EST_TList<TYPE> &a); \
template void ptr_qsort(EST_TList<TYPE> &a); \
template void sort_unique(EST_TList<TYPE> &a); \
template void merge_sort_unique(EST_TList<TYPE> &l, EST_TList<TYPE> &m); \
\
template bool operator==(const EST_TList<TYPE> &a, const EST_TList<TYPE> &b);
#define Instantiate_TSortable(TYPE) Instantiate_TSortable_T(TYPE, TYPE)
#define Declare_TSortable_T(TYPE,TAG)
#define Declare_TSortable_Base_T(TYPE,DEFAULT,ERROR,TAG)
#define Declare_TSortable_Class_T(TYPE,DEFAULT,ERROR,TAG)
#define Declare_TSortable(TYPE) Declare_TSortable_T(TYPE,TYPE)
#define Declare_TSortable_Base(TYPE,DEFAULT,ERROR) Declare_TSortable_Base_T(TYPE,DEFAULT,ERROR,TYPE)
#define Declare_TSortable_Class(TYPE,DEFAULT,ERROR) Declare_TSortable_Class_T(TYPE,DEFAULT,ERROR,TYPE)
#endif
+330
View File
@@ -0,0 +1,330 @@
/*************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* Author : Paul Taylor */
/* Date : April 1996 */
/*-----------------------------------------------------------------------*/
/* Vector class */
/* */
/*=======================================================================*/
#ifndef __EST_TVector_H__
#define __EST_TVector_H__
#include <iostream>
#include "EST_bool.h"
#include "EST_rw_status.h"
#include "EST_TVectorI.h"
template<class T> class EST_TMatrix;
template<class T> class EST_TList;
class EST_String;
/* A constants to make it clearer what is going on when we pass `-1'
* meaning `current size' or `all the rest'
*/
extern const int EST_CURRENT;
extern const int EST_ALL;
/* When set bounds checks (safe but slow) are done on vector access */
#ifndef TVECTOR_BOUNDS_CHECKING
# define TVECTOR_BOUNDS_CHECKING 0
#endif
#if TVECTOR_BOUNDS_CHECKING
#define A_CHECK a_check
#else
#define A_CHECK a_no_check
#endif
#define INLINE inline
/* This doesn't work as I thought so I have disabled it for now.
*/
#if defined(__GNUC__) && 0
# define fast_a_v_gcc(C) \
( *((T *)\
(((char (*) [sizeof(T)*p_column_step])p_memory) + (C))\
))
# define fast_a_v_x(C) (fast_a_v_gcc(C))
#else
# define fast_a_v_x(C) (fast_a_v(C))
#endif
/**@name Template vector
This serves as a base class for a vector
of type <type>T</type>. This acts as a higher level
version of a normal C array as defined as <type>float *x</type> etc.
The vector can be resized after declaration, access can be
with or without bounds checking. Round brackets denote read-only
access (for consts) while square brackets are for read-write access.
In both cases references are returned.
The standard operators () and [] should be thought of as
having no bounds checking, though they may do so optionally
as a compile time option. The methods <method>a_check</method> and
<method>a_nocheck</method> provide explicit boundary checking/nonchecking,
both const and non-const versions are provided.
Access through () and [] are guaranteed to be as fast as standard
C arrays (assuming a reasonable optimizing compiler).
<programlisting>
EST_FVector x(10);
int i;
for (i=0; i < x.length(); ++i)
x[i] = sqrt((float)i);
x.resize(20);
for (i=10; i < x.length(); ++i)
x[i] = sqrt((float)i);
</programlisting>
To instantiate a template for a a vector of type {FooBar}
<programlisting>
#include "../base_class/EST_TVector.cc"
// If you want List to vector conversion (and defined a TList)
#include "../base_class/EST_Tvectlist.cc"
template class EST_TVector<FooBar>;
template ostream& operator <<
(ostream &st, const EST_TVector<FooBar> &v);
</programlisting>
The EST library already has template vector instantiations for
<type>int</type>, <type>float</type>, <type>double</type> and
<docppRef linkend='EST_String'>. Also types are defined for them
in <docppRef linkend='EST_types.h'> as <docppRef
linkend='EST_IVector'>, <docppRef linkend='EST_FVector'>,
<docppRef linkend='EST_DVector'> and <docppRef
linkend='EST_StrVector'> for <type>int</type>s,
<type>float</type>s, <type>doubles</type>s and <docppRef
linkend='EST_String'>s respectively.
* @see matrix_example */
//@{
template <class T>
class EST_TVector
{
// protected:
public:
/** Pointer to the start of the vector.
* The start of allocated memory is p_memory-p_offset.
*/
T *p_memory;
/// Visible shape
unsigned int p_num_columns;
/// How to access the memory
unsigned int p_offset;
unsigned int p_column_step;
bool p_sub_matrix;
/// The memory access rule, in one place for easy reference
INLINE unsigned int vcell_pos(unsigned int c,
unsigned int cs) const
{return cs==1?c:c*cs;}
INLINE unsigned int vcell_pos(unsigned int c) const
{
return vcell_pos(c,
p_column_step);
}
INLINE unsigned int vcell_pos_1(unsigned int c) const
{
return c;
}
/// quick method for returning \(x[n]\)
INLINE const T &fast_a_v(int c) const { return p_memory[vcell_pos(c)]; }
INLINE T &fast_a_v(int c) { return p_memory[vcell_pos(c)]; }
INLINE const T &fast_a_1(int c) const { return p_memory[vcell_pos_1(c)]; }
INLINE T &fast_a_1(int c) { return p_memory[vcell_pos_1(c)]; }
/// Get and set values from array
void set_values(const T *data, int step, int start_c, int num_c);
void get_values(T *data, int step, int start_c, int num_c) const;
/// private copy function, called from all other copying functions.
void copy(const EST_TVector<T> &a);
/// just copy data, no resizing, no size check.
void copy_data(const EST_TVector<T> &a);
/// resize the memory and reset the bounds, but don't set values.
void just_resize(int new_cols, T** old_vals);
/// sets data and length to default values (0 in both cases).
void default_vals();
public:
///default constructor
EST_TVector();
/// copy constructor
EST_TVector(const EST_TVector<T> &v);
/// "size" constructor - make vector of size n.
EST_TVector(int n);
/// construct from memory supplied by caller
EST_TVector(int,
T *memory, int offset=0, int free_when_destroyed=0);
/// destructor.
~EST_TVector();
/// default value, used for filling matrix after resizing
static const T *def_val;
/** A reference to this variable is returned if you try and access
* beyond the bounds of the matrix. The value is undefined, but you
* can check for the reference you get having the same address as
* this variable to test for an error.
*/
static T *error_return;
/** resize vector. If <expr>set=1</expr>, then the current values in
the vector are preserved up to the new length <parameter>n</parameter>. If the
new length exceeds the old length, the rest of the vector is
filled with the <variable>def_val</variable>
*/
void resize(int n, int set=1);
/** For when you absolutely have to have access to the memory.
*/
const T * memory() const { return p_memory; }
T * memory(){ return p_memory; }
/**@name access
* Basic access methods for vectors.
*/
//@{
/// number of items in vector.
INLINE int num_columns() const {return p_num_columns;}
/// number of items in vector.
INLINE int length() const {return num_columns();}
/// number of items in vector.
INLINE int n() const {return num_columns();}
/// read-only const access operator: without bounds checking
INLINE const T &a_no_check(int n) const { return fast_a_v_x(n); }
/// read/write non-const access operator: without bounds checking
INLINE T &a_no_check(int n) { return fast_a_v_x(n); }
/// read-only const access operator: without bounds checking
INLINE const T &a_no_check_1(int n) const { return fast_a_1(n); }
/// read/write non-const access operator: without bounds checking
INLINE T &a_no_check_1(int n) { return fast_a_1(n); }
// #define pp_a_no_check(V,N) (pp_fast_a(V,N))
/// read-only const access operator: with bounds checking
const T &a_check(int n) const;
/// read/write non-const access operator: with bounds checking
T &a_check(int n);
const T &a(int n) const { return A_CHECK(n); }
T &a(int n) { return A_CHECK(n); }
/// read-only const access operator: return reference to nth member
const T &operator () (int n) const {return A_CHECK(n);}
// PT
// /// non const access operator: return reference to nth member
// T &operator () (int n) const {return a(n);}
/// read/write non const access operator: return reference to nth member
T &operator [] (int n) { return A_CHECK(n); }
//@}
void set_memory(T *buffer, int offset, int columns,
int free_when_destroyed=0);
/// assignment operator
EST_TVector &operator=(const EST_TVector &s);
/// Fill entire array will value <parameter>v</parameter>.
void fill(const T &v);
/// Fill vector with default value
void empty() { fill(*def_val); }
/// is true if vectors are equal size and all elements are equal.
int operator == (const EST_TVector &v) const;
/// is true if vectors are not equal size or a single elements isn't equal.
int operator != (const EST_TVector &v) const
{ return ! ((*this) == v); }
/// Copy data in and out. Subclassed by SimpleVector for speed.
void copy_section(T* dest, int offset=0, int num=-1) const;
void set_section(const T* src, int offset=0, int num=-1);
/// Create a sub vector.
void sub_vector(EST_TVector<T> &sv, int start_c=0, int len=-1);
/// print out vector.
friend ostream& operator << (ostream &st, const EST_TVector<T> &m);
/// Matrix must be friend to set up subvectors
friend class EST_TMatrix<T>;
void integrity() const;
};
//@}
/// assignment operator: fill track with values in list <parameter>s</parameter>.
template<class T>
extern EST_TVector<T> &set(EST_TVector<T> &v, const EST_TList<T> &s);
template<class T>
extern ostream& operator << (ostream &st, const EST_TVector< T > &a);
#undef A_CHECK
#endif
+87
View File
@@ -0,0 +1,87 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996,1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
#ifndef __EST_TVECTOR_I_H__
#define __EST_TVECTOR_I_H__
/** Instantiate rules for vector template.
*
* @author Richard Caley <rjc@cstr.ed.ac.uk>
* @version $Id: EST_TVectorI.h,v 1.3 2004/05/04 00:00:17 awb Exp $
*/
// Instantiation Macros
#define Instantiate_TVector_T_MIN(TYPE,TAG) \
template class EST_TVector< TYPE >;
#define Instantiate_TVector_T(TYPE,TAG) \
Instantiate_TVector_T_MIN(TYPE,TAG) \
\
ostream& operator << (ostream &st, const EST_TVector< TYPE > &a) \
{int i; for (i = 0; i < a.n(); ++i) st << a(i) << " "; st << endl; return st;}
#define Instantiate_TVector(TYPE) Instantiate_TVector_T(TYPE,TYPE)
#define Declare_TVector_T(TYPE,TAG) \
static TYPE const TAG##_vec_def_val_s; \
static TYPE TAG##_vec_error_return_s; \
\
template <> TYPE const *EST_TVector< TYPE >::def_val=&TAG##_vec_def_val_s; \
template <> TYPE *EST_TVector< TYPE >::error_return=&TAG##_vec_error_return_s;
#define Declare_TVector_Base_T(TYPE,DEFAULT,ERROR,TAG) \
static TYPE const TAG##_vec_def_val_s=DEFAULT; \
static TYPE TAG##_vec_error_return_s=ERROR; \
\
template <> TYPE const *EST_TVector<TYPE>::def_val=&TAG##_vec_def_val_s; \
template <> TYPE *EST_TVector<TYPE>::error_return=&TAG##_vec_error_return_s;
#define Declare_TVector_Class_T(TYPE,DEFAULT,ERROR,TAG) \
static TYPE const TAG##_vec_def_val_s(DEFAULT); \
static TYPE TAG##_vec_error_return_s(ERROR); \
\
template <> TYPE const *EST_TVector<TYPE>::def_val=&TAG##_vec_def_val_s; \
template <> TYPE *EST_TVector<TYPE>::error_return=&TAG##_vec_error_return_s;
#define Declare_TVector(TYPE) Declare_TVector_T(TYPE,TYPE)
#define Declare_TVector_Base(TYPE,DEFAULT,ERROR) Declare_TVector_Base_T(TYPE,DEFAULT,ERROR,TYPE)
#define Declare_TVector_Class(TYPE,DEFAULT,ERROR) Declare_TVector_Class_T(TYPE,DEFAULT,ERROR,TYPE)
#endif
+390
View File
@@ -0,0 +1,390 @@
/*************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* Author : Alan W Black */
/* Date : April 1996 */
/*-----------------------------------------------------------------------*/
/* Token/Tokenizer class */
/* */
/*=======================================================================*/
#ifndef __EST_TOKEN_H__
#define __EST_TOKEN_H__
#include <stdio.h>
#include "EST_String.h"
#include "EST_common.h"
// I can never really remember this so we'll define it here
/// The default whitespace characters
extern const EST_String EST_Token_Default_WhiteSpaceChars;
///
extern const EST_String EST_Token_Default_SingleCharSymbols;
///
extern const EST_String EST_Token_Default_PunctuationSymbols;
///
extern const EST_String EST_Token_Default_PrePunctuationSymbols;
/** This class is similar to \Ref{EST_String} but also maintains
the original punctuation and whitespace found around the
token.
\Ref{EST_Token}'s primary use is with \Ref{EST_TokenStream} class
which allows easy tokenizing of ascii files.
A token consists of four parts, any of which may be empty: a
name, the actual token, preceding whitespace, preceding
punctuation, the name and succeeding punctuation.
@author Alan W Black (awb@cstr.ed.ac.uk): April 1996
*/
class EST_Token {
private:
EST_String space;
EST_String prepunc;
EST_String pname;
EST_String punc;
int linenum;
int linepos;
int p_filepos;
int p_quoted;
public:
///
EST_Token() {init();}
///
EST_Token(const EST_String p) {init(); pname = p; }
///
void init() {p_quoted=linenum=linepos=p_filepos=0;}
/**@name Basic access to fields */
//@{
/// set token from a string
void set_token(const EST_String &p) { pname = p; }
///
void set_token(const char *p) { pname = p; }
/// set whitespace of token.
void set_whitespace(const EST_String &p) { space = p; }
///
void set_whitespace(const char *p) { space = p; }
/// set (post) punctuation of token.
void set_punctuation(const EST_String &p) { punc = p; }
///
void set_punctuation(const char *p) { punc = p; }
/// set prepunction
void set_prepunctuation(const EST_String &p) { prepunc = p; }
///
void set_prepunctuation(const char *p) { prepunc = p; }
///
const EST_String &whitespace() { return space; }
///
const EST_String &punctuation() { return punc; }
///
const EST_String &prepunctuation() { return prepunc; }
/**@name Access token as a string */
//@{
const EST_String &string() const { return String(); }
/// Access token as a string
const EST_String &S() const { return S(); }
/// Access token as a string
const EST_String &String() const { return pname; }
/// For automatic coercion to \Ref{EST_String}
operator EST_String() const { return String(); }
//@}
/**@name Access token as a int */
//@{
int Int(bool &valid) const { return String().Int(valid); }
int Int() const { return String().Int(); }
int I(bool &valid) const { return Int(valid); }
int I() const { return Int(); }
operator int() const { return Int(); }
//@}
/**@name Access token as a long */
//@{
long Long(bool &valid) const { return String().Long(valid); }
long Long() const { return String().Long(); }
long L(bool &valid) const { return Long(valid); }
long L() const { return Long(); }
operator long() const { return Long(); }
//@}
/**@name Access token as a float */
//@{
float Float(bool &valid) const { return String().Float(valid); }
float Float() const { return String().Float(); }
float F(bool &valid) const { return Float(valid); }
float F() const { return Float(); }
operator float() const { return Float(); }
//@}
/**@name Access token as a double */
//@{
double Double(bool &valid) const { return String().Double(valid); }
double Double() const { return String().Double(); }
double D(bool &valid) const { return Double(valid); }
double D() const { return Double(); }
operator double() const { return Double(); }
//@}
//@}
//@{
/// Note that this token was quoted (or not)
void set_quoted(int q) { p_quoted = q; }
/// TRUE is token was quoted
int quoted() const { return p_quoted; }
//@}
///
void set_row(int r) { linenum = r; }
///
void set_col(int c) { linepos = c; }
/// Set file position in original \Ref{EST_TokenStream}
void set_filepos(int c) { p_filepos = c; }
/// Return lower case version of token name
EST_String lstring() { return downcase(pname); }
/// Return upper case version of token name
EST_String ustring() { return upcase(pname); }
/// Line number in original \Ref{EST_TokenStream}.
int row(void) const { return linenum; }
/// Line position in original \Ref{EST_TokenStream}.
int col(void) const { return linepos; }
/// file position in original \Ref{EST_TokenStream}.
int filepos(void) const { return p_filepos; }
/// A string describing current position, suitable for error messages
const EST_String pos_description() const;
///
friend ostream& operator << (ostream& s, const EST_Token &p);
///
EST_Token & operator = (const EST_Token &a);
///
EST_Token & operator = (const EST_String &a);
///
int operator == (const EST_String &a) { return (pname == a); }
///
int operator != (const EST_String &a) { return (pname != a); }
///
int operator == (const char *a) { return (strcmp(pname,a)==0); }
///
int operator != (const char *a) { return (strcmp(pname,a)!=0); }
};
enum EST_tokenstream_type {tst_none, tst_file, tst_pipe, tst_string, tst_istream};
/** A class that allows the reading of \Ref{EST_Token}s from a file
stream, pipe or string. It automatically tokenizes a file based on
user definable whitespace and punctuation.
The definitions of whitespace and punctuation are user definable.
Also support for single character symbols is included. Single
character symbols {\em always} are treated as individual tokens
irrespective of their white space context. Also a quote
mode can be used to read uqoted tokens.
The setting of whitespace, pre and post punctuation, single character
symbols and quote mode must be down (immediately) after opening
the stream.
There is no unget but peek provides look ahead of one token.
Note there is an interesting issue about what to do about
the last whitespace in the file. Should it be ignored or should
it be attached to a token with a name string of length zero.
In unquoted mode the eof() will return TRUE if the next token name
is empty (the mythical last token). In quoted mode the last must
be returned so eof will not be raised.
@author Alan W Black (awb@cstr.ed.ac.uk): April 1996
*/
class EST_TokenStream{
private:
EST_tokenstream_type type;
EST_String WhiteSpaceChars;
EST_String SingleCharSymbols;
EST_String PunctuationSymbols;
EST_String PrePunctuationSymbols;
EST_String Origin;
FILE *fp;
istream *is;
int fd;
char *buffer;
int buffer_length;
int pos;
int linepos;
int p_filepos;
int getch(void);
EST_TokenStream &getch(char &C);
int peeked_charp;
int peeked_char; // ungot character
int peekch(void);
int peeked_tokp;
int eof_flag;
int quotes;
char quote;
char escape;
EST_Token current_tok;
void default_values(void);
/* local buffers to save reallocating */
int tok_wspacelen;
char *tok_wspace;
int tok_stufflen;
char *tok_stuff;
int tok_prepuncslen;
char *tok_prepuncs;
int close_at_end;
/* character class map */
char p_table[256];
bool p_table_wrong;
/** This function is deliberately private so that you'll get a compilation
error if you assign a token stream or pass it as an (non-reference)
argument. The problem with copying is that you need to copy the
filedescriptiors too (which can't be done for pipes). You probably
don't really want a copy anyway and meant to pass it as a reference.
If you really need this (some sort of clever look ahead) I am not
sure what he consequences really are (or how portable they are).
Pass the \Ref{EST_TokenStream} by reference instead.
*/
EST_TokenStream(EST_TokenStream &s);
void build_table();
inline int getch_internal();
inline int peekch_internal();
inline int getpeeked_internal();
public:
///
EST_TokenStream();
/// will close file if appropriate for type
~EST_TokenStream();
//@{
/// open a \Ref{EST_TokenStream} for a file.
int open(const EST_String &filename);
/// open a \Ref{EST_TokenStream} for an already opened file
int open(FILE *ofp, int close_when_finished);
/// open a \Ref{EST_TokenStream} for an already open istream
int open(istream &newis);
/// open a \Ref{EST_TokenStream} for string rather than a file
int open_string(const EST_String &newbuffer);
/// Close stream.
void close(void);
//@}
/**@name stream access functions */
//@{
/// get next token in stream
EST_TokenStream &get(EST_Token &t);
/// get next token in stream
EST_Token &get();
/**@name get the next token which must be the argument. */
//@{
EST_Token &must_get(EST_String expected, bool *ok);
EST_Token &must_get(EST_String expected, bool &ok)
{ return must_get(expected, &ok); }
EST_Token &must_get(EST_String expected)
{ return must_get(expected, (bool *)NULL); }
//@}
/// get up to {\tt s} in stream as a single token.
EST_Token get_upto(const EST_String &s);
/// get up to {\tt s} in end of line as a single token.
EST_Token get_upto_eoln(void);
/// peek at next token
EST_Token &peek(void)
{ if (!peeked_tokp) get();
peeked_tokp = TRUE; return current_tok; }
/// Reading binary data, (don't use peek() immediately beforehand)
int fread(void *buff,int size,int nitems);
//@}
/**@name stream initialization functions */
//@{
/// set which characters are to be treated as whitespace
void set_WhiteSpaceChars(const EST_String &ws)
{ WhiteSpaceChars = ws; p_table_wrong=1;}
/// set which characters are to be treated as single character symbols
void set_SingleCharSymbols(const EST_String &sc)
{ SingleCharSymbols = sc; p_table_wrong=1;}
/// set which characters are to be treated as (post) punctuation
void set_PunctuationSymbols(const EST_String &ps)
{ PunctuationSymbols = ps; p_table_wrong=1;}
/// set which characters are to be treated as (post) punctuation
void set_PrePunctuationSymbols(const EST_String &ps)
{ PrePunctuationSymbols = ps; p_table_wrong=1;}
/// set characters to be used as quotes and escape, and set quote mode
void set_quotes(char q, char e) { quotes = TRUE; quote = q; escape = e; p_table_wrong=1;}
/// query quote mode
int quoted_mode(void) { return quotes; }
//@}
/**@name miscellaneous */
//@{
/// returns line number of \Ref{EST_TokenStream}
int linenum(void) const {return linepos;}
/// end of file
int eof()
{ return (eof_flag || ((!quotes) && (peek() == ""))); }
/// end of line
int eoln();
/// current file position in \Ref{EST_TokenStream}
int filepos(void) const { return (type == tst_string) ? pos : p_filepos; }
/// tell, synonym for filepos
int tell(void) const { return filepos(); }
/// seek, reposition file pointer
int seek(int position);
int seek_end();
/// Reset to start of file/string
int restart(void);
/// A string describing current position, suitable for error messages
const EST_String pos_description();
/// The originating filename (if there is one)
const EST_String filename() const { return Origin; }
/// For the people who *need* the actual description (if possible)
FILE *filedescriptor() { return (type == tst_file) ? fp : 0; }
///
EST_TokenStream & operator >>(EST_Token &p);
///
EST_TokenStream & operator >>(EST_String &p);
///
friend ostream& operator <<(ostream& s, EST_TokenStream &p);
//@}
};
/** Quote a string with given quotes and escape character
*/
EST_String quote_string(const EST_String &s,
const EST_String &quote = "\"",
const EST_String &escape = "\\",
int force=0);
#endif // __EST_TOKEN_H__
+772
View File
@@ -0,0 +1,772 @@
/*************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1995,1996 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* */
/* Author : Paul Taylor */
/* Rewritten : Richard Caley */
/* ------------------------------------------------------------------- */
/* EST_Track Class header file */
/* */
/*************************************************************************/
class EST_Track;
#ifndef __Track_H__
#define __Track_H__
#include "EST_FMatrix.h"
#include "EST_types.h"
#include "EST_TrackMap.h"
#include "EST_ChannelType.h"
#include "EST_Featured.h"
typedef EST_TMatrix<EST_Val> EST_ValMatrix;
class EST_TokenStream;
class EST_String;
typedef enum EST_TrackFileType {
tff_none=0,
tff_ascii,
tff_esps,
tff_htk,
tff_htk_fbank,
tff_htk_mfcc,
tff_htk_user,
tff_htk_discrete,
tff_xmg,
tff_xgraph,
tff_ema,
tff_ema_swapped,
tff_NIST,
tff_est_ascii,
tff_est_binary,
tff_snns,
tff_ssff
} EST_TrackFileType;
typedef enum EST_InterpType {
it_nearest, // nearest time point
it_linear, // linerar interpolation
it_linear_nz // .. unless one end near zero
} EST_InterpType;
/** A class for storing time aligned coefficients.
some stuff.
*/
class EST_Track : public EST_Featured {
protected:
EST_FMatrix p_values; // float x array
EST_FVector p_times; // float y array
EST_CVector p_is_val; // for breaks and non-breaks
EST_ValMatrix p_aux; // Auxiliary channels
EST_StrVector p_aux_names; // Names of auxiliary channels
float p_t_offset; // time shift.
EST_TrackMap::P p_map;
EST_StrVector p_channel_names; // name of each track
bool p_equal_space; // fixed or variable frame rate
bool p_single_break; // single break lots between data
void default_vals();
void default_channel_names();
void clear_arrays();
void pad_breaks(); // put in extra breaks
int interp_value(float x, float f);
float interp_amp(float x, int c, float f);
float estimate_shift(float x);
void copy(const EST_Track& a);
public:
static const float default_frame_shift;
static const int default_sample_rate;
/**@name Constructor and Destructor functions
*/
//@{
/// Default constructor
EST_Track();
/// Copy constructor
EST_Track(const EST_Track &a);
/// resizing constructor
EST_Track(int num_frames, int num_channels);
/// resizing constructor
EST_Track(int num_frames, EST_StrList &map);
/// default destructor
~EST_Track();
//@}
/** @name Configuring Tracks
*/
//@{
/** resize the track to have {\tt num_frames} and {\tt num_channels}.
if {\tt preserve} is set to 1, any existing values in the track
are kept, up to the limits imposed by the new number of frames
and channels. If the new track size is bigger, new positions
are filled with 0 */
void resize(int num_frames, int num_channels, bool preserve = 1);
/** resize the track to have {\tt num_frames} and {\tt num_channels}.
if {\tt preserve} is set to 1, any existing values in the track
are kept, up to the limits imposed by the new number of frames
and channels. If the new track size is bigger, new positions
are filled with 0 */
void resize(int num_frames, EST_StrList &map, bool preserve = 1);
/** resize the track's auxiliary channels.
*/
void resize_aux(EST_StrList &map, bool preserve = 1);
/** Change the number of channels while keeping the number of
frames the same. if {\tt preserve} is set to 1, any existing
values in the track are kept, up to the limits imposed by the
new number of frames and channels. If the new track size is
bigger, new positions are filled with 0 */
void set_num_channels(int n, bool preserve = 1)
{ resize(EST_CURRENT, n, preserve); }
/** Change the number of frames while keeping the number of
channels the same. if {\tt preserve} is set to 1, any
existing values in the track are kept, up to the limits
imposed by the new number of frames and channels. If the new
track size is bigger, new positions are filled with 0 */
void set_num_frames(int n, bool preserve = 1)
{ resize(n, EST_CURRENT, preserve); }
/// set the name of the channel.
void set_channel_name(const EST_String &name, int channel);
/// set the name of the auxiliary channel.
void set_aux_channel_name(const EST_String &name, int channel);
/// copy everything but data
void copy_setup(const EST_Track& a);
//@}
/**@name Global track information
*/
//@{
/// name of track - redundant use access to features
EST_String name() const
{ return f_String("name");}
/// set name of track - redundant use access to features
void set_name(const EST_String &n)
{f_set("name",n);}
//@}
/**@name Functions for sub tracks, channels and frames.
*/
//@{
/** make {\tt fv} a window to frame {\tt n} in the track.
*/
void frame(EST_FVector &fv, int n, int startf=0, int nf=EST_ALL)
{ p_values.row(fv, n, startf, nf); }
/** make {\tt fv} a window to channel {\tt n} in the track.
*/
void channel(EST_FVector &cv, int n, int startf=0, int nf=EST_ALL)
{ p_values.column(cv, n, startf, nf); }
/** make {\tt fv} a window to the named channel in the track.
*/
void channel(EST_FVector &cv, const char * name, int startf=0,
int nf=EST_ALL);
/** make {\tt st} refer to a portion of the track. No values
are copied - an internal pointer in st is set to the specified
portion of the the track. After this, st behaves like a normal
track. Its first channel is the same as start_channel and its
first frame is the same as start_frame. Any values written into
st will changes values in the main track. st cannot be resized.
@param start_frame first frame at which sub-track starts
@param nframes number of frames to be included in total
@param start_channel first channel at which sub-track starts
@param nframes number of channels to be included in total
*/
void sub_track(EST_Track &st,
int start_frame=0, int nframes=EST_ALL,
int start_chan=0, int nchans=EST_ALL);
/** make {\tt st} refer to a portion of the track. No values
are copied - an internal pointer in st is set to the specified
portion of the the track. After this, st behaves like a normal
track. Its first channel is the same as start_channel and its
first frame is the same as start_frame. Any values written into
st will changes values in the main track. st cannot be resized.
@param start_frame first frame at which sub-track starts
@param nframes number of frames to be included in total
@param start_channel_name name of channel at which sub-track starts
@param end_channel_name name of channel at which sub-track stops
*/
void sub_track(EST_Track &st,
int start_frame, int nframes,
const EST_String &start_chan_name,
int nchans=EST_ALL);
/** make {\tt st} refer to a portion of the track. No values
are copied - an internal pointer in st is set to the specified
portion of the the track. After this, st behaves like a normal
track. Its first channel is the same as start_channel and its
first frame is the same as start_frame. Any values written into
st will changes values in the main track. st cannot be resized.
@param start_frame first frame at which sub-track starts
@param nframes number of frames to be included in total
@param start_channel_name name of channel at which sub-track starts
@param end_channel_name name of channel at which sub-track stops
*/
void sub_track(EST_Track &st,
int start_frame, int nframes,
const EST_String &start_chan_name,
const EST_String &end_chan_name);
/** make {\tt st} refer to a portion of the track. (const version)
No values
are copied - an internal pointer in st is set to the specified
portion of the the track. After this, st behaves like a normal
track. Its first channel is the same as start_channel and its
first frame is the same as start_frame. Any values written into
st will changes values in the main track. st cannot be resized.
@param start_frame first frame at which sub-track starts
@param nframes number of frames to be included in total
@param start_channel first channel at which sub-track starts
@param nframes number of channels to be included in total
*/
void sub_track(EST_Track &st,
int start_frame=0, int nframes=EST_ALL,
int start_chan=0, int nchans=EST_ALL) const
{ ((EST_Track *)this)->sub_track(st, start_frame, nframes,
start_chan, nchans); }
/** Copy contiguous portion of track into {\tt st}. Unlike the
normal sub_track functions, this makes a completely new track.
values written into this will not affect the main track and it
can be resized.
@param start_frame first frame at which sub-track starts
@param nframes number of frames to be included in total
@param start_channel first channel at which sub-track starts
@param nframes number of channels to be included in total
*/
void copy_sub_track( EST_Track &st,
int start_frame=0, int nframes=EST_ALL,
int start_chan=0, int nchans=EST_ALL) const;
void copy_sub_track_out( EST_Track &st, const EST_FVector& frame_times ) const;
void copy_sub_track_out( EST_Track &st, const EST_IVector& frame_indices ) const;
/** copy channel {\tt n} into pre-allocated buffer buf */
void copy_channel_out(int n, float *buf, int offset=0, int num=EST_ALL)
const
{ p_values.copy_column(n, buf, offset, num); }
/** copy channel {\tt n} into EST_FVector */
void copy_channel_out(int n, EST_FVector &f, int offset=0, int num=EST_ALL)
const
{ p_values.copy_column(n, f, offset, num); }
/** copy frame {\tt n} into pre-allocated buffer buf */
void copy_frame_out(int n, float *buf, int offset=0, int num=EST_ALL)
const {p_values.copy_row(n, buf, offset, num); }
/** copy frame {\tt n} into EST_FVector */
void copy_frame_out(int n, EST_FVector &f, int offset=0, int num=EST_ALL)
const {p_values.copy_row(n, f, offset, num); }
/** copy buf into pre-allocated channel n of track */
void copy_channel_in(int n, const float *buf, int offset=0,
int num=EST_ALL)
{ p_values.set_column(n, buf, offset, num); }
/** copy f into pre-allocated channel n of track */
void copy_channel_in(int n, const EST_FVector &f, int offset=0,
int num=EST_ALL)
{ p_values.set_column(n, f, offset, num); }
/** copy channel buf into pre-allocated channel n of track */
void copy_channel_in(int c,
const EST_Track &from, int from_c, int from_offset=0,
int offset=0, int num=EST_ALL)
{ p_values.set_column(c, from.p_values, from_c,
from_offset, offset, num); }
/** copy buf into frame n of track */
void copy_frame_in(int n, const float *buf, int offset=0,
int num=EST_ALL)
{ p_values.set_row(n, buf, offset, num); }
/** copy t into frame n of track */
void copy_frame_in(int n, const EST_FVector &t, int offset=0,
int num=EST_ALL)
{ p_values.set_row(n, t, offset, num); }
/** copy from into frame n of track */
void copy_frame_in(int i,
const EST_Track &from, int from_f, int from_offset=0,
int offset=0, int num=EST_ALL)
{ p_values.set_row(i, from.p_values, from_f, from_offset, offset,
num); }
//@}
/**@name Channel information
*/
//@{
/** Return the position of channel {\tt name} if it exists,
otherwise return -1.
*/
int channel_position(const char *name, int offset=0) const;
/** Return the position of channel {\tt name} if it exists,
otherwise return -1.
*/
int channel_position(EST_String name, int offset=0) const
{ return channel_position((const char *)name, offset); }
/** Returns true if the track has a channel named {\tt name},
otherwise false.
*/
bool has_channel(const char *name) const
{ return channel_position(name) >=0; }
/** Returns true if the track has a channel named {\tt name},
otherwise false.
*/
bool has_channel(EST_String name) const
{ return has_channel((const char *)name); }
//@}
/** @name Accessing amplitudes The following functions can be used
to access to amplitude of the track at certain points. Most of
these functions can be used for reading or writing to this
point, thus
tr.a(10, 5) = 10.3;
can be used to set the 10th frame of the 5th channel and
cout << tr.a(10, 5);
can be used to print the same information. Most of these functions
have a const equivalent for helping the compiler in
read only operations.
*/
//@{
/** return amplitude of frame i, channel c.*/
float &a(int i, int c=0);
float a(int i, int c=0) const;
/** return amplitude of frame i, channel c with no bounds
checking. */
float &a_no_check(int i, int c=0) { return p_values.a_no_check(i,c); }
float a_no_check(int i, int c=0) const {return p_values.a_no_check(i,c);}
/** return amplitude of point i, in the channel named name plus
offset. If you have a track with say channels called F0 and
voicing, you can access the 45th frame's F0 as t.a(45, "F0");
If there are 20 cepstral coefficients for each frame, the 5th can
be accessed as t.a(45, "cepstrum", 5);
*/
float &a(int i, const char *name, int offset=0);
float a(int i, const char *name, int offset=0) const
{ return ((EST_Track *)this)->a(i, name, offset); }
float &a(int i, EST_String name, int offset=0)
{ return a(i, (const char *)name, offset); }
float a(int i, EST_String name, int offset=0) const
{ return ((EST_Track *)this)->a(i, (const char *)name, offset); }
/** return amplitude of time t, channel c. This can be used for
reading or writing to this point. By default the nearest frame
to this time is used. If {\tt interp} is set to {\tt
it_linear}, linear interpolation is performed between the two
amplitudes of the two frames either side of the time point to
give an estimation of what the amplitude would have been at
time {\tt t}. If {\tt interp} is set to {\tt it_linear_nz},
interpolation is as above, unless the time requested is off
the end of a portion of track in which case the nearest
amplitude is returned.
*/
float &a(float t, int c=0, EST_InterpType interp=it_nearest);
float a(float t, int c=0, EST_InterpType interp=it_nearest) const
{ return ((EST_Track *)this)->a(t, c, interp); }
/** return amplitude of frame i, channel c. */
float &operator() (int i, int c) { return a(i,c); }
/** return amplitude of frame i, channel 0. */
float &operator() (int i) { return a(i,0); }
float operator() (int i, int c) const { return a(i,c); }
float operator() (int i) const { return a(i,0); }
/** return amplitude of frame nearest time t, channel c. */
float &operator() (float t, int c) {return a(t,c); }
/** return amplitude of frame nearest time t, channel 0. */
float &operator() (float t) {return a(t,0); }
float operator() (float t, int c) const {return a(t,c); }
float operator() (float t) const {return a(t,0); }
//@}
/** @name Timing
*/
//@{
/// return time position of frame i
float &t(int i=0) { return p_times[i]; }
float t(int i=0) const { return p_times(i); }
/// return time of frame i in milli-seconds.
float ms_t(int i) const { return p_times(i) * 1000.0; }
/** set frame times to regular intervals of time {\tt t}.
The {\tt start} parameter specifies the integer multiple of {\tt t} at
which to start. For example, setting this to 0 will start at time
0.0 (The default means the first time value = {\tt t}
*/
void fill_time( float t, int start=1 );
/** set frame times to regular intervals of time {\tt t}.
The {\tt start} parameter specifies the first time value.
*/
void fill_time( float t, float start );
/** fill time channel with times from another track
*/
void fill_time( const EST_Track &t );
/** fill all amplitudes with value {\tt v} */
void fill(float v) { p_values.fill(v); }
/** resample track at this frame shift, specified in seconds.
This can be used to change a variable frame spaced track into
a fixed frame track, or to change the spacing of an existing
evenly spaced track.
*/
void sample(float shift);
/// REDO
void change_type(float nshift, bool single_break);
/** return an estimation of the frame spacing in seconds.
This returns -1 if the track is not a fixed shift track */
float shift() const;
/// return time of first value in track
float start() const;
/// return time of last value in track
float end() const;
//@}
/** @name Auxiliary channels
Auxiliary information is used to store information that goes
along with frames, but which are not amplitudes and hence
not appropriate for operations such as interpolation,
smoothing etc. The aux() array is an array of EST_Vals which
allows points to be int, float or a string.
The following functions can be used to access to auxiliary
track information. Most of these functions can be used for
reading or writing to this point, thus
tr.aux(10, "voicing") = 1;
can be used to set the 10th frame of the "voicing" channel and
cout << tr.a(10, "voicing");
can be used to print the same information. Most of these functions
have a const equivalent for helping the compiler in
read only operations.
Auxiliary channels are usually accessed by name rather than
numerical index. The names are set using the set_aux_channel_names()
function.
*/
//@{
EST_Val &aux(int i, int c);
EST_Val &aux(int i, int c) const;
EST_Val &aux(int i, const char *name);
EST_Val aux(int i, const char *name) const
{ return ((EST_Track *)this)->aux(i, name); }
EST_Val &aux(int i, EST_String name)
{ return aux(i, (const char *)name); }
EST_Val aux(int i, EST_String name) const
{ return ((EST_Track *)this)->aux(i, (const char *)name); }
//@}
/** @name File i/o functions
*/
//@{
/** Load a file called {\tt name} into the track.
The load function attempts to
automatically determine which file type is being loaded from the
file's header. If no header is found, the function assumes the
file is ascii data, with a fixed frame shift, arranged with rows
representing frames and columns channels. In this case, the
frame shift must be specified as an argument to this function.
For those file formats which don't contain provision for specifying
an initial time (e.g. HTK, or ascii...), the {\tt startt} parameter
may be specified.
*/
EST_read_status load(const EST_String name, float ishift = 0.0, float startt = 0.0);
/** Load character data from an already opened tokenstream {\tt ts}
into the track.
The load function attempts to
automatically determine which file type is being loaded from the
file's header. If no header is found, the function assumes the
file is ascii data, with a fixed frame shift, arranged with rows
representing frames and columns channels. In this case, the
frame shift must be specified as an argument to this function
For those file formats which don't contain provision for specifying
an initial time (e.g. HTK, or ascii...), the {\tt startt} parameter
may be specified.
*/
EST_read_status load(EST_TokenStream &ts, float ishift = 0.0, float startt = 0.0);
/** Load a file called {\tt name} of format {\tt type}
into the track. If no header is found, the function assumes the
file is ascii data, with a fixed frame shift, arranged with rows
representing frames and columns channels. In this case, the
frame shift must be specified as an argument to this function
For those file formats which don't contain provision for specifying
an initial time (e.g. HTK, or ascii...), the {\tt startt} parameter
may be specified.
*/
EST_read_status load(const EST_String name, const EST_String type,
float ishift = 0.0, float startt = 0.0 );
/** Save the track to a file {\tt name} of format {\tt type}. */
EST_write_status save(const EST_String name,
const EST_String EST_filetype = "");
/** Save the track to a already opened file pointer{\tt FP}
and write a file of format {\tt type}. */
EST_write_status save(FILE *fp,
const EST_String EST_filetype = "");
//@}
/** @name Utility functions */
//@{
/// returns true if no values are set in the frame
int empty() const;
/// set frame i to be a break
void set_break(int i);
/// set frame i to be a value
void set_value(int i);
/// return true if frame i is a value
int val(int i) const;
/// return true if frame i is a break
int track_break(int i) const { return (p_is_val(i)); }
/** starting at frame i, return the frame index of the first
value frame before i. If frame i is a value, return i */
int prev_non_break(int i) const;
/** starting at frame i, return the frame index of the first
value frame after i. If frame i is a value, return i */
int next_non_break(int i) const;
/// return the frame index nearest time t
int index(float t) const;
/// return the frame index before time t
int index_below(float x) const;
/// return number of frames in track
int num_frames() const {return p_values.num_rows();}
/// return number of frames in track
int length() const { return num_frames(); }
/// return number of channels in track
int num_channels() const {return p_values.num_columns();}
/// return number of auxiliary channels in track
int num_aux_channels() const {return p_aux.num_columns();}
void add_trailing_breaks();
void rm_trailing_breaks();
/** If the contour has multiple break values between sections
containing values, reduce the break sections so that each has
a single break only. */
void rm_excess_breaks();
/// return true if track has equal (i.e. fixed) frame spacing */
bool equal_space() const {return p_equal_space;}
/**return true if track has only single breaks between value sections */
bool single_break() const {return p_single_break;}
void set_equal_space(bool t) {p_equal_space = t;}
void set_single_break(bool t) {p_single_break = t;}
//@}
EST_Track& operator = (const EST_Track& a);
EST_Track& operator+=(const EST_Track &a); // add to existing track
EST_Track& operator|=(const EST_Track &a); // add to existing track in parallel
friend ostream& operator << (ostream& s, const EST_Track &tr);
// Default constructor
EST_Track(int num_frames, EST_TrackMap &map);
// assign a known description to a track
void assign_map(EST_TrackMap::P map);
void assign_map(EST_TrackMap &map) { assign_map(&map); }
// create a description for an unknown track
void create_map(EST_ChannelNameMap &names);
void create_map(void) { create_map(EST_default_channel_names); }
EST_TrackMap::P map() const { return p_map; }
int channel_position(EST_ChannelType type, int offset=0) const;
// return amplitude of point i, channel type c (plus offset)
float &a(int i, EST_ChannelType c, int offset=0);
float a(int i, EST_ChannelType c, int offset=0) const
{ return ((EST_Track *)this)->a(i,c, offset); }
// return amplitude at time t, channel type c
float &a(float t, EST_ChannelType c, EST_InterpType interp=it_nearest);
float a(float t, EST_ChannelType c, EST_InterpType interp=it_nearest) const
{ return ((EST_Track *)this)->a(t, c, interp); }
float &operator() (int i, EST_ChannelType c) { return a(i,c); }
float operator() (int i, EST_ChannelType c) const { return a(i,c); }
float &t_offset() { return p_t_offset; }
float t_offset() const { return p_t_offset; }
EST_read_status load_channel_names(const EST_String name);
EST_write_status save_channel_names(const EST_String name);
const EST_String channel_name(int channel, const EST_ChannelNameMap &map, int strings_override=1) const;
const EST_String channel_name(int channel, int strings_override=1) const
{ return channel_name(channel, EST_default_channel_names, strings_override); }
const EST_String aux_channel_name(int channel) const
{ return p_aux_names(channel);}
void resize(int num_frames, EST_TrackMap &map);
EST_TrackFileType file_type() const {return (EST_TrackFileType)f_Int("file_type",0);}
void set_file_type(EST_TrackFileType t) {f_set("file_type", (int)t);}
bool has_channel(EST_ChannelType type) const
{ int cp = channel_position(type);
return cp>=0; }
// Frame iteration support
protected:
class IPointer_f {
public:
EST_Track *frame; int i;
IPointer_f();
IPointer_f(const IPointer_f &p);
~IPointer_f();
};
void point_to_first(IPointer_f &ip) const { ip.i = 0; }
void move_pointer_forwards(IPointer_f &ip) const { ip.i++; }
bool points_to_something(const IPointer_f &ip) const { return ip.i <num_frames(); }
EST_Track &points_at(const IPointer_f &ip) { sub_track(*(ip.frame), ip.i, 1);
return *(ip.frame); }
friend class EST_TIterator< EST_Track, IPointer_f, EST_Track >;
friend class EST_TRwIterator< EST_Track, IPointer_f, EST_Track >;
public:
typedef EST_Track Entry;
typedef EST_TIterator< EST_Track, IPointer_f, EST_Track > Entries;
typedef EST_TRwIterator< EST_Track, IPointer_f, EST_Track > RwEntries;
};
// list of tracks in serial
typedef EST_TList<EST_Track> EST_TrackList;
#endif /* __Track_H__ */
+176
View File
@@ -0,0 +1,176 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996,1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/************************************************************************/
#ifndef __EST_TRACKMAP_H__
#define __EST_TRACKMAP_H__
#include <limits.h>
#include "EST_TNamedEnum.h"
#include "EST_ChannelType.h"
#include "EST_Handleable.h"
#include "EST_THandle.h"
/** Track maps provide a mapping from symbolic track names to the
* actual position of the information within a track frame. The
* symbolic names are defined by the EST_ChannelType enumerated type.
*
* Track maps can be declared statically by code which always uses
* tracks of a given style, or they can be built at run time as
* is done by lpc_analysis to record whichinformation the
* user has requested. Finally they can be constructed by the Track
* itself from the names of the channels, for instance when a track has
* just been read in from a file.
*
* @see EST_Track
* @see EST_ChannelType
* @see EST_TrackMap:example
* @author Richard Caley <rjc@cstr.ed.ac.uk>
* @version $Id: EST_TrackMap.h,v 1.3 2004/05/04 00:00:16 awb Exp $
*/
class EST_TrackMap : public EST_Handleable
{
public:
/**@name ChannelMapping
* An auxiliary type used just to define static EST_TrackMaps.
* Defining one of these and then converting it to an EST_TrackMap
* is, unfortunately, the only way C++ allows us to define
* a constant EST_TrackMap.
*/
//@{
/// structure for the table.
struct ChannelMappingElement {
EST_ChannelType type;
unsigned short channel;
};
/// Table of type to position pairs.
// typedef struct ChannelMappingElement ChannelMapping[];
//@}
typedef EST_THandle<EST_TrackMap,EST_TrackMap> P;
public:
/// Returned if we ask for a channel not in the map.
# define NO_SUCH_CHANNEL (-1)
private:
/// The map itself.
short p_map[num_channel_types];
/// Parent is looked at if this map doesn't define the position.
EST_TrackMap::P p_parent;
/// Subtracted from the values in the parent.
int p_offset;
/// No copy constructor. Don't copy these things.
EST_TrackMap(EST_TrackMap &from);
protected:
/// Pass to creation function to turn on refcounting.
#define EST_TM_REFCOUNTED (1)
/// Creation function used by friends to create refcounted maps.
EST_TrackMap(int refcount);
/// Creation function used by friends to create sub-track maps.
EST_TrackMap(const EST_TrackMap *parent, int offset, int refcount);
/// copy an exiting map.
void copy(EST_TrackMap &from);
/// Initialise the map.
void init(void);
short get_parent(EST_ChannelType type) const ;
public:
/// Default constructor.
EST_TrackMap(void);
/// Copy the mapping.
EST_TrackMap(EST_TrackMap &from, int refcount);
/// Create from static table.
EST_TrackMap(struct ChannelMappingElement map[]);
~EST_TrackMap();
/// Empty the map.
void clear(void);
/// Record the position of a channel.
void set(EST_ChannelType type, short pos)
{ p_map[(int)type] = pos; }
/// Get the position of a channel.
short get(EST_ChannelType type) const
{ short c = p_map[(int)type];
return c!=NO_SUCH_CHANNEL?c:get_parent(type); }
/// Get the position of a channel.
short operator() (EST_ChannelType type) const
{ return get(type); }
/// Does the mapping contain a position for this channel?
bool has_channel(EST_ChannelType type) const
{ return p_map[(int)type] != NO_SUCH_CHANNEL
|| ( p_parent!=0 && p_parent->has_channel(type) ); }
/// Returns the index of the last known channel.
short last_channel(void) const;
/// Returns the type of the channel at the given position.
EST_ChannelType channel_type(unsigned short channel) const;
EST_TrackMap * object_ptr() { return this; }
const EST_TrackMap * object_ptr() const { return this; }
friend class EST_Track;
friend ostream& operator << (ostream &st, const EST_TrackMap &m);
};
/** Channel name maps map textual names for track channels to symbolic
* names, they are just a special case of named enums.
*/
typedef EST_TNamedEnum<EST_ChannelType> EST_ChannelNameMap;
/** Table type used to create EST_ChannelNameMaps.
*/
typedef EST_TValuedEnumDefinition<EST_ChannelType, const char *, NO_INFO>
EST_ChannelNameTable[];
/// Definition of standard names we use for channels.
extern EST_ChannelNameMap EST_default_channel_names;
/// Definition of the names ESPS programs use for channels.
extern EST_ChannelNameMap esps_channel_names;
extern ostream& operator << (ostream &st, const EST_TrackMap &m);
#endif
+142
View File
@@ -0,0 +1,142 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996,1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* */
/* Author: Richard Caley (rjc@cstr.ed.ac.uk) */
/* Date: Mon Jul 21 1997 */
/* -------------------------------------------------------------------- */
/* Untyped list used as the basis of the TList class */
/* */
/*************************************************************************/
#ifndef __EST_ULIST_H__
#define __EST_ULIST_H__
#include <iostream>
#include "EST_common.h"
#include "EST_String.h"
class EST_UItem {
public:
void init() { n = NULL; p = NULL;}
EST_UItem *n;
EST_UItem *p;
};
class EST_UList {
protected:
EST_UItem *h;
EST_UItem *t;
protected:
void init() { h = NULL; t = NULL; };
void clear_and_free(void (*item_free)(EST_UItem *item));
public:
EST_UList() { init(); };
~ EST_UList() { clear_and_free(NULL); }
EST_UItem *nth_pointer(int n) const;
EST_UItem *insert_after(EST_UItem *ptr, EST_UItem *new_item); // returns pointer to inserted item
EST_UItem *insert_before(EST_UItem *ptr, EST_UItem *new_item); // returns pointer to item after inserted item
// remove single item, return pointer to previous
EST_UItem *remove(EST_UItem *ptr, void (*item_free)(EST_UItem *item));
EST_UItem *remove(int n, void (*item_free)(EST_UItem *item));
void exchange(EST_UItem *a, EST_UItem *b);
void exchange(int i, int j);
void reverse(); // in place
int length() const; // number of items in list
int index(EST_UItem *item) const; // position from start of list (head = 0)
int empty() const // returns true if no items in list
{return (h == NULL) ? 1 : 0;};
void clear(void)
{ clear_and_free(NULL); };
void append(EST_UItem *item); // add item onto end of list
void prepend(EST_UItem *item); // add item onto start of list
EST_UItem *head() const // return pointer to head of list
{ return h; };
EST_UItem *tail() const // return pointer to tail of list
{ return t; };
static bool operator_eq(const EST_UList &a,
const EST_UList &b,
bool (*eq)(const EST_UItem *item1, const EST_UItem *item2));
static int index(const EST_UList &l,
const EST_UItem &b,
bool (*eq)(const EST_UItem *item1, const EST_UItem *item2));
static void sort(EST_UList &a,
bool (*gt)(const EST_UItem *item1, const EST_UItem *item2));
static void qsort(EST_UList &a,
bool (*gt)(const EST_UItem *item1, const EST_UItem *item2),
void (*exchange)(EST_UItem *item1, EST_UItem *item2));
static void sort_unique(EST_UList &l,
bool (*eq)(const EST_UItem *item1, const EST_UItem *item2),
bool (*gt)(const EST_UItem *item1, const EST_UItem *item2),
void (*item_free)(EST_UItem *item));
static void merge_sort_unique(EST_UList &l, EST_UList &m,
bool (*eq)(const EST_UItem *item1, const EST_UItem *item2),
bool (*gt)(const EST_UItem *item1, const EST_UItem *item2),
void (*item_free)(EST_UItem *item));
};
// inline functions in header file
// everything else in EST_UList.C
inline EST_UItem *next(EST_UItem *ptr)
{
if (ptr != 0)
return ptr->n;
return 0;
}
inline EST_UItem *prev(EST_UItem *ptr)
{
if (ptr != 0)
return ptr->p;
return 0;
}
#endif
+265
View File
@@ -0,0 +1,265 @@
/*************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1995,1996 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* Author : Alan W Black */
/* Date : May 1996 */
/*-----------------------------------------------------------------------*/
/* */
/* A generic container class, originally for ints floats and string now */
/* extended for some others, eventually allow run addition of new types */
/* "built-in" types (i.e. ones explicitly mentioned in this file) may */
/* be accessed by member functions, objects added at run time may only */
/* be accessed by functions */
/* */
/* This is so similar to the LISP class in SIOD it could be viewed as a */
/* little embarrassing, but this is done without a cons cell heap or gc */
/* which may or may not be a good thing. */
/* */
/*=======================================================================*/
#ifndef __EST_VAL_H__
#define __EST_VAL_H__
#include "EST_String.h"
//#include "EST_error.h"
#include "EST_Contents.h"
#include "EST_Val_defs.h"
typedef const char *val_type;
extern val_type val_unset;
extern val_type val_int;
extern val_type val_float;
extern val_type val_string;
/** The EST_Val class is a container class, used to store a single
item which can be an int, float, string or other user-defined
class. It is often used as the base item in the <link
linkend="est-features">EST_Features</link> class, to enable features
to take on values of different types.
*/
class EST_Val {
private:
val_type t;
union
{ int ival;
float fval;
EST_Contents *pval;} v;
// * may have a string name as well as a value
EST_String sval;
const int to_int() const;
const float to_flt() const;
const EST_String &to_str() const;
public:
/**@name Constructor and Destructor functions
*/
//@{
/** Default constructor */
EST_Val()
{t=val_unset;}
/** Copy constructor for another EST_Val*/
EST_Val(const EST_Val &val);
/** Copy constructor for an int*/
EST_Val(const int i)
{t=val_int; v.ival=i;}
/** Copy constructor for a float*/
EST_Val(const float f)
{t=val_float; v.fval=f;}
/** Copy constructor for a double*/
EST_Val(const double d) {t=val_float; v.fval=d;}
/** Copy constructor for a string*/
// EST_Val(const EST_String &s) {t=val_string; sval = s;}
EST_Val(const EST_String &s) : t(val_string), sval(s) {};
/** Copy constructor for a string literal*/
// EST_Val(const char *s) {t=val_string; sval = s;}
EST_Val(const char *s) : t(val_string), sval(s) {};
EST_Val(val_type type,void *p, void (*f)(void *));
/** Destructor */
~EST_Val(void);
//@}
/**@name Getting cast values
*/
//@{
/** returns the type that the val is currently holding */
const val_type type(void) const
{return t;}
/** returns the value, cast as an int */
const int Int(void) const
{if (t==val_int) return v.ival; return to_int();}
/** returns the value, cast as an int */
const int I(void) const
{ return Int(); }
/** returns the value, cast as a float */
const float Float(void) const
{if (t==val_float) return v.fval; return to_flt();}
/** returns the value, cast as a float */
const float F(void) const
{ return Float(); }
/** returns the value, cast as a string */
const EST_String &String(void) const
{if (t!=val_string) to_str(); return sval;}
/** returns the value, cast as a string */
const EST_String &string(void) const
{return String();}
/** returns the value, cast as a string */
const EST_String &S(void) const
{return String();}
/** returns the value, cast as a string */
const EST_String &string_only(void) const {return sval;}
//@}
// Humans should never call this only automatic functions
const void *internal_ptr(void) const
{ return v.pval->get_contents(); }
/**@name Setting values
*/
//@{
/** Assignment of val to an int */
EST_Val &operator=(const int i) { t=val_int; v.ival=i; return *this;}
/** Assignment of val to a float */
EST_Val &operator=(const float f) { t=val_float; v.fval=f; return *this;}
/** Assignment of val to a double */
EST_Val &operator=(const double d) { t=val_float; v.fval=d; return *this;}
/** Assignment of val to a string */
EST_Val &operator=(const EST_String &s) { t=val_string; sval = s; return *this;}
/** Assignment of val to a string literal*/
EST_Val &operator=(const char *s) { t=val_string; sval = s; return *this;}
/** Assignment of val to another val*/
EST_Val &operator=(const EST_Val &c);
//@}
/**@name Equivalence test
*/
//@{
/** Test whether val is equal to a*/
int operator ==(const EST_Val &a) const
{ if (t != a.t) return (1==0);
else if (t == val_string) return (sval == a.sval);
else if (t == val_int) return (v.ival == a.v.ival);
else if (t == val_float) return (v.fval == a.v.fval);
else return (internal_ptr() == a.internal_ptr()); }
/** Test whether val is equal to the string a*/
int operator ==(const EST_String &a) const { return (string() == a); }
/** Test whether val is equal to the char * a*/
int operator ==(const char *a) const { return (string() == a); }
/** Test whether val is equal to the int a*/
int operator ==(const int &i) const { return (Int() == i); }
/** Test whether val is equal to the float a*/
int operator ==(const float &f) const { return (Float() == f); }
/** Test whether val is equal to the double a*/
int operator ==(const double &d) const { return (Float() == d); }
/** Test whether val is not equal to the val a*/
int operator !=(const EST_Val &a) const { return (!(*this == a)); }
/** Test whether val is not equal to the string a*/
int operator !=(const EST_String &a) const { return (string() != a); }
/** Test whether val is not equal to the char * a*/
int operator !=(const char *a) const { return (string() != a); }
/** Test whether val is not equal to the int a*/
int operator !=(const int &i) const { return (Int() != i);}
/** Test whether val is not equal to the float a*/
int operator !=(const float &f) const { return (Float() != f); }
/** Test whether val is not equal to the double float a*/
int operator !=(const double &d) const { return (Float() != d); }
//@{
/**@name Automatic casting
*/
//@{
/** Automatically cast val as an int*/
operator int() const { return Int(); }
/** Automatically cast val as an float*/
operator float() const { return Float(); }
/** Automatically cast val as an string*/
operator EST_String() const { return string(); }
//@}
/** print val*/
friend ostream& operator << (ostream &s, const EST_Val &a)
{ if (a.type() == val_unset) s << "[VAL unset]" ;
else if (a.type() == val_int) s << a.v.ival;
else if (a.type() == val_float) s << a.v.fval;
else if (a.type() == val_string) s << a.sval;
else s << "[PVAL " << a.type() << "]";
return s;
}
};
inline const char *error_name(const EST_Val val) { return (EST_String)val;}
// For consistency with other (user-defined) types in val
inline EST_String string(const EST_Val &v) { return v.string(); }
inline EST_Val est_val(const EST_String s) { return EST_Val(s); }
inline EST_Val est_val(const char *s) { return EST_Val(s); }
inline int Int(const EST_Val &v) { return v.Int(); }
inline EST_Val est_val(const int i) { return EST_Val(i); }
inline float Float(const EST_Val &v) { return v.Float(); }
inline EST_Val est_val(const float f) { return EST_Val(f); }
#endif
+180
View File
@@ -0,0 +1,180 @@
/*************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1999 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* Author : Alan W Black */
/* Date : March 1999 */
/*-----------------------------------------------------------------------*/
/* */
/* Macros definitions for defining anything as vals */
/* */
/*=======================================================================*/
#ifndef __EST_VAL_DEFS_H__
#define __EST_VAL_DEFS_H__
/* Macro for defining new class as values public functions */
#define VAL_REGISTER_CLASS_DCLS(NAME,CLASS) \
extern val_type val_type_##NAME; \
class CLASS *NAME(const EST_Val &v); \
EST_Val est_val(const class CLASS *v);
/* For things that aren't classes (typed def something else) */
#define VAL_REGISTER_TYPE_DCLS(NAME,CLASS) \
extern val_type val_type_##NAME; \
CLASS *NAME(const EST_Val &v); \
EST_Val est_val(const CLASS *v);
#define VAL_REGISTER_FUNCPTR_DCLS(NAME,TYPE) \
extern val_type val_type_##NAME; \
TYPE NAME(const EST_Val &v); \
EST_Val est_val(const TYPE v);
/* Macro for defining new class as values */
#define VAL_REGISTER_CLASS(NAME,CLASS) \
val_type val_type_##NAME=#NAME; \
class CLASS *NAME(const EST_Val &v) \
{ \
if (v.type() == val_type_##NAME) \
return (class CLASS *)v.internal_ptr(); \
else \
EST_error("val not of type val_type_"#NAME); \
return NULL; \
} \
\
static void val_delete_##NAME(void *v) \
{ \
delete (class CLASS *)v; \
} \
\
EST_Val est_val(const class CLASS *v) \
{ \
return EST_Val(val_type_##NAME, \
(void *)v,val_delete_##NAME); \
} \
/* Macro for defining new typedef'd things as vals */
/* You don't need CLASS and TYPE but it often convenient */
#define VAL_REGISTER_TYPE(NAME,CLASS) \
val_type val_type_##NAME=#NAME; \
CLASS *NAME(const EST_Val &v) \
{ \
if (v.type() == val_type_##NAME) \
return (CLASS *)v.internal_ptr(); \
else \
EST_error("val not of type val_type_"#NAME); \
return NULL; \
} \
\
static void val_delete_##NAME(void *v) \
{ \
delete (CLASS *)v; \
} \
\
EST_Val est_val(const CLASS *v) \
{ \
return EST_Val(val_type_##NAME, \
(void *)v,val_delete_##NAME); \
} \
/* Macro for defining new typedef'd things as vals that don't get deleted */
/* You don't need CLASS and TYPE but it often convenient */
#define VAL_REGISTER_TYPE_NODEL(NAME,CLASS) \
val_type val_type_##NAME=#NAME; \
CLASS *NAME(const EST_Val &v) \
{ \
if (v.type() == val_type_##NAME) \
return (CLASS *)v.internal_ptr(); \
else \
EST_error("val not of type val_type_"#NAME); \
return NULL; \
} \
\
static void val_delete_##NAME(void *v) \
{ \
(void)v; \
} \
\
EST_Val est_val(const CLASS *v) \
{ \
return EST_Val(val_type_##NAME, \
(void *)v,val_delete_##NAME); \
} \
/* Macro for defining new class as values */
#define VAL_REGISTER_CLASS_NODEL(NAME,CLASS) \
val_type val_type_##NAME=#NAME; \
class CLASS *NAME(const EST_Val &v) \
{ \
if (v.type() == val_type_##NAME) \
return (class CLASS *)v.internal_ptr(); \
else \
EST_error("val not of type val_type_"#NAME); \
return NULL; \
} \
\
static void val_delete_##NAME(void *v) \
{ \
(void)v; \
} \
\
EST_Val est_val(const class CLASS *v) \
{ \
return EST_Val(val_type_##NAME, \
(void *)v,val_delete_##NAME); \
} \
/* Macro for defining function pointers as values */
#define VAL_REGISTER_FUNCPTR(NAME,CLASS) \
val_type val_type_##NAME=#NAME; \
CLASS NAME(const EST_Val &v) \
{ \
if (v.type() == val_type_##NAME) \
return (CLASS)v.internal_ptr(); \
else \
EST_error("val not of type val_type_"#NAME); \
return NULL; \
} \
\
static void val_delete_##NAME(void *v) \
{ \
(void)v; \
} \
\
EST_Val est_val(const CLASS v) \
{ \
return EST_Val(val_type_##NAME, \
(void *)v,val_delete_##NAME); \
} \
#endif
+323
View File
@@ -0,0 +1,323 @@
/*************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* */
/* Author : Paul Taylor and Alan W Black */
/* Rewritten : Richard Caley */
/* ------------------------------------------------------------------- */
/* EST_Wave Class header file */
/* */
/*************************************************************************/
#ifndef __Wave_H__
#define __Wave_H__
#include <stdio.h>
#include "EST_Featured.h"
#include "EST_rw_status.h"
#include "EST_types.h"
class EST_Track;
class EST_String;
class EST_TokenStream;
/** A class for storing digital waveforms. The waveform is stored as
an array of 16 bit shorts. Multiple channels are supported, but if no
channel information is given the 0th channel is accessed.
<p>
The waveforms can be of any sample rate, and can be changed to another
sampling rate using the <tt>resample</tt> function.
*/
class EST_Wave : public EST_Featured
{
protected:
EST_SMatrix p_values;
int p_sample_rate;
void default_vals(int n=0, int c=1);
void free_wave();
void copy_data(const EST_Wave &w);
void copy_setup(const EST_Wave &w);
public:
static const int default_sample_rate;
static const int default_num_channels;
/// default constructor
EST_Wave();
/// copy constructor
EST_Wave(const EST_Wave &a);
EST_Wave(int n, int c, int sr);
/// Construct from memory supplied by caller
EST_Wave(int samps, int chans,
short *memory, int offset=0, int sample_rate=default_sample_rate,
int free_when_destroyed=0);
~EST_Wave();
/**@name Access functions for finding amplitudes of samples */
//@{
/** return amplitude of sample <tt>i</tt> from channel <tt>
channel</tt>. By default the 0th channel is selected. This
function can be used for assignment.
*/
short &a(int i, int channel = 0);
short a(int i, int channel = 0) const;
INLINE short &a_no_check(int i, int channel = 0)
{ return p_values.a_no_check(i,channel); }
INLINE short a_no_check(int i, int channel = 0) const
{ return p_values.a_no_check(i,channel); }
INLINE short &a_no_check_1(int i, int channel = 0)
{ return p_values.a_no_check_1(i,channel); }
INLINE short a_no_check_1(int i, int channel = 0) const
{ return p_values.a_no_check_1(i,channel); }
/** return amplitude of sample <tt>i</tt> from channel <tt>
channel</tt>. By default the 0th channel is selected.
*/
short operator()(int i, int channel) const
{ return a(i,channel); }
/** return amplitude of sample <tt>i</tt> from channel 0.
*/
short operator()(int i) const
{ return a(i,0); }
/** Version of a() that returns zero if index is out of array
bounds. This is particularly useful in signal processing when
you want to have windows going off the end of the waveform. */
short &a_safe(int i, int channel = 0);
/// return the time position in seconds of the ith sample
float t(int i) const { return (float)i/(float)p_sample_rate; }
//@}
/**@name Information functions */
//@{
/// return the number of samples in the waveform
int num_samples() const { return p_values.num_rows();}
/// return the number of channels in the waveform
int num_channels() const { return p_values.num_columns(); }
/// return the sampling rate (frequency)
int sample_rate() const { return p_sample_rate; }
/// Set sampling rate to <tt>n</tt>
void set_sample_rate(const int n){p_sample_rate = n;}
/// return the size of the waveform, i.e. the number of samples.
int length() const { return num_samples();}
/// return the time position of the last sample.
float end(){ return t(num_samples()-1); }
/// Can we look N samples to the left?
bool have_left_context(unsigned int n) const
{ return p_values.have_rows_before(n); }
/** returns the file format of the file from which the waveform
was read. If the waveform has not been read from a file, this is set
to the default type */
EST_String sample_type() const { return f_String("sample_type","short"); }
void set_sample_type(const EST_String t) { f_set("sample_type", t); }
EST_String file_type() const { return f_String("file_type","riff"); }
void set_file_type(const EST_String t) { f_set("file_type", t); }
/// A string identifying the waveform, commonly used to store the filename
EST_String name() const { return f_String("name"); }
/// Sets name.
void set_name(const EST_String n){ f_set("name", n); }
//@}
const EST_SMatrix &values() const { return p_values; }
EST_SMatrix &values() { return p_values; }
/**@name Waveform manipulation functions */
//@{
/// resize the waveform
void resize(int num_samples, int num_channels = EST_ALL, int set=1)
{ p_values.resize(num_samples, num_channels, set); }
/// Resample waveform to <tt>rate</tt>
void resample(int rate);
/** multiply all samples by a factor <tt>gain</tt>. This checks for
overflows and puts them to the maximum positive or negative value
as appropriate.
*/
void rescale(float gain,int normalize=0);
// multiply samples by a factor contour. The factor_contour track
// should contains factor targets at time points throughout the wave,
// between which linear interpolation is used to calculate the factor
// for each sample.
void rescale( const EST_Track &factor_contour );
/// clear waveform and set size to 0.
void clear() {resize(0,EST_ALL);}
void copy(const EST_Wave &from);
void fill(short v=0, int channel=EST_ALL);
void empty(int channel=EST_ALL) { fill(0,channel); }
void sample(EST_TVector<short> &sv, int n)
{ p_values.row(sv, n); }
void channel(EST_TVector<short> &cv, int n)
{ p_values.column(cv, n); }
void copy_channel(int n, short *buf, int offset=0, int num=EST_ALL) const
{ p_values.copy_column(n, buf, offset, num); }
void copy_sample(int n, short *buf, int offset=0, int num=EST_ALL) const
{ p_values.copy_row(n, buf, offset, num); }
void set_channel(int n, const short *buf, int offset=0, int num=EST_ALL)
{ p_values.set_column(n, buf, offset, num); }
void set_sample(int n, const short *buf, int offset=0, int num=EST_ALL)
{ p_values.set_row(n, buf, offset, num); }
void sub_wave(EST_Wave &sw,
int offset=0, int num=EST_ALL,
int start_c=0, int nchan=EST_ALL);
void sub_wave(EST_Wave &sw,
int offset=0, int num=EST_ALL,
int start_c=0, int nchan=EST_ALL) const
{ ((EST_Wave *)this)->sub_wave(sw, offset, num, start_c, nchan); }
//@}
/**@name File i/o functions */
//@{
/** Load a file into the waveform. The load routine attempts to
automatically determine which file type is being loaded. A
portion of the waveform can be loaded by setting <tt>
offset</tt> to the sample position from the beginning and
<length> to the number of required samples after this. */
EST_read_status load(const EST_String filename,
int offset=0,
int length = 0,
int rate = default_sample_rate);
EST_read_status load(EST_TokenStream &ts,
int offset=0,
int length = 0,
int rate = default_sample_rate);
EST_read_status load(const EST_String filename,
const EST_String filetype,
int offset=0,
int length = 0,
int rate = default_sample_rate);
EST_read_status load(EST_TokenStream &ts,
const EST_String filetype,
int offset=0,
int length = 0,
int rate = default_sample_rate);
/** Load a file of type <tt>filetype</tt> into the waveform. This
can be used to load unheadered files, in which case the fields
<tt>sample_rate, sample_type, bo</tt> and <tt>nc</tt> are used
to specify the sample rate, type, byte order and number of
channels. A portion of the waveform can be loaded by setting
<tt> offset</tt> to the sample position from the beginning and
<length> to the number of required samples after this.
*/
EST_read_status load_file(const EST_String filename,
const EST_String filetype, int sample_rate,
const EST_String sample_type, int bo, int nc,
int offset = 0, int length = 0);
EST_read_status load_file(EST_TokenStream &ts,
const EST_String filetype, int sample_rate,
const EST_String sample_type, int bo, int nc,
int offset = 0, int length = 0);
/* Save waveform to a file called <tt>filename</tt> of file
format <tt>EST_filetype</tt>.
*/
EST_write_status save(const EST_String filename,
const EST_String EST_filetype = "");
EST_write_status save(FILE *fp,
const EST_String EST_filetype = "");
EST_write_status save_file(const EST_String filename,
EST_String filetype,
EST_String sample_type, int bo);
EST_write_status save_file(FILE *fp,
EST_String filetype,
EST_String sample_type, int bo);
//@}
/// Assignment operator
EST_Wave& operator = (const EST_Wave& w);
/** Add to existing wave in serial. Waveforms must have the same
number of channels.
*/
EST_Wave& operator +=(const EST_Wave &a);
/** Add wave in parallel, i.e. make wave <tt>a</tt> become new
channels in existing waveform.
*/
EST_Wave& operator |=(const EST_Wave &a);
/// print waveform
friend ostream& operator << (ostream& p_values, const EST_Wave &sig);
// integrity check *** debug
void integrity() const { p_values.integrity() ; }
};
typedef EST_TList<EST_Wave> EST_WaveList;
int operator != (EST_Wave a, EST_Wave b);
int operator == (EST_Wave a, EST_Wave b);
#endif /* __Wave_H__ */
+124
View File
@@ -0,0 +1,124 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996,1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/************************************************************************/
/* Author: Richard Caley (rjc@cstr.ed.ac.uk) */
/* Date: Tue Apr 1 1997 */
/************************************************************************/
/* */
/* Temporary bool type definition. */
/* */
/************************************************************************/
#ifndef __EST_BOOL_H__
#define __EST_BOOL_H__
#ifdef __GNUC__
/* GCC seems to be so very fond of bool -- it's built into
* the compiler and it chokes on my definition.
*/
#ifdef __cplusplus
extern "C" {
#endif
#ifndef TRUE
#define TRUE (1==1)
#endif
#ifndef FALSE
#define FALSE (1==0)
#endif
#ifdef __cplusplus
}
#endif
#else
/* For a boring type we still #define everything for code
* which uses ifdef to see if bool is defined.
*/
#undef true
#undef false
#undef TRUE
#undef FALSE
#ifdef __cplusplus
#if 0
class BoolType {
private:
int p_val;
public:
BoolType(int i) { p_val = i!=0;};
BoolType() { p_val = 1==0;};
operator int () const { return p_val; };
BoolType operator == (BoolType b) const { return p_val == b.p_val;};
BoolType operator != (BoolType b) const { return p_val != b.p_val;};
};
#define true BoolType(1)
#define false BoolType(0)
#define TRUE BoolType(1)
#define FALSE BoolType(0)
#define bool BoolType
#else
/* Because SunCC is stupid we pretend we can't do better than we */
/* could with C. */
#if __SUNPRO_CC_COMPAT != 5
#define bool int
#endif
#define TRUE (1==1)
#define FALSE (1==0)
#define true TRUE
#define false FALSE
#endif
#else /* __cplusplus */
#define bool int
#define TRUE (1==1)
#define FALSE (1==0)
#endif /* __cplusplus */
#endif /* not __GNUC__ */
#endif
+62
View File
@@ -0,0 +1,62 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996,1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/************************************************************************/
/* Author: Richard Caley (rjc@cstr.ed.ac.uk) */
/* Date: Tue Apr 1 1997 */
/************************************************************************/
/* */
/* A place for things to be seen by all of the speech tools. */
/* */
/************************************************************************/
#ifndef __EST_COMMON_H__
#define __EST_COMMON_H__
/* all this stuff should be common to C and C++ */
#ifdef __cplusplus
extern "C" {
#endif
/* Nasty, horrible, yeuch, like gag me with an algebra, man! */
#include "EST_bool.h"
#ifdef INCLUDE_DMALLOC
# include <stdlib.h>
# include <dmalloc.h>
#endif
#ifdef __cplusplus
}
#endif
#endif
+53
View File
@@ -0,0 +1,53 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996,1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* */
/* Author: Richard Caley (rjc@cstr.ed.ac.uk) */
/* Date: Tue Sep4th 1997 */
/* -------------------------------------------------------------------- */
/* Defines for things which have to be hidden from some compilers. */
/* */
/*************************************************************************/
#if !defined(__EST_DEFINES_WIN32_H__)
#define __EST_DEFINES_WIN32_H__ 1
#define size_t unsigned int
#undef DIFFERENCE
#define M_PI (3.1415926)
#define isnan(N) 0
#define isnanf(N) 0
#undef min
#undef max
#endif
+404
View File
@@ -0,0 +1,404 @@
/*************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1995,1996 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
#ifndef __EST_FILTER_H__
#define __EST_FILTER_H__
#include "EST_Wave.h"
#include "EST_FMatrix.h"
#include "EST_Track.h"
#define DEFAULT_PRE_EMPH_FACTOR 0.95
#define DEFAULT_FILTER_ORDER 199
/**@name FIR filters
Finite impulse response (FIR) filters which are useful for band-pass,
low-pass and high-pass filtering.
FIR filters perform the following operation:
\[y_t=\sum_{i=0}^{O-1} c_i \; x_{t-i}\]
where \(O\) is the filter order, \(c_i\) are the filter coefficients,
\(x_t\) is the input at time \(t\) and \(y_t\) is the output at time
\(t\). Functions are provided for designing the filter (i.e. finding
the coefficients).
*/
//@{
/** General purpose FIR filter. This function will filter the
waveform {\tt sig} with a previously designed filter, given as {\tt
numerator}. The filter coefficients can be designed using one of the
designed functions, e.g. \Ref{design_FIR_filter}.
@see design_FIR_filter, design_lowpass_FIR_filter, design_highpass_FIR_filter,
@see FIRfilter, FIRlowpass_filter, FIRhighpass_filter
*/
void FIRfilter(EST_Wave &in_sig, const EST_FVector &numerator,
int delay_correction=0);
/** General purpose FIR filter. This function will filter the
waveform {\tt sig} with a previously designed filter, given as {\tt
numerator}. The filter coefficients can be designed using one of the
designed functions, e.g. \Ref{design_FIR_filter} .
@see design_FIR_filter, design_lowpass_FIR_filter, design_highpass_FIR_filter,
@see FIRfilter, FIRlowpass_filter, FIRhighpass_filter
*/
void FIRfilter(const EST_Wave &in_sig, EST_Wave &out_sig,
const EST_FVector &numerator, int delay_correction=0);
/** General purpose FIR double (zero-phase) filter. This function
will double filter the waveform {\tt sig} with a previously designed
filter, given as {\tt numerator}. The filter coefficients can be
designed using one of the designed functions,
e.g. \Ref{design_FIR_filter}. Double filtering is performed by
filtering the signal normally, reversing the waveform, filtering
again and reversing the waveform again. Normal filtering will impose a
lag on the signal depending on the order of the filter. By filtering
the signal forwards and backwards, the lags cancel each other out and
the output signal is in phase with the input signal.
@see design_FIR_filter, design_lowpass_FIR_filter, design_highpass_FIR_filter,
@see FIRfilter, FIRlowpass_filter, FIRhighpass_filter
*/
void FIR_double_filter(EST_Wave &in_sig, EST_Wave &out_sig,
const EST_FVector &numerator);
/** Quick function for one-off low pass filtering. If repeated lowpass
filtering is needed, first design the required filter using
\Ref{design_lowpass_filter}, and then use \Ref{FIRfilter} to do the actual
filtering.
@see design_FIR_filter, design_lowpass_FIR_filter, design_highpass_FIR_filter, FIRfilter, FIRhighpass_filter, FIRlowpass_filter
@param in_sig input waveform, which will be overwritten
@param freq
@param order number of filter coefficients, eg. 99
*/
void FIRlowpass_filter(EST_Wave &sigin, int freq, int order=DEFAULT_FILTER_ORDER);
/** Quick function for one-off low pass filtering. If repeated lowpass
filtering is needed, first design the required filter using
\Ref{design_lowpass_filter}, and then use \Ref{FIRfilter} to do the actual
filtering.
@param in_sig input waveform
@param out_sig output waveform
@param freq cutoff frequency in Hertz
@param order number of filter coefficients , e.g. 99
@see design_FIR_filter, design_lowpass_FIR_filter, design_highpass_FIR_filter, FIRfilter, FIRhighpass_filter
*/
void FIRlowpass_filter(const EST_Wave &in_sig, EST_Wave &out_sig,
int freq, int order=DEFAULT_FILTER_ORDER);
/** Quick function for one-off high pass filtering. If repeated lowpass
filtering is needed, first design the required filter using
design_lowpass_filter, and then use FIRfilter to do the actual
filtering.
@param in_sig input waveform, which will be overwritten
@param freq cutoff frequency in Hertz
@param order number of filter coefficients, eg. 99
@see design_FIR_filter, design_lowpass_FIR_filter, design_highpass_FIR_filter
@see FIRfilter, FIRlowpass_filter, FIRhighpass_filter
*/
void FIRhighpass_filter(EST_Wave &in_sig, int freq, int order);
/** Quick function for one-off high pass filtering. If repeated highpass
filtering is needed, first design the required filter using
design_highpass_filter, and then use FIRfilter to do the actual
filtering.
@param in_sig input waveform
@param out_sig output waveform
@param freq cutoff frequency in Hertz
@param order number of filter coefficients, eg. 99
@see design_FIR_filter, design_lowpass_FIR_filter, design_highpass_FIR_filter
@see FIRfilter, FIRlowpass_filter, FIRhighpass_filter
*/
void FIRhighpass_filter(const EST_Wave &sigin, EST_Wave &out_sig,
int freq, int order=DEFAULT_FILTER_ORDER);
/** Quick function for one-off double low pass filtering.
Normal low pass filtering (\Ref{FIRlowpass_filter}) introduces a time delay.
This function filters the signal twice, first forward and then backwards,
which ensures a zero phase lag. Hence the order parameter need only be
half what it is for (\Ref{FIRlowpass_filter} to achieve the same effect.
@param in_sig input waveform, which will be overwritten
@param freq cutoff frequency in Hertz
@param order number of filter coefficients, eg. 99
@see FIRhighpass_filter
*/
void FIRhighpass_double_filter(EST_Wave &sigin, int freq,
int order=DEFAULT_FILTER_ORDER);
/** Quick function for one-off double low pass filtering.
Normal low pass filtering (\Ref{FIRlowpass_filter}) introduces a time delay.
This function filters the signal twice, first forward and then backwards,
which ensures a zero phase lag. Hence the order parameter need only be
half what it is for (\Ref{FIRlowpass_filter} to achieve the same effect.
@param in_sig input waveform
@param out_sig output waveform
@param freq cutoff frequency in Hertz
@param order number of filter coefficients, eg. 99
@see FIRhighpass_filter
*/
void FIRhighpass_double_filter(const EST_Wave &int_sig, EST_Wave &out_sig,
int freq, int order=DEFAULT_FILTER_ORDER);
/** Quick function for one-off zero phase high pass filtering.
Normal high pass filtering (\Ref{FIRhighpass_filter}) introduces a time delay.
This function filters the signal twice, first forward and then backwards,
which ensures a zero phase lag. Hence the order parameter need only be
half what it is for (\Ref{FIRhighpass_filter} to achieve the same effect.
@param in_sig input waveform, which will be overwritten
@param freq cutoff frequency in Hertz
@param order number of filter coefficients, eg. 99
@see FIRlowpass_filter
*/
void FIRlowpass_double_filter(EST_Wave &sigin, int freq,
int order=DEFAULT_FILTER_ORDER);
/** Quick function for one-off zero phase high pass filtering.
Normal high pass filtering (\Ref{FIRhighpass_filter}) introduces a time delay.
This function filters the signal twice, first forward and then backwards,
which ensures a zero phase lag. Hence the order parameter need only be
half what it is for (\Ref{FIRhighpass_filter} to achieve the same effect.
@param in_sig input waveform
@param out_sig output waveform
@param freq cutoff frequency in Hertz
@param order number of filter coefficients, eg. 99
@see FIRlowpass_filter
*/
void FIRlowpass_double_filter(const EST_Wave &in_sig, EST_Wave &out_sig,
int freq, int order=DEFAULT_FILTER_ORDER);
//@}
/**@name Linear Prediction filters
The linear prediction filters are used for the analysis and synthesis of
waveforms according the to linear prediction all-pole model.
The linear prediction states that the value of a signal at a given
point is equal to a weighted sum of the previous P values, plus a
correction value for that point:
\[s_{n} = \sum_{i=1}^{P} a_{i}.s_{n-i} + e_{n}\]
Given a set of coefficients and the original signal, we can use this
equation to work out e, the {\it residual}. Conversely given the
coefficients and the residual signal, an estimation of the original
signal can be calculated.
If a single set of coefficients were used for the entire waveform, the
filtering process would be simple. It is usual however to have a
different set of coefficients for every frame, and there are many
possible ways to switch from one coefficient set to another so as not
to cause discontinuities at the frame boundaries.
*/
//@{
/** Synthesize a signal from a single set of linear prediction
coefficients and the residual values.
@param sig the waveform to be synthesized
@param a a single set of LP coefficients
@param res the input residual waveform
*/
void lpc_filter(EST_Wave &sig, EST_FVector &a, EST_Wave &res);
/** Filter the waveform using a single set of coefficients so as to
produce a residual signal.
@param sig the speech waveform to be filtered
@param a a single set of LP coefficients
@param res the output residual waveform
*/
void inv_lpc_filter(EST_Wave &sig, EST_FVector &a, EST_Wave &res);
/** Synthesize a signal from a track of linear prediction coefficients.
This function takes a set of LP frames and a residual and produces a
synthesized signal.
For each frame, the function picks an end point, which is half-way
between the current frame's time position and the next frame's. A
start point is defined as being the previous frame's end. Using these
two values, a portion of residual is extracted and passed to
\Ref{lpc_filter} along with the LP coefficients for that frame. This
function writes directly into the signal for the values between start
and end;
@param sig the waveform to be synthesized
@param lpc a track of time positioned LP coefficients
@param res the input residual waveform
*/
void lpc_filter_1(EST_Track &lpc, EST_Wave & res, EST_Wave &sig);
/** Synthesize a signal from a track of linear prediction coefficients.
This function takes a set of LP frames and a residual and produces a
synthesized signal.
This is functionally equivalent to \Ref{lpc_filter_1} except it
reduces the residual by 0.5 before filtering. Importantly it is
about three times faster than \Ref{lpc_filter_1} but in doing so uses
direct C buffers rather than the neat C++ access function. This
function should be regarded as temporary and will be deleted after
we restructure the low level classes to give better access.
@param sig the waveform to be synthesized
@param lpc a track of time positioned LP coefficients
@param res the input residual waveform
*/
void lpc_filter_fast(EST_Track &lpc, EST_Wave & res, EST_Wave &sig);
/** Produce a residual from a track of linear prediction coefficients
and a signal using an overlap add technique.
For each frame, the function estimates the local pitch period and
picks a start point one period before the current time position and an
end point one period after it.
A portion of residual corresponding to these times is then produced
using \Ref{inv_lpc_filter}. The resultant section of residual is then
overlap-added into the main residual wave object.
@param sig the speech waveform to be filtered
@param lpc a track of time positioned LP coefficients
@param res the output residual waveform
*/
void inv_lpc_filter_ola(EST_Wave &sig, EST_Track &lpc, EST_Wave &res);
//@}
/**@name Pre/Post Emphasis filters.
These functions adjust the spectral tilt of the input waveform.
*/
//@{
/** Pre-emphasis filtering. This performs simple high pass
filtering with a one tap filter of value {\tt a}. Normal values of a
range between 0.95 and 0.99. */
void pre_emphasis(EST_Wave &sig, float a=DEFAULT_PRE_EMPH_FACTOR);
/** Pre-emphasis filtering. This performs simple high pass
filtering with a one tap filter of value {\tt a}. Normal values of a
range between 0.95 and 0.99. */
void pre_emphasis(EST_Wave &sig, EST_Wave &out,
float a=DEFAULT_PRE_EMPH_FACTOR);
/** Post-emphasis filtering. This performs simple low pass
filtering with a one tap filter of value a. Normal values of a range
between 0.95 and 0.99. The same values of {\tt a} should be used when
pre- and post-emphasizing the same signal. */
void post_emphasis(EST_Wave &sig, float a=DEFAULT_PRE_EMPH_FACTOR);
/** Post-emphasis filtering. This performs simple low pass
filtering with a one tap filter of value a. Normal values of a range
between 0.95 and 0.99. The same values of {\tt a} should be used when
pre- and post-emphasizing the same signal. */
void post_emphasis(EST_Wave &sig, EST_Wave &out,
float a=DEFAULT_PRE_EMPH_FACTOR);
//@}
/**@name Miscellaneous filters.
Some of these filters are non-linear and therefore don't fit the
normal paradigm.
*/ //@{
/** Filters the waveform by means of median smoothing.
This is a sort of low pass filter which aims to remove extreme values.
Median smoothing works examining each sample in the wave, taking all
the values in a window of size {\tt n} around that sample, sorting
them and replacing that sample with the middle ranking sample in the
sorted samples.
@param sig waveform to be filtered
@param n size of smoothing window
*/
void simple_mean_smooth(EST_Wave &c, int n);
//@}
#endif /* __EST_FILTER_H__ */
+59
View File
@@ -0,0 +1,59 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996,1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* */
/* Author: Richard Caley (rjc@cstr.ed.ac.uk) */
/* Date: Tue Sep4th 1997 */
/* -------------------------------------------------------------------- */
/* Wrapper around iostream.h because the visual C++ clashes with some */
/* unix stuff. */
/* */
/*************************************************************************/
#if !defined(EST_IOSTREAM_H)
# define EST_IOSTREAM_H 1
#include "EST_system.h"
#if defined(__EMX__)
/* For OS/2 */
# include <iostream.h>
#elif defined(SYSTEM_IS_UNIX)
# include <iostream.h>
#elif defined(SYSTEM_IS_WIN32)
# include "EST_iostream_win32.h"
#else
# error No System Selected
#endif
#endif
+158
View File
@@ -0,0 +1,158 @@
/*************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1994,1995,1996 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* Author : Paul Taylor */
/* Date : April 1994 */
/*-----------------------------------------------------------------------*/
/* Utility Function header file for C and C++ */
/* */
/*=======================================================================*/
#ifndef __RW_STATUS_H__
#define __RW_STATUS_H__
#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#include <errno.h>
/*
* make_status_int builds the status as an integer
* make_X_status casts it to the required type.
*/
#define make_status_int(STATE, REASON, ERRNO) \
( ((((unsigned int)(STATE)) & 0xff) <<24) \
| ((((unsigned int)(REASON)) & 0xff) <<16) \
| ((((unsigned int)(ERRNO)) & 0xffff) <<00) \
)
#define make_read_status(STATE, REASON, ERRNO)\
((EST_read_status)(make_status_int(STATE, REASON, ERRNO)))
#define make_write_status(STATE, REASON, ERRNO) \
((EST_write_status)(make_status_int(REASON, STATE, ERRNO)))
/*
* Extract the bits.
*/
#define get_rw_state(STATUS) \
((EST_rw_state)((((unsigned int)(STATUS)) >> 24) & 0xff))
#define get_rw_reason(STATUS) \
((EST_rw_reason)((((unsigned int)(STATUS)) >> 16) & 0xff))
#define get_rw_errno(STATUS) \
((int)((((unsigned int)(STATUS)) >> 0) & 0xff))
/*
* Why we failed.
*/
enum EST_rw_reason {
rwr_none=0,
rwr_format=1,
rwr_existance=2,
rwr_permission=3,
rwr_system=4,
rwr_unknown=0xff
};
/** State of rw */
enum EST_rw_state {
/// ok
rws_ok=0,
/// partial
rws_partial=1,
/// failed
rws_failed=0xff
};
/** Possible outcomes of a file reading operation. More stuff*/
enum EST_read_status {
/// The file was read in successfully
read_ok = make_status_int(rws_ok, rwr_none, 0),
/// The file exists but is not in the format specified
read_format_error = make_status_int(rws_failed, rwr_format, 0),
/// The file does not exist.
read_not_found_error = make_status_int(rws_failed, rwr_existance, 0),
/// An error occurred while reading
read_error = make_status_int(rws_failed, rwr_unknown, 0)
};
/** Possible outcomes of a file writing operation */
enum EST_write_status {
/// The file was written successfully
write_ok = make_status_int(rws_ok, rwr_none, 0),
/// The file was not written successfully
write_fail = make_status_int(rws_failed, rwr_unknown, 0),
/// The file was not written successfully
write_error = make_status_int(rws_failed, rwr_unknown, 0),
/// A valid file was created, but only some of the requested data is in there
write_partial = make_status_int(rws_partial, rwr_unknown, 0)
};
/** Possible outcomes of a network connection operation */
enum EST_connect_status {
/// Connection made.
connect_ok = make_status_int(rws_ok, rwr_none, 0),
/// Connection failed.
connect_not_found_error = make_status_int(rws_failed, rwr_existance, 0),
/// Connection failed.
connect_not_allowed_error = make_status_int(rws_failed, rwr_permission, 0),
/// System failure of some kind
connect_system_error = make_status_int(rws_failed, rwr_system, 0),
/// The file was not written successfully
connect_error = make_status_int(rws_failed, rwr_unknown, 0)
};
#ifdef __cplusplus
}
#endif
/*
* Temporary redefinitions of the old values.
*/
#define format_ok read_ok
#define wrong_format read_format_error
#define misc_read_error read_error
#define misc_write_error write_error
#endif /*__RW_STATUS_H__ */
+66
View File
@@ -0,0 +1,66 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996,1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/************************************************************************/
/* */
/* Author: Richard Caley (rjc@cstr.ed.ac.uk) */
/* Date: Wed Jun 25 1997 */
/* -------------------------------------------------------------------- */
/* */
/* Declaration for string comparison operation. */
/* */
/************************************************************************/
#ifndef __EST_STRCASECMP_H__
#define __EST_STRCASECMP_H__
#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
#endif
int EST_strcasecmp(const char *s1, const char *s2,
const unsigned char *charmap);
int EST_strncasecmp(const char *s1, const char *s2,
size_t n, const unsigned char *charmap);
#ifdef __cplusplus
}
inline int EST_strcasecmp(const char *s1, const char *s2)
{ return EST_strcasecmp(s1, s2, NULL); };
inline int EST_strncasecmp(const char *s1, const char *s2, size_t n)
{ return EST_strncasecmp(s1, s2, n, NULL); };
#endif
#endif
+81
View File
@@ -0,0 +1,81 @@
/*************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1995,1996 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* Author : Paul Taylor */
/* Date : July 1996 */
/*-----------------------------------------------------------------------*/
/* Type defines for Common Types */
/* */
/*=======================================================================*/
#ifndef __EST_TYPES_H__
#define __EST_TYPES_H__
#include "EST_TList.h"
#include "EST_TVector.h"
#include "EST_String.h"
#include "EST_TKVL.h"
#include "EST_FMatrix.h"
#include "EST_DMatrix.h"
#include "EST_IMatrix.h"
#include "EST_SMatrix.h"
typedef EST_TVector<EST_String> EST_StrVector;
typedef EST_TSimpleVector<int> EST_IVector;
typedef EST_TSimpleVector<short> EST_SVector;
typedef EST_TSimpleVector<char> EST_CVector;
// DVector is an inherited TSimpleVector in EST_DMatrix.h
// FVector is an inherited TSimpleVector in EST_FMatrix.h
typedef EST_TList<int> EST_IList;
typedef EST_TList<float> EST_FList;
typedef EST_TList<double> EST_DList;
typedef EST_TKVL<int, int> EST_II_KVL;
typedef EST_TList<EST_TList<int> > EST_IListList;
typedef EST_TList<EST_String> EST_StrList;
typedef EST_TList<int> EST_IList;
typedef EST_TList<float> EST_FList;
typedef EST_TList<EST_TList<EST_String> > EST_StrListList;
typedef EST_TVector<EST_StrList> EST_StrListVector;
typedef EST_TKVL<EST_String, EST_String> EST_StrStr_KVL;
typedef EST_TKVL<EST_String, int> EST_StrI_KVL;
typedef EST_TKVL<EST_String, float> EST_StrF_KVL;
typedef EST_TKVL<EST_String, double> EST_StrD_KVL;
//typedef EST_TKVL<EST_String, EST_Val> EST_StrVal_KVL;
#endif // __EST_TYPES_H__
+59
View File
@@ -0,0 +1,59 @@
/*************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1994,1995,1996 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* Author : Paul Taylor and Alan W Black */
/* Date : July 1996 */
/*-----------------------------------------------------------------------*/
/* Safe(-er) allocation functions. */
/* */
/*=======================================================================*/
#if !defined(__EST_WALLOC_H__)
#if defined(__cplusplus)
extern "C" {
#endif
void *safe_walloc(int size);
void *safe_wcalloc(int size);
void *safe_wrealloc(void *ptr, int size);
#define walloc(TYPE,SIZE) ((TYPE *)safe_walloc(sizeof(TYPE)*(SIZE)))
#define wcalloc(TYPE,SIZE) ((TYPE *)safe_wcalloc(sizeof(TYPE)*(SIZE)))
#define wrealloc(PTR,TYPE,SIZE) ((TYPE *)safe_wrealloc((void *)(PTR), sizeof(TYPE)*(SIZE)))
char *wstrdup(const char *s);
void wfree(void *p);
#if defined(__cplusplus)
}
#endif
#endif
+51
View File
@@ -0,0 +1,51 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996,1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* */
/* Author: Richard Caley (rjc@cstr.ed.ac.uk) */
/* Date: Tue Sep4th 1997 */
/* -------------------------------------------------------------------- */
/* Wrapper around iostream includes to avoid aome win32 nasties. */
/* */
/*************************************************************************/
#if !defined(__EST_IOSTREAM_WIN32_H__)
# define __EST_IOSTREAM_WIN32_H__ 1
#include <iostream>
#undef read
#undef write
#endif
+60
View File
@@ -0,0 +1,60 @@
/************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1996,1997 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* */
/* Author: Richard Caley (rjc@cstr.ed.ac.uk) */
/* Date: Tue Sep4th 1997 */
/* -------------------------------------------------------------------- */
/* Make all systems look similar enough to unix to be easy to cope with. */
/* */
/*************************************************************************/
#if !defined(EST_SYSTEM_H)
# define EST_SYSTEM_H 1
#define SYSTEM_IS_WIN32
#if defined(SYSTEM_IS_WIN32)
# define _WINSOCKAPI_ /* horrible hack */
# include <windows.h>
# include <winbase.h>
# include "EST_defines_win32.h"
# if defined(_MSC_VER)
# define VISUAL_CPP 1
# endif
#else
# define SYSTEM_IS_UNIX 1
# include <sys/types.h>
# include "unix/EST_defines_unix.h"
#endif
#endif
+3
View File
@@ -0,0 +1,3 @@
The Edinburgh Speech Tools Library
Centre for Speech Technology Research
http://www.cstr.ed.ac.uk/projects/speech_tools/
+138
View File
@@ -0,0 +1,138 @@
/*************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1995,1996 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* Author : Paul Taylor */
/* Date : April 1994 */
/*************************************************************************/
#ifndef __SRPD_H__
#define __SRPD_H__
#include <stdio.h>
/********************
* define constants *
********************/
#define MINARG 5
#define BREAK_NUMBER 0.0
#define DEFAULT_DECIMATION 4 /* samples */
#define DEFAULT_MIN_PITCH 40.0 /* Hz */
#define DEFAULT_MAX_PITCH 400.0 /* Hz */
#define DEFAULT_SF 20000 /* Hz. Sampling Frequency */
#define DEFAULT_SHIFT 5.0 /* ms */
#define DEFAULT_LENGTH 10.0 /* ms */
#define DEFAULT_TSILENT 120 /* max. abs sample amplitude of noise */
#define DEFAULT_TMIN 0.75
#define DEFAULT_TMAX_RATIO 0.85
#define DEFAULT_THIGH 0.88
#define DEFAULT_TDH 0.77
#define UNVOICED 0 /* segment classifications */
#define VOICED 1
#define SILENT 2
#define HOLD 1
#define HELD 1
#define SEND 2
#define SENT 2
/******************************
* define abstract data types *
******************************/
struct CROSS_CORR_
{
int size;
double *coeff;
} ;
struct SEGMENT_
{ /* segment of speech data */
int size, shift, length; /* in samples */
short *data;
};
struct Srpd_Op {
int sample_freq; /* Hz */
int Nmax, Nmin;
double shift, length; /* ms */
double min_pitch; /* Hz */
double max_pitch; /* Hz */
int L; /* Decimation factor (samples) */
double Tmin, Tmax_ratio, Thigh, Tdh;
int Tsilent;
int make_ascii;
int peak_tracking;
};
struct STATUS_ {
double pitch_freq;
char v_uv, s_h;
double cc_max, threshold;
};
typedef struct list {
int N0, score;
struct list *next_item;
} LIST_;
typedef enum {
CANT_WRITE, DECI_FCTR, INSUF_MEM, FILE_ERR, FILE_SEEK, LEN_OOR, MAX_FREQ,
MIN_FREQ, MISUSE, NOISE_FLOOR, SAMPLE_FREQ, SFT_OOR, THR_DH, THR_HIGH,
THR_MAX_RTO, THR_MIN
} error_flags;
void add_to_list (LIST_ **p_list_hd, LIST_ **p_list_tl, int N_val,
int score_val);
void super_resolution_pda (struct Srpd_Op *paras, SEGMENT_ seg,
CROSS_CORR_ *p_cc, STATUS_ *p_status);
void write_track(STATUS_ status, struct Srpd_Op paras, FILE *outfile);
int read_next_segment (FILE *voxfile, struct Srpd_Op *paras, SEGMENT_ *p_seg);
void end_structure_use(SEGMENT_ *p_seg, CROSS_CORR_ *p_cc);
void initialise_status (struct Srpd_Op *p, STATUS_ *p_status);
void initialise_structures (struct Srpd_Op *p, SEGMENT_ *p_seg,
CROSS_CORR_ *p_cc);
void initialise_parameters (struct Srpd_Op *p_par);
void error (error_flags err_type);
void free_list (LIST_ **p_list_hd);
#endif // __SRPD_H__