Random picking of sounds as variables
Hi there,
I am setting an experiment about sound comprehension. Here is the general loop of the experiment :
As you can see, there are 96 elements executed. The plan of the experiment is 2 * 6 * 8.
The elements are regrouped as follow : 2 main conditions 'a' and 'p', 6 conditions of silence by main conditions and 8 sentences by silent's condition.
I already have 12 files (silent conditions), each filled with 96 sentences. Now, what I want is to prepare 96 sentences in a inline script, so when I start the experiment with a subject, the program will pick randomly 96 sentences with this rule :
8 sentences * 12 silent conditions.
The general idea is to counterbalance the sentences between subjects. Unfortunately, I am not very familiar with python functions. So if people can help me to design the script it will be wonderful.
I hope this is clear,
Thanks,
Aurélien.
Comments
Hi Aurélien,
I don't fully understand what you're trying to do. It seems like the
loop
table is correct the way it is, right? Is it a matter of selecting the right sound file based on the experimental variables that you've specified in the table? I.e. do you want to map these variables onto a file name? Details would be helpful 😊Cheers!
Sebastiaan
Hi Sebastiaan,
Thank you very much for your answer. I advanced a little. I had one problem with this loop : I need to play sequentially [silent] with [condition] (for example, I need to play sequentially the [sentences] of [silent]=0 and [condition]=a, so 8 sentences).
I'll try to be as clear as I could. So, in the most simple way, what I need is to define a variable (a category of sound) and fill it with random sounds in the pool. Because all my files, in this example, are named like '20p(number).wav', here is what I thought I should do :
So, theoretically, I now have one condition '20p' with 8 values, each corresponds to a real .wav file (for example '20p1.wav').
What I need now, is two things :
1) implement all values of 20p in a loop, so the loop will run randomly the 8 values (20p1 ... 20p6... 20p24...)
2) play each 8 values in a sampler. I thought to do this in the script of the sampler :
but if I do this, it will try to find something like '20p[0 1 2 3 4 5].wav' and not '20p0.wav'.
Maybe, this is to much for one post !
Thank you again,
Cheers,
Aurélien.
Hi Aurélien,
Ok—it's still not entirely clear to me, but I do see at least one basic confusion: The variable
20p
is a list of multiple values. But then you're trying to use it as though it's a single value when you specify the sampler. And that's where things go wrong. Does that make sense?What I would do is first define a random list at the start of the experiment (or the start of the block if appropriate):
And then, at the start of the trial, you randomly 'pop' one element from that list and use it in the sampler.
Something along those lines should get you what you want, I believe.
Cheers,
Sebastiaan
Hi Sebastiaan,
Thank you for your advices, I solved the problem! I generated random value and assign them to my var :
I put the script in the bloc sequence so it generate new random numbers every iteration (at last, I think...) and i1 to i8 are the value of sentences. Than, i1 to i8 where assigned to the variable [value] in a loop.
So if the sample play [value] for i1 = 12, the sample will find and play the file 12.wav.
Next step will be to access sound files not in the pool but in the experiment folder because I have 96*12 files. I will post the final step (hope it could help someone even if it is a bit messy :) )
Cheers,
Aurélien.
Good to hear! 💪
Here I am with more info !
So, if you want to play sounds as variable and randomly picking them from a file, here is one way to do it (I picked some lines of the script in this forum so thanks to everybody ! )
import os
import random
#set path and list for conditions
folder = r'C:\Users\condition'
list = []
for file in os.listdir(folder): # 'file' can be replaced by any 'name'
if file.endswith('.wav'): #for other type of files
path = os.path.join(folder, file)
list.append(path)
So now, you have a list with path of .wav files.
Let say, you want to pick 8 random '.wav' from it to set a variable name sound:
sound = random.sample(list,8)
Now, you want to play them without repetition, place this in the beginning of the sequence :
play = sound.pop() #every time play is executed, the file executed will be removed from the list
var.play = play #set the variable 'play' for the sampler
Here you are.
I think it works !