예제 #1
0
파일: resampler.c 프로젝트: oranzhang/RUCE
//resampler <wav in> <wav out> <pitch> <velocity> <flags>
int main(int ArgQ, char** ArgList)
{
    CDSP2_SetArch(CDSP2_Arch_Gnrc);
    CDSP2_SetDebugOn(CDSP2_Debug_Check);
    
    printf("Sleepwalking's toy resampler v0.1.\n");
    printf("Powered by Rocaloid's subprojects: CVESVP, CVEDSP2, and RFNL.\n");
    
    String OutputPath, InputPath, StrPitch, StrVelocity, StrFlags, StrOffset,
        StrLength;
    RNew(String, & OutputPath, & InputPath, & StrPitch, & StrVelocity, 
        & StrFlags, & StrOffset, & StrLength);
    
    if(ArgQ < 4)
    {
        printf("Wrong number of Arguments.\n");
        return 1;
    }
    
    String_SetChars(& InputPath, ArgList[1]);
    String_SetChars(& OutputPath, ArgList[2]);
    String_SetChars(& StrPitch, ArgList[3]);
    
    String_SetChars(& StrVelocity, "100");
    String_SetChars(& StrFlags, "");
    String_SetChars(& StrOffset, "0");
    String_SetChars(& StrLength, "-1");
    
    if(ArgQ > 4)
        String_SetChars(& StrVelocity, ArgList[4]);
    if(ArgQ > 5)
        String_SetChars(& StrFlags, ArgList[5]);
    if(ArgQ > 6)
        String_SetChars(& StrOffset, ArgList[6]);
    if(ArgQ > 7)
        String_SetChars(& StrLength, ArgList[7]);
    
    number Fundamental = FreqFromPitch(& StrPitch);
    number Velocity    = CNumberStr(& StrVelocity);
    int    Length      = CIntStr(& StrLength);
    if(Fundamental < 50)
    {
        printf("Wrong pitch.\n");
        return 1;
    }
    
    /*
    printf("resampler (in)%s (out)%s (pitch)%s (vel)%s (flags)%s (offset)%s "
           "(length)%s\n",
        String_GetChars(& InputPath), String_GetChars(& OutputPath),
        String_GetChars(& StrPitch), String_GetChars(& StrVelocity), 
        String_GetChars(& StrFlags), String_GetChars(& StrOffset), 
        String_GetChars(& StrLength));
    */
    
    Wave InWave, OutWave;
    FWindow_T DyWin;
    PSOLAIterlyzer PAna;
    PSOLAItersizer PSyn;
    List_DataFrame DataList;
    number* HannWind = RCall(RAlloc, number)(2048);
    RNew(Wave, & InWave, & OutWave);
    RNew(PSOLAIterlyzer, & PAna);
    RNew(PSOLAItersizer, & PSyn);
    RNew(List_DataFrame, & DataList);
    
    RCall(CDSP2_GenHanning, number)(HannWind, 2048);
    RCall(Wave, Resize)(& OutWave, 100000);
    RCall(Wave, SetWindow)(& InWave, HannWind, 2048);
    RCall(Wave, SetWindow)(& OutWave, HannWind, 2048);
    
    if(! RCall(Wave, FromFile)(& InWave, & InputPath))
    {
        printf("Cannot read file!\n");
        return 1;
    }
    
    Length = Length * (number)InWave.SampleRate / 1000;
    if(Length < 0) Length = InWave.Size;
    
    int VOT = RCall(CSVP_VOTFromWave, number)(& InWave, 0, InWave.Size / 2);
    int Onset = RCall(CSVP_OnsetFromWave, number)
        (& InWave, 0.005, 0, InWave.Size);
    
    printf("Got VOT at %d.\n", VOT);
    printf("Got Onset at %d.\n", Onset);
    
    //Analysis process
    RCall(PSOLAIterlyzer, SetWave)(& PAna, & InWave);
    RCall(PSOLAIterlyzer, SetPosition)(& PAna, VOT + 2000);
    RCall(PSOLAIterlyzer, SetBound)(& PAna, VOT);
    
    if(! RCall(PSOLAIterlyzer, PreAnalysisTo)(& PAna, VOT + 4000))
    {
        printf("Preanalysis failed.\n");
        return 1;
    }
    RCall(PSOLAIterlyzer, IterNextTo)(& PAna, InWave.Size);
    RCall(PSOLAIterlyzer, PrevTo)(& PAna, Onset);
    RCall(List_DataFrame, FromWave)(& DataList, & InWave, & PAna.PulseList);
    
    
    int i;
    /*
    for(i = 0; i <= PAna.PulseList.Frames_Index; i ++)
    {
        int p = RCall(PSOLAIterlyzer, Fetch)(& PAna, i);
        printf("%f %f\n", (float)p / InWave.SampleRate
                        , (float)p / InWave.SampleRate);
    }*/
    
    //Pre-synthesis process
    OutWave.SampleRate = InWave.SampleRate;
    
    RCall(FWindow_T, Ctor)(& DyWin);
    RCall(FWindow, SetPara)(& DyWin, 30, 3000, 20);
    RCall(FWindow, SetFunc)(& DyWin, 
        _C(RFNL_Hanning_Size_Gnrc, _, number),
        _C(RFNL_Hanning_Valu_Gnrc, _, number));
    RCall(FWindow, Initialize)(& DyWin);
    
    RCall(PSOLAItersizer, SetWave)(& PSyn, & OutWave);
    RCall(PSOLAItersizer, SetWindow)(& PSyn, & DyWin);
    RCall(PSOLAItersizer, SetPosition)(& PSyn, 0);
    
    //Transposition process
    PMatch SorcPulse, LengthMatch;
    RNew(PMatch, & SorcPulse, & LengthMatch);
    for(i = 0; i <= PAna.PulseList.Frames_Index; i ++)
        PAna.PulseList.Frames[i] -= Onset;
    PMatchFromList_Int(& SorcPulse, & PAna.PulseList);
    int Fill = SorcPulse.X[1] - SorcPulse.X[0];
    i = 0;
    number p = SorcPulse.X[0];
    number Period = (number)InWave.SampleRate / Fundamental;
    while(p < VOT - Onset)
    {
        i = RCall(PMatch, Query)(& SorcPulse, p).LowerIndex;
        RCall(PSOLAItersizer, Add)(& PSyn, p, & DataList.Frames[i]);
        p += Fill;
    }
    
    RCall(PMatch, AddPair)(& LengthMatch, VOT - Onset, VOT - Onset);
    RCall(PMatch, AddPair)(& LengthMatch, Length,
        SorcPulse.X[SorcPulse.X_Index - 1]);
    while(p < Length)
    {
        Transition TransPulse;
        int p2 = RCall(PMatch, Query)(& LengthMatch, p).Y;
        TransPulse = RCall(PMatch, Query)(& SorcPulse, p2);
        i = TransPulse.LowerIndex;
        RCall(PSOLAItersizer, Add)(& PSyn, p, & DataList.Frames[i]);
        p += Period;
    }
    
    int Offset = (int)CNumberStr(& StrOffset) * InWave.SampleRate / 1000;
    //int OffIndex = RCall(PMatch, Query)(& SorcPulse, Offset).LowerIndex;
    RCall(PSOLAItersizer, RepositionFrom)(& PSyn, Onset - Offset);
    
    //Synthesis process
    RCall(PSOLAItersizer, IterNextTo)(& PSyn, InWave.Size);
    RCall(Wave, ToFile)(& OutWave, & OutputPath);
    
    printf("Generated.\n");
    
    RFree(HannWind);
    RDelete(& OutputPath, & InputPath, & StrPitch, & StrVelocity, & StrFlags,
        & InWave, & OutWave, & DyWin, & PAna, & PSyn, & DataList, & SorcPulse,
        & LengthMatch, & StrOffset, & StrLength);
}
예제 #2
0
파일: main.c 프로젝트: oranzhang/CVESVP
int main(int argc, char** arg)
{
    int i, j;
    
    Wave XWave, YWave;
    RCall(Wave, CtorSize)(& XWave, 20);
    RCall(Wave, CtorSize)(& YWave, 44100 * 5);
    Float* Win = RAlloc_Float(2048);
    CDSP2_GenHanning_Float(Win, 2048);
    RCall(Wave, SetWindow)(& XWave, Win, 2048);
    RCall(Wave, SetWindow)(& YWave, Win, 2048);
    
    String Path;
    String_Ctor(& Path);
    String_SetChars(& Path, arg[1]);
    RCall(Wave, FromFile)(& XWave, & Path);
    RCall(Wave, Resize)(& YWave, XWave.Size * Stretch + 5000);
    
    int VOT = CSVP_VOTFromWave_Float(& XWave, 0, XWave.Size - 5000);
    printf("VOT: %d\n", VOT);
    
    CSVP_F0Iterlyzer_Float F0Iter;
    CSVP_F0Iterlyzer_Float_Ctor(& F0Iter);
    F0Iter.Option.Adlib = 1;
    F0Iter.Option.LFreq = 50;
    F0Iter.Option.HFreq = 700;
    F0Iter.Option.Method = CSVP_F0_YIN;
    
    CSVP_F0Iterlyzer_Float_SetHopSize(& F0Iter, 256);
    CSVP_F0Iterlyzer_Float_SetWave(& F0Iter, & XWave);
    CSVP_F0Iterlyzer_Float_SetPosition(& F0Iter, VOT + 2000);
    CSVP_F0Iterlyzer_Float_PreAnalysisTo(& F0Iter, VOT + 10000);
    
    CSVP_F0Iterlyzer_Float_IterNextTo(& F0Iter, XWave.Size - 5000);
    CSVP_F0Iterlyzer_Float_PrevTo(& F0Iter, 0);
    
    CSVP_F0PostProcess_Float(& F0Iter.F0List, 4000, 0.15, 100, 700);
    printf("Got F0.\n");
    
    HNMIterlyzer HNMIter;
    RCall(HNMIterlyzer, CtorSize)(& HNMIter, 2048);
    HNMIter.GenPhase = 1;
    //HNMIter.LeftBound = VOT;
    
    RCall(HNMIterlyzer, SetHopSize)(& HNMIter, FFTSIZE);
    RCall(HNMIterlyzer, SetWave)(& HNMIter, & XWave);
    RCall(HNMIterlyzer, SetPosition)(& HNMIter, VOT + 1000);
    RCall(HNMIterlyzer, SetUpperFreq)(& HNMIter, 10000);
    RCall(HNMIterlyzer, SetPitch)(& HNMIter, & F0Iter.F0List);
    
    RCall(HNMIterlyzer, PrevTo)(& HNMIter, 0);
    RCall(HNMIterlyzer, IterNextTo)(& HNMIter, XWave.Size);
    
    HNMItersizer HNMSizer;
    RCall(HNMItersizer, CtorSize)(& HNMSizer, 2048);
    
    HNMContour TempCont;
    HNMFrame   TempHNM;
    RCall(HNMContour, Ctor)(& TempCont);
    RCall(HNMFrame, Ctor)(& TempHNM);
    
    CSVP_PitchModel PM;
    CSVP_PitchModel_Ctor(& PM);
    
    int Offset = HNMIter.PulseList.Frames[0];
    int Last;
    for(i = 0; i <= HNMIter.PulseList.Frames_Index; i ++)
    {
        HNMFrame* OrigHNM = & HNMIter.HNMList.Frames[i];
        
        float F0 = OrigHNM -> Hmnc.Freq[0] * 2;
        
        CSVP_PitchConvertHNMFrame_Float(& TempCont, OrigHNM, & PM, F0, 12000,
            XWave.SampleRate);
        RCall(HNMFrame, From)(& TempHNM, OrigHNM);
        //RCall(HNMFrame, FromContour)(& TempHNM, & TempCont, F0, 12000);
        /*
        if(i % 5 == 0)
        {
            float PhaseAdj = CSVP_PitchModel_GetPhseCoh(& PM, F0);
            CSVP_PhaseSyncH_Float(& HNMIter.PhseList.Frames[i], 0);
            CSVP_PhaseContract_Float(& HNMIter.PhseList.Frames[i], PhaseAdj);
            RCall(HNMItersizer, AddPhase)(& HNMSizer,
                & HNMIter.PhseList.Frames[i], Offset);
        }*/
        RCall(HNMItersizer, AddPhase)(& HNMSizer, & HNMIter.PhseList.Frames[i],
            HNMIter.PulseList.Frames[i]);
        // Uncomment to plot the spectral env.
        /*
        if(Offset > 10000)
        {
            for(j = 0; j < 1024; j ++)
                printf("%f\n", TempCont.Hmnc[j]);
            exit(0);
        }*/
        
        for(j = 0; j < Stretch; j ++)
        {
            RCall(HNMItersizer, Add)(& HNMSizer, & TempHNM, Offset);
            Offset += FFTSIZE;
        }
    }
    Last = HNMSizer.PulseList.Frames[i * Stretch - 1];
    RDelete(& TempCont, & TempHNM, & PM);
    
    
    RCall(HNMItersizer, SetHopSize)(& HNMSizer, FFTSIZE);
    RCall(HNMItersizer, SetWave)(& HNMSizer, & YWave);
    
    RCall(HNMItersizer, SetPosition)(& HNMSizer,
        HNMSizer.SubsizerS -> PhseMatch.PulseList.X[50]);
    RCall(HNMItersizer, SetInitPhase)(& HNMSizer,
        & HNMSizer.SubsizerS -> PhseMatch.PhseList.Frames[50]);
    printf("%f\n", HNMSizer.SubsizerS -> PhseMatch.PulseList.X[50]);
    
    HNMSizer.Option.PhaseControl = 1;//CSVP_PhaseFlag_Regen;
    /*
    RCall(HNMItersizer, PrevTo    )(& HNMSizer, 0);
    RCall(HNMItersizer, IterNextTo)(& HNMSizer, Last - 8000);
    RCall(HNMItersizer, IterNextTo)(& HNMSizer, Last - 1000);
    RCall(HNMItersizer, IterNextTo)(& HNMSizer, Last);
    */
    
    List_Sinusoid SList;
    RCall(List_Sinusoid, Ctor)(& SList);
    RCall(List_HNMFrame, ToSinuList)(& HNMIter.HNMList, & SList);
    
    CSVP_SinusoidalFromSinuList_Float(& YWave, & HNMIter.PulseList,
        & SList, & HNMIter.PhseList);
    /*
    CSVP_NoiseTurbFromSinuList_Float(& YWave, & XWave, & HNMIter.PulseList,
        & SList, & HNMIter.PhseList);
    */
    RCall(List_Sinusoid, Dtor)(& SList);
    
    YWave.SampleRate = XWave.SampleRate;
    if(argc > 2)
        String_SetChars(& Path, arg[2]);
    else
        String_SetChars(& Path, "/tmp/out.wav");
    
    RCall(Wave, ToFile)(& YWave, & Path);
    
    RFree(Win);
    RDelete(& Path);
    RDelete(& XWave, & YWave, & HNMIter, & HNMSizer, & F0Iter);
    return 0;
}
예제 #3
0
파일: resampler.c 프로젝트: oranzhang/RUCE
void PMatchFromList_Int(PMatch* Dest, List_Int* Sorc)
{
    int i;
    for(i = Sorc -> Frames_Index; i >= 0; i --)
        RCall(PMatch, AddPair)(Dest, Sorc -> Frames[i], i);
}
예제 #4
0
int main(int ArgN, char** Arg)
{
    int RegenFlag = 0;
    
    char* CWaveFile = NULL;
    char* CLabelFile = NULL;
    char* CRecFile = NULL;
    char* CRegenFile = "RegeneratedTrack.txt";
    
    int c;
    
    while((c = getopt(ArgN, Arg, "r")) != -1)
    {
        switch(c)
        {
            case 'r':
                RegenFlag = 1;
            break;
            case '?':
                printf("Usage: rsegment [-r] "
                           "[-h] wavfile labelfile recfile\n");
                return 1;
            default:
                abort();
        }
    }
    
    int i;
    for(i = optind; i < ArgN; i ++)
    {
        switch(i - optind)
        {
            case 0:
                CWaveFile = Arg[i];
            break;
            case 1:
                CLabelFile = Arg[i];
            break;
            case 2:
                CRecFile = Arg[i];
            break;
            default:
                fprintf(stderr, "Warning: redundant argument '%s'.\n", Arg[i]);
        }
    }
    
    if(! CWaveFile)
    {
        fprintf(stderr, "Missing argument 'wavfile'.\n");
        return 1;
    }
    if(! CLabelFile)
    {
        fprintf(stderr, "Missing argument 'labelfile'.\n");
        return 1;
    }
    if(! CRecFile)
    {
        fprintf(stderr, "Missing argument 'recfile'.\n");
        return 1;
    }
    
    Wave SorcWave;
    File LabelFile;
    File RecFile;
    File RegenFile;
    String WavePath, LabelPath, RecPath, RegenPath;
    
    RNew(String, & WavePath, & LabelPath, & RecPath, & RegenPath);
    RNew(File, & LabelFile, & RecFile, & RegenFile);
    RCall(Wave, Ctor)(& SorcWave);
    
    String_SetChars(& WavePath, CWaveFile);
    String_SetChars(& LabelPath, CLabelFile);
    String_SetChars(& RecPath, CRecFile);
    String_SetChars(& RegenPath, CRegenFile);

    if(! RCall(Wave, FromFile)(& SorcWave, & WavePath))
    {
        fprintf(stderr, "Cannot load wave file.\n");
        return 1;
    }
    if(! File_Open(& LabelFile, & LabelPath, READONLY))
    {
        fprintf(stderr, "Cannot load label file.\n");
        return 1;
    }
    if(! File_Open(& RecFile, & RecPath, READONLY))
    {
        fprintf(stderr, "Cannot load word table.\n");
        return 1;
    }
    if(RegenFlag)
    {
        if(! File_Open(& RegenFile, & RegenPath, CREATE))
        {
            fprintf(stderr, "Cannot create '%s'.\n", CRegenFile);
            return 1;
        }
    }
    
    Array_Ctor(String, RecList);
    Array_Ctor(int, SegList);
    
    ParseRecFile(& RecFile);
    ParseLabelFile(& LabelFile, SorcWave.SampleRate);
    
    Wave SegWave;
    RCall(Wave, Ctor)(& SegWave);
    SegWave.SampleRate = SorcWave.SampleRate;
    
    String SegName, LineBuf, TempBuf;
    RNew(String, & SegName, & LineBuf, & TempBuf);
    for(i = 0; i <= SegList_Index; i ++)
    {
        int Start = SegList[i];
        int End;
        if(i == SegList_Index)
            End = SorcWave.Size;
        else
            End = SegList[i + 1];
        
        if(i > RecList_Index)
        {
            fprintf(stderr, "Insufficient records in word table.\n");
            fprintf(stderr, "Segmentation aborted at %fs.\n",
                (float)Start / SorcWave.SampleRate);
            return 1;
        }
        
        String* Name = & RecList[i];
        String_Copy(& SegName, Name);
        String_JoinChars(& SegName, ".wav");
        
        if(! RegenFlag)
        {
            int Size = End - Start;
            Real* Data = RCall(RAlloc, Real)(Size);
            RCall(Wave, Read)(& SorcWave, Data, Start, Size);
            
            RCall(Wave, Resize)(& SegWave, Size);
            RCall(Wave, Write)(& SegWave, Data, 0, Size);
            if(! RCall(Wave, ToFile)(& SegWave, & SegName))
                fprintf(stderr, "Exporting '%s' failed. Skipped.\n",
                    String_GetChars(& SegName));
            RFree(Data);
        }
        
        if(RegenFlag)
        {
            CStrFloat(& LineBuf, (float)SegList[i] / SorcWave.SampleRate);
            String_Copy(& TempBuf, & LineBuf);
            String_JoinChars(& LineBuf, "\t");
            String_Join(& LineBuf, & TempBuf);
            String_JoinChars(& LineBuf, "\t");
            String_Join(& LineBuf, Name);
            File_WriteLine(& RegenFile, & LineBuf);
        }
    }
    if(i <= RecList_Index)
        fprintf(stderr, "Warning: redundant records in word table starting from"
            " '%s'.\n", String_GetChars(& RecList[i]));
    
    if(RegenFlag)
        File_Flush(& RegenFile);
    File_Close(& RecFile);
    File_Close(& LabelFile);
    File_Close(& RegenFile);

    Array_ObjDtor(String, RecList);
    Array_Dtor(String, RecList);
    Array_Dtor(int, SegList);
    RDelete(& WavePath, & LabelPath, & RecPath, & RegenPath, & SegName,
        & LineBuf, & TempBuf);
    RDelete(& SorcWave, & LabelFile, & RecFile, & SegWave, & RegenFile);
    return 0;
}