00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 package com.meapsoft;
00024
00025 import java.util.Vector;
00026
00036 public class SegmentExtractor implements FrameListener, Runnable, OnsetListener
00037 {
00038 Vector consumers = new Vector();
00039 STFT stft;
00040 OnsetDetector onsDetect;
00041 long lastOnset = -1;
00042 int minChunkLen = 20;
00043
00044
00045 int maxChunkLen = Integer.MAX_VALUE;
00046
00047
00048 boolean recording = false;
00049
00050 FeatFile outFile;
00051 String sourceFileName;
00052
00053 public SegmentExtractor(STFT stft, OnsetDetector od, String sfn, FeatFile of)
00054 {
00055 this.stft = stft;
00056 onsDetect = od;
00057 sourceFileName = sfn;
00058 outFile = of;
00059
00060
00061 }
00062
00063 public void run()
00064 {
00065 stft.start();
00066 }
00067
00071 public void newOnset(long nextOnset, int zeroFrames)
00072 {
00073 if(!recording)
00074 {
00075
00076 lastOnset = nextOnset;
00077 recording = true;
00078 }
00079 else if(nextOnset - lastOnset < minChunkLen)
00080 {
00081
00082 }
00083 else
00084 {
00085
00086 outFile.chunks.add(new FeatChunk(sourceFileName,
00087 stft.fr2Seconds(lastOnset),
00088 stft.fr2Seconds(nextOnset-lastOnset)));
00089 lastOnset = nextOnset;
00090 }
00091 }
00092
00097 public void newFrame(STFT ignored, long frAddr)
00098 {
00099 if(recording && frAddr - lastOnset > maxChunkLen)
00100 {
00101
00102 recording = false;
00103
00104 outFile.chunks.add(new FeatChunk(sourceFileName,
00105 stft.fr2Seconds(lastOnset),
00106 stft.fr2Seconds(maxChunkLen)));
00107 }
00108 }
00109 }