Audio Volume Check¶
This task helps ensure participants are wearing headphones correctly and have their audio volume set appropriately. It uses the Huggins Pitch paradigm—a dichotic pitch phenomenon that can only be perceived through binaural (headphone) listening.
The task has two phases:
- Volume Adjustment: Participants adjust their volume to just barely hear a pulsing noise
- Headphone Validation: Participants complete a three-alternative forced-choice task, identifying which of three noise intervals contains a hidden Huggins Pitch tone
Sample Stimulus¶
Listen to an example of the noise stimulus used for volume adjustment:
Background¶
Huggins Pitch is a form of dichotic pitch created by presenting white noise to both ears through headphones, with a narrow frequency band phase-shifted between the left and right channels1. Because the pitch perception depends on binaural processing, it cannot be heard through loudspeakers or with only one ear—making it an effective method to validate headphone use.
This implementation is based on experiments 1 and 2 from Zhao et al.2.
Use Cases¶
- Pre-screening: Ensure participants are using headphones before audio-critical experiments
- Volume calibration: Standardize volume levels across participants by having them adjust to a hearing threshold
- Quality control: Filter out participants who may be using speakers or low-quality audio equipment
Parameters¶
Customize the task by changing these on the Parameters tab of the task.
Trial Settings¶
Number of trials-
How many Huggins Pitch trials to present in each attempt. Default: 6. Range: 1–20.
Number of correct trials to pass-
The minimum number of correct responses required to pass the headphone check. Set to 0 if Max Attempts is also 0 (volume adjustment only). Default: 6. Range: 0–10.
Max attempts-
How many times the participant can attempt the headphone check before failing. Set to 0 to skip the headphone check entirely and only do volume adjustment. Default: 2. Range: 0–10.
Instructions¶
All instruction fields support rich text formatting.
Adjust text-
Instructions shown on the first page alongside the noise sample for volume adjustment. Guides participants to set their volume to hearing threshold.
Practice text-
Instructions shown before the practice trial, explaining the three-alternative forced-choice task.
Trial text-
Brief instructions shown with each trial, reminding participants of the task.
Reattempt text-
Message shown when a participant fails an attempt but has remaining attempts available.
Failure text-
Message shown when a participant exhausts all attempts without passing. You should clarify whether they should continue or exit the experiment.
Data¶
For general information about the various structures and file formats that you can download for your data see Downloads.
As stimulus-wise "annotations" (table rows), with columns:
trial- numerical index of the trialtime_trial_start- timestamp when the audio was played (seconds since 1/1/1970)time_trial_response- timestamp when the participant responded (seconds since 1/1/1970)stim_id- meadows internal id of the Huggins Pitch stimulusstim_name- filename of the stimulus (format:HugginsPitch_Nwhere N indicates the correct answer position)label- the participant's response (1, 2, or 3)
Analysis¶
Calculating Pass Rate and Response Accuracy¶
The main outcomes of interest are whether participants passed the headphone check and their accuracy on individual trials.
In Google Sheets or Microsoft Excel:
- Import data: Open the
Meadows_myExperiment_v1_annotations.csvfile - Extract correct answer: Add a column
correct_answerwith formula: (assumingstim_nameis in column B, extracts the digit from "HugginsPitch_N") - Check if correct: Add a column
is_correctwith formula: (assuminglabelis in column C andcorrect_answeris in column F) - Count correct per participant: Use a pivot table or
COUNTIFS: - Determine pass/fail: Compare the count to your pass mark (e.g., 6):
import pandas as pd
# Load the annotations data
df = pd.read_csv('Meadows_myExperiment_v1_annotations.csv')
# Extract correct answer from stimulus name (e.g., "HugginsPitch_2" → 2)
df['correct_answer'] = df['stim_name'].str.extract(r'HugginsPitch_(\d)').astype(int)
df['is_correct'] = df['label'].astype(int) == df['correct_answer']
# Calculate accuracy per participant
accuracy = df.groupby('participation_id').agg(
n_trials=('is_correct', 'count'),
n_correct=('is_correct', 'sum'),
accuracy=('is_correct', 'mean')
).reset_index()
print(accuracy)
# Determine pass/fail (assuming pass_mark of 6 out of 6 trials)
pass_mark = 6
accuracy['passed'] = accuracy['n_correct'] >= pass_mark
print(f"\nPass rate: {accuracy['passed'].mean():.1%}")
library(tidyverse)
# Load the annotations data
df <- read_csv('Meadows_myExperiment_v1_annotations.csv')
# Extract correct answer from stimulus name
df <- df %>%
mutate(
correct_answer = as.integer(str_extract(stim_name, "(?<=HugginsPitch_)\\d")),
is_correct = as.integer(label) == correct_answer
)
# Calculate accuracy per participant
accuracy <- df %>%
group_by(participation_id) %>%
summarise(
n_trials = n(),
n_correct = sum(is_correct),
accuracy = mean(is_correct)
)
print(accuracy)
# Determine pass/fail (assuming pass_mark of 6 out of 6 trials)
pass_mark <- 6
accuracy <- accuracy %>%
mutate(passed = n_correct >= pass_mark)
cat(sprintf("\nPass rate: %.1f%%\n", mean(accuracy$passed) * 100))
References¶
-
Cramer, E. M., & Huggins, W. H. (1958). Creation of Pitch through Binaural Interaction. The Journal of the Acoustical Society of America, 30(5), 413–417. doi:10.1121/1.1909628 ↩
-
Zhao, S., Brown, C. A., Holt, L. L., & Dick, F. (2021). Robust and efficient online auditory psychophysics. bioRxiv. doi:10.1101/2021.07.17.452796 ↩