Output Current Sound Track Name



  • Thanks so much @s_bach, this is really helpful!



  • @s_bach I'm not super savvy when it comes to programming. If I had 18 or so tracks, what would be the proper way to write this code so it loops through all of them?



  • Hello,

    the tracks of an object are stored in a list. You can access the first track using GetFirstCTrack(). Then you can loop over all tracks with an ordinary while() loop and GetNext().

    track = op.GetFirstCTrack()
    
    while track is not None:
    		
    		print(track.GetName())
    		
    		track = track.GetNext()
    

    See also the example in the C++ CTrack documentation.

    best wishes,
    Sebastian



  • @s_bach So something like this?

    track = op.GetFirstCTrack()
    
    while track is not None:
    
    start = track[c4d.CID_SOUND_START]
    
    # get length
    # length is stored as a string; need to convert it to int
    length = track[c4d.CID_SOUND_LENGTH]
    length = length[:-2]
    length = int(float(length))
    fps = doc.GetFps()
    end = start + c4d.BaseTime(length, fps)
    
    # check if the current frame is within the range of the sound clip
    
    curTime = doc.GetTime()
    
    if curTime >= start and curTime < end:
        print("Uses Track: " + track.GetName())
    else:
        print("no hit")
    

    I'm really struggling with wrapping my head around this :(



  • Well, you indentation is off. And you are missing

    track = track.GetNext()
    

    at the end.

    Besides that, this should work:

    
        track = op.GetFirstCTrack()
        
        while track is not None:
        
            print(track.GetName())
            
            start = track[c4d.CID_SOUND_START]
    
            # get length
            # length is stored as a string; need to convert it to int
            length = track[c4d.CID_SOUND_LENGTH]
            length = length[:-2]
            length = int(float(length))
            fps = doc.GetFps()
            end = start + c4d.BaseTime(length, fps)
            
            # check if the current frame is within the range of the sound clip
            
            curTime = doc.GetTime()
            
            if curTime >= start and curTime < end:
                print("Uses Track: " + track.GetName())
            else:
                print("no hit")
        
            track = track.GetNext()
    

    I strongly suggest to get familiar with the basics of Python first.

    best wishes,
    Sebastian



  • Thanks @s_bach, I really appreciate your help. I’m more of a motion designer, but wanted to tailor the scene I’m working on to make it easier.

    HTML/CSS come really easy to me, but my brain just comes to a halt when I try and get my head around python :/



  • Also, with this code, I am getting the spinning beachball of death :/
    It must be trapped in the loop maybe?



  • Hello,

    are you sure the indentation of your code is correct? Do you call

    track = track.GetNext()
    

    at the end of your loop?

    What is the context of your code? Are you calling it whining a script or a Python Tag? Please post the full code you are actually using.

    If a "while" loop is not suitable, you could also use GetCTracks() to get a list of all the tracks.

    tracks = op.GetCTracks()
    
    for track in tracks:
        print(track.GetName())
    

    best wishes,
    Sebastian



  • @s_bach Okay it's kind of working now, but is only outputting the last track in the list. I am using this script in a python tag:

    import c4d
    #Welcome to the world of Python
    
    def main():
    
        # find object in scene, store in obj
        obj = doc.SearchObject('VO')
    
    
        # store some variables
        track = obj.GetCTracks()
    
        obj[c4d.ID_USERDATA,4] = track[0].GetName()
        track[0][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,6]
        track[0][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,7]
        track[0][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,14]
    
        obj[c4d.ID_USERDATA,10] = track[1].GetName()
        track[1][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,11]
        track[1][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,12]
        track[1][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,9]
    
        obj[c4d.ID_USERDATA,15] = track[2].GetName()
        track[2][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,16]
        track[2][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,17]
        track[2][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,18]
    
        obj[c4d.ID_USERDATA,3] = track[3].GetName()
        track[3][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,20]
        track[3][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,21]
        track[3][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,22]
    
        obj[c4d.ID_USERDATA,24] = track[4].GetName()
        track[4][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,25]
        track[4][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,26]
        track[4][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,27]
    
        obj[c4d.ID_USERDATA,29] = track[5].GetName()
        track[5][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,30]
        track[5][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,31]
        track[5][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,32]
    
        obj[c4d.ID_USERDATA,34] = track[6].GetName()
        track[6][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,35]
        track[6][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,36]
        track[6][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,37]
    
        obj[c4d.ID_USERDATA,39] = track[7].GetName()
        track[7][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,40]
        track[7][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,41]
        track[7][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,42]
    
        obj[c4d.ID_USERDATA,44] = track[8].GetName()
        track[8][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,45]
        track[8][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,46]
        track[8][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,47]
    
        obj[c4d.ID_USERDATA,49] = track[9].GetName()
        track[9][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,50]
        track[9][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,51]
        track[9][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,52]
    
        obj[c4d.ID_USERDATA,54] = track[10].GetName()
        track[10][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,55]
        track[10][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,56]
        track[10][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,57]
    
        obj[c4d.ID_USERDATA,59] = track[11].GetName()
        track[11][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,60]
        track[11][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,61]
        track[11][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,62]
    
        obj[c4d.ID_USERDATA,64] = track[12].GetName()
        track[12][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,65]
        track[12][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,66]
        track[12][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,67]
    
        obj[c4d.ID_USERDATA,69] = track[13].GetName()
        track[13][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,70]
        track[13][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,71]
        track[13][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,72]
    
        obj[c4d.ID_USERDATA,74] = track[14].GetName()
        track[14][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,75]
        track[14][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,76]
        track[14][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,77]
    
        obj[c4d.ID_USERDATA,79] = track[15].GetName()
        track[15][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,80]
        track[15][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,81]
        track[15][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,82]
    
        obj[c4d.ID_USERDATA,84] = track[16].GetName()
        track[16][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,85]
        track[16][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,86]
        track[16][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,87]
    
        obj[c4d.ID_USERDATA,89] = track[17].GetName()
        track[17][c4d.CID_SOUND_ONOFF] = obj[c4d.ID_USERDATA,90]
        track[17][c4d.CID_SOUND_START] = obj[c4d.ID_USERDATA,91]
        track[17][c4d.CID_SOUND_NAME] = obj[c4d.ID_USERDATA,92]
    
    
    
        # outputs the current track name where playhead is
        traks = obj.GetCTracks()
    
        for trak in traks:
    
            start = trak[c4d.CID_SOUND_START]
    
            # get length
            # length is stored as a string; need to convert it to int
            length = trak[c4d.CID_SOUND_LENGTH]
            length = length[:-2]
            length = int(float(length))
            fps = doc.GetFps()
            end = start + c4d.BaseTime(length, fps)
    
            # check if the current frame is within the range of the sound clip
    
            curTime = doc.GetTime()
    
            if curTime >= start and curTime < end:
                obj[c4d.ID_USERDATA,19] = trak.GetName()
            else:
                obj[c4d.ID_USERDATA,19] = "No Track"
    
            trak = trak.GetNext()
    


  • Hello,

    it seems you just write the name of the last track into your user data field:

    obj[c4d.ID_USERDATA,19] = trak.GetName()
    

    Since you do not extend that string, it can only show one name.

    best wishes,
    Sebastian


Log in to reply