Example #1
0
def generate(parser):
    args = parser.parse_args()

    model, config, model_name = load_model_checkp(**vars(args))
    latentDim = model.config.categoryVectorDim_G

    # We load a dummy data loader for post-processing
    postprocess = AudioPreprocessor(**config['transformConfig']).get_postprocessor()

    # Create output evaluation dir
    output_dir = mkdir_in_path(args.dir, f"generation_tests")
    output_dir = mkdir_in_path(output_dir, model_name)
    output_dir = mkdir_in_path(output_dir, "interpolation")
    output_dir = mkdir_in_path(output_dir, datetime.now().strftime('%Y-%m-%d %H:%M'))
    
    # Create evaluation manager
    eval_manager = StyleGEvaluationManager(model, n_gen=100)

    gen_batch = eval_manager.test_single_pitch_latent_interpolation()
    output_path = mkdir_in_path(output_dir, f"one_z_pitch_sweep")
    audio_out = map(postprocess, gen_batch)
    saveAudioBatch(audio_out,
                   path=output_path,
                   basename='test_pitch_sweep', 
                   sr=config["transformConfig"]["sample_rate"])
    print("FINISHED!\n")
Example #2
0
def generate(parser):
    args = parser.parse_args()

    model, config, model_name = load_model_checkp(**vars(args))
    latentDim = model.config.categoryVectorDim_G

    # check if conditioning attribute is present
    if 'attribute_list' in config['loaderConfig'].keys():
        condition_parameter = config['loaderConfig']['attribute_list'][0]
    else:
        print("There is no conditioning parameter ('attribute_list' is empty). Exiting!")
        exit(0)
    # We load a dummy data loader for post-processing
    postprocess = AudioPreprocessor(**config['transformConfig']).get_postprocessor()

    # Create output evaluation dir
    output_dir = mkdir_in_path(args.dir, f"generation_tests")
    output_dir = mkdir_in_path(output_dir, model_name)
    output_dir = mkdir_in_path(output_dir, "randz_constc")
    output_dir = mkdir_in_path(output_dir, datetime.now().strftime('%Y-%m-%d %H:%M'))
    
    # Create evaluation manager
    p_val = 0.1111111111111111 #75
    eval_manager = StyleGEvaluationManager(model, n_gen=20)
    gen_batch, latents = eval_manager.test_single_pitch_random_z(condition_parameter,p_val)
    output_path = mkdir_in_path(output_dir, f"one_z_pitch_sweep_"+str(p_val))
    audio_out = map(postprocess, gen_batch)

    saveAudioBatch(audio_out,
                   path=output_path,
                   basename='test_pitch_sweep', 
                   sr=config["transformConfig"]["sample_rate"],
                   latents=latents)
    print("FINISHED!\n")
Example #3
0
def generate(parser):
    args = parser.parse_args()
    device = get_device()

    model, config, model_name = load_model_checkp(**vars(args))
    latentDim = model.config.noiseVectorDim
    transform_config = config['transform_config']
    loader_config = config['loader_config']
    # We load a dummy data loader for post-processing
    processor = AudioProcessor(**transform_config)

    dbname = loader_config['dbname']
    loader_config["criteria"]["size"] = 1000
    loader = get_data_loader(dbname)(
        name=dbname + '_' + transform_config['transform'],
        preprocessing=processor, **loader_config)


    label = torch.Tensor(random.sample(loader.metadata, k=1))

    labels, _ = model.buildNoiseData(1, inputLabels=label, skipAtts=True)
    z = labels.repeat(args.n_gen, 1)

    z_noise = radial_interpolation(latentDim, args.n_gen)

    z[:, :latentDim] = z_noise

    gnet = model.getOriginalG()
    gnet.eval()
    with torch.no_grad():
        out = gnet(z.to(device)).detach().cpu()

        audio_out = loader.postprocess(out)

    # Create output evaluation dir
    output_dir = mkdir_in_path(args.dir, f"generation_tests")
    output_dir = mkdir_in_path(output_dir, model_name)
    output_dir = mkdir_in_path(output_dir, "radial_interpolation")
    output_dir = mkdir_in_path(output_dir, datetime.now().strftime('%Y-%m-%d %H:%M'))

    saveAudioBatch(audio_out,
                   path=output_dir,
                   basename='test_radial_interpolation', 
                   sr=config["transform_config"]["sample_rate"])
    print("FINISHED!\n")
Example #4
0
def test(parser):
    parser.add_argument('--size', dest='size', default=1000, type=int)
    parser.add_argument('--gen', dest='gen', action='store_true')
    args = parser.parse_args()
    kargs = vars(args)
    device = get_device()
    model, config, model_name = load_model_checkp(**kargs)

    transform_config = config['transform_config']
    loader_config = config['loader_config']

    d_net = model.getOriginalD().to(device)
    g_net = model.netG.to(device).eval()
    d_net.eval()
    # We load a dummy data loader for post-processing
    processor = AudioProcessor(**transform_config)

    dbname = loader_config['dbname']

    loader_config["criteria"]["size"] = args.size
    loader = get_data_loader(dbname)(name=dbname + '_' +
                                     transform_config['transform'],
                                     preprocessing=processor,
                                     **loader_config)

    att_dict = loader.header['attributes']
    criterion = ACGANCriterion(att_dict)

    # Create output evaluation dir
    output_dir = mkdir_in_path(args.dir, f"tests_D")
    output_dir = mkdir_in_path(output_dir, model_name)
    output_dir = mkdir_in_path(output_dir,
                               datetime.now().strftime('%Y-%m-%d %H:%M'))

    batch_size = min(args.batch_size, len(loader))
    data_loader = DataLoader(loader,
                             batch_size=batch_size,
                             shuffle=True,
                             num_workers=2)

    data_iter = iter(data_loader)
    iter_bar = trange(len(data_iter), desc='epoch-loop')

    D_loss = []
    data = []
    for j in iter_bar:
        with torch.no_grad():
            input, target = data_iter.next()
            if args.gen:
                z, _ = model.buildNoiseData(target.size(0),
                                            inputLabels=target,
                                            skipAtts=True)
                input = g_net(z)

            pred = d_net(input.float().to(device)).cpu()
            clf_loss = criterion.getCriterion(pred, target.cpu())
            # get D loss
            D_loss.append(pred[:, -1])
            data.append(input.cpu())
            state_msg = f'Iter: {j}; avg D_nloss: {sum(pred[:, -1])/len(pred[:, -1]):0.3f}, classif_loss: {clf_loss:0.3f}'
            iter_bar.set_description(state_msg)
    # Create evaluation manager
    D_loss = torch.cat(D_loss)
    data = torch.cat(data)
    D_loss, idx = abs(D_loss).sort()

    audio_out = loader.postprocess(data[idx[:20]])
    saveAudioBatch(audio_out,
                   path=output_dir,
                   basename='low_W-distance',
                   sr=config["transform_config"]["sample_rate"])
    audio_out = loader.postprocess(data[idx[-20:]])
    saveAudioBatch(audio_out,
                   path=output_dir,
                   basename='high_W-distance',
                   sr=config["transform_config"]["sample_rate"])
    print("FINISHED!\n")
Example #5
0
def generate(parser):
    args = parser.parse_args()

    argsObj = vars(args)
    print(f"generate args: {argsObj}")

    model, config, model_name = load_model_checkp(**vars(args))
    latentDim = model.config.categoryVectorDim_G

    # We load a dummy data loader for post-processing
    postprocess = AudioPreprocessor(
        **config['transformConfig']).get_postprocessor()
    #### I WANT TO ADD NORMALIZATION HERE  ######################
    print(f"postprocess: {postprocess}")

    # Create output evaluation dir
    output_dir = mkdir_in_path(args.dir, f"generation_tests")
    output_dir = mkdir_in_path(output_dir, model_name)
    output_dir = mkdir_in_path(output_dir, "2D_spectset")
    output_dir = mkdir_in_path(output_dir,
                               datetime.now().strftime('%Y-%m-%d_%H.%M'))

    gen_batch, latents = torch.load(argsObj["gen_batch"])

    interp_steps0 = int(argsObj["d0"])
    interp_steps0norm = interp_steps0 - 1  # because the batch generater will spread the steps out to include both endpoints

    interp_steps1 = int(argsObj["d1"])
    interp_steps1norm = interp_steps1 - 1  # because the batch generater will spread the steps out to include both endpoints

    usePM = argsObj["pm"]

    g = list(gen_batch)

    assert interp_steps0 * interp_steps1 == len(
        g
    ), f"product of d0, d1 interpolation steps({interp_steps0},{interp_steps1}) != batch length ({len(g)})"

    audio_out = map(postprocess, gen_batch)

    if not usePM:  #then just output as usual, including option to write latents if provided
        saveAudioBatch(audio_out,
                       path=output_dir,
                       basename='test_2D4pt',
                       sr=config["transformConfig"]["sample_rate"],
                       latents=latents)

    else:  # save paramManager files, (and don't write latents separately)
        data = list(audio_out)  #LW it was a map, make it a list
        zdata = zip(
            data,
            latents)  #zip so we can enumerate through pairs of data/latents

        vstep = -1  # gets incremented in loop

        #d1nvar=argsObj["d1nvar"]
        d1nvar = 1  # no variations for this spectset generation

        rowlength = interp_steps0 * d1nvar
        print(f'rowlength is {rowlength}')

        for k, (audio, params) in enumerate(zdata):
            istep = int(
                k / rowlength
            )  #the outer counter, orthogonal to the two lines defining the submanifold

            j = k % rowlength
            jstep = int(j / d1nvar)
            vstep = (vstep + 1) % d1nvar

            #print(f'doing row {istep}, col {jstep}, and variation {vstep}')

            if type(audio) != np.ndarray:
                audio = np.array(audio, float)

            path = output_dir
            basename = 'test_spectset2snd'
            sr = config["transformConfig"]["sample_rate"]

            #foo=f'{basename}_{jstep}_{vstep}.wav'

            out_path = os.path.join(
                path, f'{basename}_d1.{istep}_d0.{jstep}_v.{vstep}.wav')
            # paramManager, create
            pm = paramManager.paramManager(
                out_path, output_dir
            )  ##-----------   paramManager  interface ------------------##
            #param_out_path = os.path.join(path, f'{basename}_{i}.params')
            pm.initParamFiles(overwrite=True)

            if not os.path.exists(out_path):
                #write_wav(out_path, audio.astype(float), sr)
                sf.write(out_path, audio.astype(float), sr)

                duration = len(audio.astype(float)) / float(sr)
                #print(f"duration is {duration}")
                if latents != None:
                    #pm.addParam(out_path, "dim1", [0.0,duration], [(p-minpitch)/pitchrange,(p-minpitch)/pitchrange], units="norm, midip in[58,70]", nvals=0, minval='null', maxval='null')
                    pm.addParam(
                        out_path,
                        "dim0", [0.0, duration],
                        [jstep / interp_steps0norm, jstep / interp_steps0norm],
                        units=f'norm, interp steps in[0,{interp_steps0}]',
                        nvals=interp_steps0,
                        minval='null',
                        maxval='null')
                    if interp_steps1norm > 0:  #else just doing 1D interpolation
                        pm.addParam(
                            out_path,
                            "dim1", [0.0, duration], [
                                istep / interp_steps1norm,
                                istep / interp_steps1norm
                            ],
                            units=f'norm, interp steps in[0,{interp_steps1}]',
                            nvals=interp_steps1,
                            minval='null',
                            maxval='null')

                    segments = 11  # to include a full segment for each value including endpoints
                    envTimes, envVals = makesteps(
                        np.linspace(0, duration, segments + 1, True),
                        np.linspace(
                            0, 1, segments,
                            True))  #need one extra time to flank each value
                    pm.addParam(out_path,
                                "envPt",
                                envTimes,
                                envVals,
                                units=f"norm, duration in[0,{duration}]",
                                nvals=0,
                                minval='null',
                                maxval='null')

                    # write paramfile
                    #torch.save(params, param_out_path)
                    #np.savetxt(txt_param_out_path, params.cpu().numpy())
            else:
                print(f"saveAudioBatch: File {out_path} exists. Skipping...")
                continue

    print(f"GRID data output path/pattern: {out_path}\n")
Example #6
0
def generate(parser):
    args = parser.parse_args()
    kwargs = vars(args)
    model, config, model_name = load_model_checkp(**kwargs)
    latentDim = model.config.categoryVectorDim_G
    overlap = kwargs.get('overlap', 0.77)
    batch_size = kwargs.get('batch_size', 50)

    # We load a dummy data loader for post-processing
    model_postpro = AudioPreprocessor(**config['transformConfig']).get_postprocessor()

    # Create output evaluation dir
    output_dir = mkdir_in_path(args.dir, f"generation_tests")
    output_dir = mkdir_in_path(output_dir, model_name)
    output_dir = mkdir_in_path(output_dir, "from_midi")
    output_dir = mkdir_in_path(output_dir, datetime.now().strftime('%Y-%m-%d %H:%M'))
    
    
    overlap_index = int(config['transformConfig']['audio_length']*overlap)

    print("Loading MIDI file")
    
    midi_file = MidiFile(args.midi)
    midi_name = os.path.basename(args.midi).split('.')[0]
    pitch_list = []
    pitch_range = config['loaderConfig']['pitch_range']
    pitch_cls_list = list(range(pitch_range[0], pitch_range[1] + 1))
    
    for i, track in enumerate(midi_file.tracks):
        for msg in track:

            if msg.type == "note_on":

                if msg.note in pitch_cls_list:
                    pitch_list.append(
                        pitch_cls_list.index(msg.note))
                else:
                    if msg.note > max(pitch_cls_list):
                        if msg.note - 12 in pitch_cls_list:
                            pitch_list.append(
                                pitch_cls_list.index(msg.note - 12))
                    if msg.note < min(pitch_cls_list):
                        if msg.note + 12 in pitch_cls_list:
                            pitch_list.append(
                                pitch_cls_list.index(msg.note + 12))

    output_audio = np.array([])
    pbar = trange(int(np.ceil(len(pitch_list)/batch_size)), desc="fake data IS loop")
    input_z, _ = model.buildNoiseData(batch_size, None, skipAtts=True)
    
    z = input_z[:, :-len(pitch_cls_list)].clone()
    z = interpolate_batch(z[0], z[1], steps=batch_size)
    n_interp = z.size(0)
    alpha = 0
    k = 0
    
    for j in pbar:
        input_labels = torch.LongTensor(pitch_list[j*batch_size: batch_size*(j+1)])
        input_z, _ = model.buildNoiseData(len(input_labels), inputLabels=input_labels.reshape(-1, 1), skipAtts=True)
        z_target = input_z[0, :-len(pitch_cls_list)].clone()
        input_z[:, :-len(pitch_cls_list)] = z.clone()[:len(input_labels)]
        gen_batch = model.test(input_z, getAvG=True)
        gen_raw = map(model_postpro, gen_batch)
        gen_raw = map(lambda x: np.array(x).astype(float), gen_raw)
        z = interpolate_batch(z[-1], z_target, batch_size)
        for i, g in enumerate(gen_raw):
            if i==0 and j == 0:
                output_audio = g
            else:
                output_audio = np.concatenate([output_audio, np.zeros(len(g) - overlap_index)])
                output_audio[-len(g):] += g
    # output_audio /= max(output_audio)
    # output_audio[output_audio > 1] = 1
    output_audio /= max(output_audio)
    write_wav(f'{output_dir}/{midi_name}_{datetime.today().strftime("%Y_%m_%d_%H")}.wav', output_audio, 16000)
Example #7
0
def generate(parser):
    parser.add_argument("--val", dest="val", action='store_true')
    parser.add_argument("--train", dest="train", action='store_true')
    parser.add_argument("--avg-net", dest="avg_net", action='store_true')
    parser.add_argument("--name", dest="name", default="")
    parser.add_argument("--dump-labels",
                        dest="dump_labels",
                        action="store_true")
    args = parser.parse_args()

    model, config, model_name = load_model_checkp(**vars(args))
    latentDim = model.config.categoryVectorDim_G

    # We load a dummy data loader for post-processing
    transform_config = config['transform_config']
    loader_config = config['loader_config']
    processor = AudioProcessor(**transform_config)
    postprocess = processor.get_postprocessor()

    # Create output evaluation dir
    if args.val:
        name = args.name + '_val_labels'
    elif args.train:
        name = args.name + '_train_labels'
    else:
        name = args.name + '_rand_labels'
    if args.outdir == "":
        args.outdir = args.dir
    output_dir = mkdir_in_path(args.outdir, f"generation_samples")
    output_dir = mkdir_in_path(output_dir, model_name)
    output_dir = mkdir_in_path(output_dir, "random")
    output_dir = mkdir_in_path(
        output_dir, name + '_' + datetime.now().strftime('%Y-%m-%d_%H_%M'))

    dbname = loader_config['dbname']
    loader = get_data_loader(dbname)(name=dbname + '_' +
                                     transform_config['transform'],
                                     preprocessing=processor,
                                     **loader_config)

    labels = None
    if model.config.ac_gan:
        if args.val:
            val_set = loader.get_validation_set()[1]
            perm = torch.randperm(val_set.size(0))
            idx = perm[:args.n_gen]
            labels = val_set[idx]
        elif args.train:
            labels = torch.Tensor(random.sample(loader.metadata, k=args.n_gen))
        else:
            labels = loader.get_random_labels(args.n_gen)

    z, _ = model.buildNoiseData(args.n_gen, inputLabels=labels, skipAtts=True)
    data_batch = []
    with torch.no_grad():
        for i in range(int(np.ceil(args.n_gen / args.batch_size))):
            data_batch.append(
                model.test(z[i * args.batch_size:args.batch_size * (i + 1)],
                           toCPU=True,
                           getAvG=args.avg_net).cpu())
        data_batch = torch.cat(data_batch, dim=0)
        audio_out = map(postprocess, data_batch)

    saveAudioBatch(audio_out,
                   path=output_dir,
                   basename='sample',
                   sr=config["transform_config"]["sample_rate"])
    if args.dump_labels:
        with open(f"{output_dir}/params_in.txt", "a") as f:
            for i in tqdm(range(args.n_gen), desc='Creating Samples'):
                params = labels[i, :-1].tolist()
                f.writelines([f"{i}, {list(params)}\n"])

    print("FINISHED!\n")
Example #8
0
def generate(parser):
    args = parser.parse_args()

    argsObj=vars(args)
    print(f"generate args: {argsObj}")

    model, config, model_name = load_model_checkp(**vars(args))
    latentDim = model.config.categoryVectorDim_G

    # We load a dummy data loader for post-processing
    postprocess = AudioPreprocessor(**config['transformConfig']).get_postprocessor()
    #### I WANT TO ADD NORMALIZATION HERE  ######################
    print(f"postprocess: {postprocess}")

    # Create output evaluation dir
    output_dir = mkdir_in_path(args.dir, f"generation_tests")
    output_dir = mkdir_in_path(output_dir, model_name)
    output_dir = mkdir_in_path(output_dir, "2D")
    output_dir = mkdir_in_path(output_dir, datetime.now().strftime('%Y-%m-%d %H:%M'))




    
    # Create evaluation manager
    eval_manager = StyleGEvaluationManager(model, n_gen=2)

    z0=torch.load(argsObj["z0"])
    z1=torch.load(argsObj["z1"])

    minpitch=int(argsObj["p0"])
    maxpitch=int(argsObj["p1"])
    pitchrange=maxpitch-minpitch
    if pitchrange < 1 : 
        pitchrange=1

    interp_steps1=int(argsObj["d1"])
    interp_steps1norm=interp_steps1 -1 # because the batch generater will spread the steps out to include both endpoints

    usePM=argsObj["pm"]
    print(f"interp_steps1 is {interp_steps1}, and usePM (use ParamManager) is {usePM}")

    for p in range(minpitch, maxpitch+1) :

        #######   ---- with conditioned pitch
        # linear
        #gen_batch, latents = eval_manager.test_single_pitch_latent_interpolation(p_val=p, z0=z0, z1=z1, steps=10)
        #sperical
        #gen_batch, latents = eval_manager.qslerp(pitch=p, z0=z0, z1=z1, steps=10)
        #staggred
        gen_batch, latents = eval_manager.test_single_pitch_latent_staggered_interpolation(p_val=p, z0=z0, z1=z1, steps=interp_steps1, d1nvar=argsObj["d1nvar"], d1var=argsObj["d1var"])




        audio_out = map(postprocess, gen_batch)

        if not usePM :  #then just output as usual, including option to write latents if provided
            saveAudioBatch(audio_out,
                           path=output_dir,
                           basename='test_pitch_sweep'+ "_"+str(p), 
                           sr=config["transformConfig"]["sample_rate"],
                           latents=latents)

        else:                       # save paramManager files, (and don't write latents separately)
            data=list(audio_out) #LW it was a map, make it a list
            zdata=zip(data,latents) #zip so we can enumerate through pairs of data/latents

            istep=0
            vstep=0

            for i, (audio, params) in enumerate(zdata) :

                istep=int(i/argsObj["d1nvar"])
                vstep=(vstep+1)%argsObj["d1nvar"]

                if type(audio) != np.ndarray:
                    audio = np.array(audio, float)

                path=output_dir
                basename='test_pitch_sweep'+ "_"+str(p) 
                sr=config["transformConfig"]["sample_rate"]

                #foo=f'{basename}_{istep}_{vstep}.wav'

                out_path = os.path.join(path, f'{basename}_{istep}_{vstep}.wav')
                # paramManager, create 
                pm=paramManager.paramManager(out_path, output_dir)  ##-----------   paramManager  interface ------------------##
                #param_out_path = os.path.join(path, f'{basename}_{i}.params')
                pm.initParamFiles(overwrite=True)


                if not os.path.exists(out_path):
                    #write_wav(out_path, audio.astype(float), sr)
                    sf.write(out_path, audio.astype(float), sr)

                    duration=len(audio.astype(float))/float(sr)
                    #print(f"duration is {duration}")
                    if latents != None :
                        pm.addParam(out_path, "pitch", [0.0,duration], [(p-minpitch)/pitchrange,(p-minpitch)/pitchrange], units="norm, midip in[58,70]", nvals=0, minval='null', maxval='null')
                        pm.addParam(out_path, "instID", [0.0,duration], [istep/interp_steps1norm,istep/interp_steps1norm], units="norm, interp steps in[0,10]", nvals=10, minval='null', maxval='null')
                        #pm.addParam(out_path, "envPt", [0.0,duration], [0,1.0], units=f"norm, duration in[0,{duration}]", nvals=0, minval='null', maxval='null')
                    
                        segments=11 # to include a full segment for each value including endpoints
                        envTimes, envVals=makesteps(np.linspace(0,duration,segments+1,True) , np.linspace(0,1,segments,True)) #need one extra time to flank each value
                        pm.addParam(out_path, "envPt", envTimes, envVals, units=f"norm, duration in[0,{duration}]", nvals=0, minval='null', maxval='null')

                        # write paramfile 
                        #torch.save(params, param_out_path)
                        #np.savetxt(txt_param_out_path, params.cpu().numpy())
                else:
                    print(f"saveAudioBatch: File {out_path} exists. Skipping...")
                    continue





    print("FINISHED!\n")
Example #9
0
step = data["step"]
iterations = data["iterations"]
log_iterations = data["log_iterations"]
clampedges = data["clampedges"]
checkpointDir = data["checkpointDir"]
outpath = data["outpath"]
outptfile = data["outptfile"]
z0 = data["z0"]
z1 = data["z1"]
z2 = data["z2"]
z3 = data["z3"]

#-------------------------------------------------------------------------------------

# Load the model
model, config, model_name = load_model_checkp(checkpointDir)
eval_manager = StyleGEvaluationManager(model, n_gen=2)

# Create the SOM instance
p2 = som.kmap(ylength,
              xlength,
              z0.cpu(),
              z1.cpu(),
              z2.cpu(),
              z3.cpu(),
              vizdims=eval_manager.latent_noise_dim
              )  #( ylength (num rows), (xlength (num cols))
print(f'Mesh shape is: {p2.weights.shape}')

#-------------------------------------------------------------------------------------
Example #10
0
def generate(parser):
    args = parser.parse_args()

    argsObj=vars(args)
    print(f"generate args: {argsObj}")

    model, config, model_name = load_model_checkp(**vars(args))
    latentDim = model.config.categoryVectorDim_G

    # We load a dummy data loader for post-processing
    postprocess = AudioPreprocessor(**config['transformConfig']).get_postprocessor()
    #### I WANT TO ADD NORMALIZATION HERE  ######################
    print(f"postprocess: {postprocess}")

    # Create output evaluation dir
    output_dir = mkdir_in_path(args.dir, f"generation_tests")
    output_dir = mkdir_in_path(output_dir, model_name)
    output_dir = mkdir_in_path(output_dir, "2D")
    output_dir = mkdir_in_path(output_dir, datetime.now().strftime('%Y-%m-%d %H:%M'))


    # Create evaluation manager
    eval_manager = StyleGEvaluationManager(model, n_gen=2)

    z0=torch.load(argsObj["z0"])
    z1=torch.load(argsObj["z1"])
    if argsObj["z2"] == None :
        z2=0
    else :
        z2=torch.load(argsObj["z2"])
    if argsObj["z3"] == None : 
        z3 = 0
    else :
        z3=torch.load(argsObj["z3"])


    interp_steps0=int(argsObj["d0"])
    interp_steps0norm=interp_steps0 -1 # because the batch generater will spread the steps out to include both endpoints

    interp_steps1=int(argsObj["d1"])
    interp_steps1norm=interp_steps1 -1 # because the batch generater will spread the steps out to include both endpoints

    usePM=argsObj["pm"]
    print(f"interp_steps0 is {interp_steps0}, interp_steps1 is {interp_steps1}, and usePM (use ParamManager) is {usePM}")



    #######   ---- unconditioned 
    gen_batch, latents = eval_manager.unconditioned_linear_interpolation(line0z0=z0, line0z1=z1, line1z0=z2, line1z1=z3, d0steps=interp_steps0, d1steps=interp_steps1, d1nvar=argsObj["d1nvar"], d1var=argsObj["d1var"])

    g=list(gen_batch)
    #for k in length

    audio_out = map(postprocess, gen_batch)


        #save the .pt file no matter what since we may want to use them to zoom in, resample, or whatever.
    if not usePM :  
        saveAudioBatch(audio_out,
                   path=output_dir,
                   basename='test_2D4pt', 
                   sr=config["transformConfig"]["sample_rate"],
                   latents=latents)

    else :                      # save paramManager files, (and don't write latents separately)
        data=list(audio_out) #LW it was a map, make it a list
        zdata=zip(data,latents) #zip so we can enumerate through pairs of data/latents


        vstep=-1  # gets incremented in loop

        rowlength=interp_steps0*argsObj["d1nvar"]
        print(f'rowlength is {rowlength}')

        for k, (audio, params) in enumerate(zdata) :
            istep = int(k/rowlength)  #the outer counter, orthogonal to the two lines defining the submanifold

            j=k%rowlength
            jstep=int(j/argsObj["d1nvar"])
            vstep=(vstep+1)%argsObj["d1nvar"]

            print(f'doing row {istep}, col {jstep}, and variation {vstep}')

            if type(audio) != np.ndarray:
                audio = np.array(audio, float)

            path=output_dir
            basename='test_2D4pt' 
            sr=config["transformConfig"]["sample_rate"]

            #foo=f'{basename}_{jstep}_{vstep}.wav'

            out_path = os.path.join(path, f'{basename}_d1.{istep}_d0.{jstep}_v.{vstep}.wav')
            # paramManager, create 
            pm=paramManager.paramManager(out_path, output_dir)  ##-----------   paramManager  interface ------------------##
            #param_out_path = os.path.join(path, f'{basename}_{i}.params')
            pm.initParamFiles(overwrite=True)


            #also save pt files in case we want to use them to create other grids, scales, etc.
            pt_param_out_path = os.path.join(path, f'{basename}_d1.{istep}_d0.{jstep}_v.{vstep}.pt')
            torch.save(params, pt_param_out_path)

            if not os.path.exists(out_path):
                #write_wav(out_path, audio.astype(float), sr)
                sf.write(out_path, audio.astype(float), sr)

                duration=len(audio.astype(float))/float(sr)
                #print(f"duration is {duration}")
                if latents != None :
                    #pm.addParam(out_path, "dim1", [0.0,duration], [(p-minpitch)/pitchrange,(p-minpitch)/pitchrange], units="norm, midip in[58,70]", nvals=0, minval='null', maxval='null')
                    pm.addParam(out_path, "dim0", [0.0,duration], [jstep/interp_steps0norm,jstep/interp_steps0norm], units=f'norm, interp steps in[0,{interp_steps0}]', nvals=interp_steps0, minval='null', maxval='null')
                    if interp_steps1norm > 0 : #else just doing 1D interpolation
                        pm.addParam(out_path, "dim1", [0.0,duration], [istep/interp_steps1norm,istep/interp_steps1norm], units=f'norm, interp steps in[0,{interp_steps1}]', nvals=interp_steps1, minval='null', maxval='null')
                
                    segments=11 # to include a full segment for each value including endpoints
                    envTimes, envVals=makesteps(np.linspace(0,duration,segments+1,True) , np.linspace(0,1,segments,True)) #need one extra time to flank each value
                    pm.addParam(out_path, "envPt", envTimes, envVals, units=f"norm, duration in[0,{duration}]", nvals=0, minval='null', maxval='null')

                    # write paramfile 
                    #torch.save(params, param_out_path)
                    #np.savetxt(txt_param_out_path, params.cpu().numpy())
            else:
                print(f"saveAudioBatch: File {out_path} exists. Skipping...")
                continue