Timing-induced illusory percepts of pitch.
The 14 matches
- [1] § Experiment 1 › Methods › Materials ↔ E1/preparation/Tone_Generation (IP).ipynb, lines 40–67 · score 0.89 · sine waves, linear fade, linear rise, fundamental frequency, envelope, exponential
- [2] § Experiment 1 › Methods › Materials ↔ E2/preparation/Tone Generation (IP-AD).ipynb, lines 25–52 · score 0.89 · sine waves, linear fade, linear rise, fundamental frequency, envelope, exponential
- [3] § Experiment 1 › Results › Reaction time ↔ E1/analysis/Stats (IP).R, lines 111–191 · score 0.78 · bias opposing responses, bias conforming responses, bias neutral, reaction, interaction, pitch shift
- [4] § Experiment 1 › Results › Reaction time ↔ E1/analysis/Stats (IP).R, lines 111–191 · score 0.73 · bias conforming responses, bias neutral, bias opposing, confidence intervals, Reaction, Error
- [5] § Experiment 2 › Methods › Procedure ↔ E2/experiment_ip_adaptive.py, lines 182–206 · score 0.71 · interleaved staircase procedure, difficulty calibration, reversals, JND, shift
- [6] § Experiment 2 › Methods › Procedure ↔ E2/experiment_ip_adaptive.py, lines 131–143 · score 0.69 · fully randomized, shift direction, standard tone, preceded, blocks, probe tones
- [7] § Experiment 1 › Methods › Procedure ↔ E2/experiment_ip_adaptive.py, lines 131–143 · score 0.63 · shift direction, standard tones, Hz, preceded, repetition, randomized
- [8] § General discussion › Difficulty and perceptual sensitivity ↔ E2/analysis/Cue Integration.ipynb, lines 36–91 · score 0.60 · cue integration, spectral cue, temporal cues, Turquoise, pitch change, JND
- [9] § Experiment 1 › Results › Sensitivity & bias ↔ E2/analysis/Processing (IP-AD).ipynb, lines 52–147 · score 0.56 · alarm rates, hit rates, responded, pitch shift, octave, offset
- [10] § Experiment 1 › Results › Sensitivity & bias ↔ E1/analysis/Processing (IP).ipynb, lines 55–96 · score 0.53 · alarm rates, hit rates, responded, octave, offset
- [11] § Experiment 1 › Methods › Data analysis ↔ E2/analysis/Processing (IP-AD).ipynb, lines 52–147 · score 0.53 · alarm rates, hit rates, octave, scoring, offset, bias
- [12] § Experiment 1 › Results › Reaction time ↔ E1/analysis/Analysis (IP).ipynb, lines 221–257 · score 0.52 · Error bars, bias conforming, neutral, Reaction, opposing
- [13] § General discussion › Difficulty and perceptual sensitivity ↔ E2/analysis/Cue Integration.ipynb, lines 36–91 · score 0.51 · cue integration, turquoise, probability, pitch shift, spectral, JND
- [14] § Experiment 1 › Results › Reaction time ↔ E1/analysis/Analysis (IP).ipynb, lines 221–257 · score 0.51 · bias conforming, neutral, reaction, opposing, slower, pitch shift
Paper
Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
Python · 381 lines · 15 KB · CC-BY-4.0 · 3 matches
- import json
- import itertools
- import os
- import random
- import librosa as lba
- import numpy as np
- import soundfile as sf
- from psychopy import constants, core, data, event, gui, logging, prefs, sound, visual
- prefs.general['units'] = 'pix'
- prefs.general['fullscr'] = False
- prefs.general['allowGUI'] = True
- def generate_percussive_tone(freq, duration, rise_duration, perc_duration, fade_duration, sr=44100):
- rise_length = int(rise_duration * sr / 1000)
- perc_length = int(perc_duration * sr / 1000)
- fade_length = int(fade_duration * sr / 1000)
- # Generate fundamental frequency (co)sine wave
- tone = lba.tone(freq, sr=sr, duration=duration / 1000)
- # Add first three harmonics (up to 2 octaves above) with slope of -3 db/half amplitude per octave
- for i in range(3):
- phase = random.random() * 2 * np.pi
- tone += lba.tone(freq * (i + 2), sr=sr, duration=duration / 1000, phi=phase) / (i + 2)
- # Apply exponential fade to create percussive envelope
- tone[-perc_length:] *= np.geomspace(1, .01, perc_length)
- # Apply short linear fade to ending so that amplitude fades to 0
- tone[-fade_length:] *= np.linspace(1, 0, fade_length)
- # Apply sharp linear rise to start of tone
- tone[:rise_length] *= np.linspace(0, 1, rise_length)
- # Rescale waveform to range [-1, 1]
- tone /= np.abs(tone).max()
- return tone
- def generate_sequences(base_freq, tone_name, base_shift, difficulties, ioi, offsets,
- base_intervals=5, mod_intervals=1, sr=44100,
- tone_dir='stimuli/tones/', out_dir='stimuli/'):
- if not os.path.exists(out_dir):
- os.mkdir(out_dir)
- ntones = base_intervals + mod_intervals + 1
- # Load standard tone
- base_tone, _ = lba.load(tone_dir + 'tone%s.wav' % tone_name, sr=sr)
- # Calculate frequencies of probe tones based on JND
- tones = dict()
- for d in difficulties:
- tones['%s-%s' % (tone_name, d)] = base_freq / 2 ** (base_shift * d / 1200)
- tones['%s+%s' % (tone_name, d)] = base_freq * 2 ** (base_shift * d / 1200)
- for pitch in tones:
- freq = tones[pitch]
- tone = generate_percussive_tone(freq, duration=250, rise_duration=10, perc_duration=240, fade_duration=10)
- for offset in offsets:
- # Create array of appropriate length to hold audio sequence
- ms_ioi = offset / 1000 # Millisecond interval preceding probe tone
- sequence = np.zeros(int(np.ceil(ntones * max(ioi / 1000, ms_ioi) * sr)), dtype=np.float32)
- # Insert tones at appropriate locations
- for i in range(ntones):
- # First several tones are spaced by the base IOI
- if i <= base_intervals:
- start = i * ioi / 1000 * sr
- start = int(np.ceil(start))
- # Place a copy of the tone in the proper location
- base_tone_end = start + base_tone.shape[0]
- sequence[start:base_tone_end] = base_tone
- # Final tone(s) is/are preceded by the modified IOI
- else:
- start = sr * ((base_intervals * ioi / 1000) + ((i - base_intervals) * ms_ioi))
- start = int(np.ceil(start))
- # Add pitch-shifted tone after the standard tones
- tone_end = start + tone.shape[0]
- sequence[start:tone_end] = tone
- # Cut silence from the end of the sequence
- sequence = np.trim_zeros(sequence, 'b')
- # Save sequences to WAV file
- sf.write(out_dir + 'sequence_%s_%i.wav' % (pitch, offset), sequence, sr)
- # Log information about the tones generated
- tones['base_shift_cents'] = base_shift
- tones['difficulties'] = difficulties
- with open(out_dir + 'tone_log.json', 'w') as f:
- json.dump(tones, f)
- ###
- # INITIALIZATION
- ###
- # VERSION NUMBERS
- # 1.0 - Difficulty levels of JND vs. 3/2 * JND
- # 1.1 - Increased difficulty to 1/2 JND vs. JND
- # Set constants
- # Experiment settings
- experiment_name = 'IPAD' # Experiment name
- version_num = '1.1' # Experiment version number (see above)
- frame_rate = 60 # Set monitor frame rate
- # Staircase settings
- min_shift = 0 # Minimum pitch shift in cents during staircase
- start_shift_small = 1 # The initial pitch shift in cents to use on small-start staircases
- start_shift_large = 25 # The initial pitch shift in cents to use on large-start staircases
- max_shift = 100 # Maximum pitch shift in cents during staircase
- n_up = 1 # Number of incorrect responses required to get easier
- n_down = 2 # Number of correct responses required to get harder
- reversals_per_staircase = 8 # The total number of reversals each staircase should be run for
- reversals_to_use = 4 # The last N reversals will be averaged to estimate the JND; even numbers reduce estimation bias
- step_sizes = [8, 8, 4, 4, 2, 2, 1, 1] # The step sizes for the staircase; can change after each reversal
- # Main task settings
- pretrial_delay = 1.5 # Seconds of pause before each trial
- standard_freq = 440 # Frequency of the standard tone (in Hz)
- tone_name = 'A4' # Name of the standard tone
- standard_ioi = 500 # Standard inter-onset interval (in ms)
- shifts = ['+', '-'] # Pitch directions
- intervals = [425, 500, 575] # Length of the interval preceding the probe tone
- difficulties = [.5, 1] # Pitch between high and low probes (in multiples of the JND)
- repetitions_per_block = 5 # Repetitions of each condition within each block (fully randomized)
- blocks = 4 # Number of blocks to run
- n_practice_trials_per_shift = 2 # Number of practice trials per shift direction
- practice_interval = standard_ioi # Interval preceding probe on practice trials
- practice_difficulty = 4 # Difference between high and low probes on practice trials (in multiples of the JND)
- # Randomize trial order
- # Practice trials include 2 up and 2 down shifts at the expected onset time and easy difficulty
- # Main trials include 4 blocks with 5 repetitions of each condition (2 shifts x 3 intervals x 2 difficulties) per block
- conditions = [c for c in itertools.product(shifts, intervals, difficulties)]
- trials_per_block = len(conditions) * repetitions_per_block # Number of trials per block
- trial_order = []
- for i in range(n_practice_trials_per_shift):
- for shift in shifts:
- trial_order.append({'shift': shift, 'interval': practice_interval, 'difficulty': practice_difficulty, 'event': 'practice'})
- random.shuffle(trial_order) # Shuffle practice trials
- for block in range(blocks):
- block_trials = conditions * repetitions_per_block
- random.shuffle(block_trials)
- for trial in block_trials:
- trial_order.append({'shift': trial[0], 'interval': trial[1], 'difficulty': trial[2], 'event': 'trial'})
- # Set up session info and open dialogue box to enter participant ID
- info_dict = dict(subject='', experimenter='')
- dlg = gui.DlgFromDict(dictionary=info_dict, sortKeys=False, title=experiment_name)
- if not dlg.OK:
- core.quit()
- info_dict['experiment'] = experiment_name
- info_dict['version'] = version_num
- # Set logging
- log = logging.LogFile('logs/%s_%s.log' % (experiment_name, info_dict['subject']), level=logging.EXP)
- logging.console.setLevel(logging.EXP)
- # Set up experiment, window, and text object
- win = visual.Window([1920, 1080], screen=0, monitor=None, color=(-1, -1, -1), fullscr=True)
- text = visual.TextStim(win, '', font='Arial', color=(1, 1, 1), height=72)
- exp = data.ExperimentHandler(name=experiment_name, version=version_num,
- extraInfo=info_dict,
- dataFileName='data/%s_%s_bkp' % (experiment_name, info_dict['subject']),
- savePickle=False, saveWideText=True,
- autoLog=True, appendFiles=False)
- # Set up interleaved staircase procedure used for difficulty calibration
- stair_conditions = [
- # Staircase testing JND for pitch increases starting from large shift
- {
- 'label': 'l+', 'startVal': start_shift_large, 'nReversals': reversals_per_staircase, 'stepSizes': step_sizes,
- 'nUp': n_up, 'nDown': n_down, 'minVal': min_shift, 'maxVal': max_shift, 'stepType': 'lin', 'shift': '+'
- },
- # Staircase testing JND for pitch increases starting from small shift
- {
- 'label': 's+', 'startVal': start_shift_small, 'nReversals': reversals_per_staircase, 'stepSizes': step_sizes,
- 'nUp': n_up, 'nDown': n_down, 'minVal': min_shift, 'maxVal': max_shift, 'stepType': 'lin', 'shift': '+'
- },
- # Staircase testing JND for pitch decreases starting from large shift
- {
- 'label': 'l-', 'startVal': start_shift_large, 'nReversals': reversals_per_staircase, 'stepSizes': step_sizes,
- 'nUp': n_up, 'nDown': n_down, 'minVal': min_shift, 'maxVal': max_shift, 'stepType': 'lin', 'shift': '-'
- },
- # Staircase testing JND for pitch decreases starting from small shift
- {
- 'label': 's-', 'startVal': start_shift_small, 'nReversals': reversals_per_staircase, 'stepSizes': step_sizes,
- 'nUp': n_up, 'nDown': n_down, 'minVal': min_shift, 'maxVal': max_shift, 'stepType': 'lin', 'shift': '-'
- }
- ]
- adaptive_stairs = data.MultiStairHandler(stairType='simple', method='random', conditions=stair_conditions, nTrials=1)
- exp.addLoop(adaptive_stairs)
- # Set up main task
- trials = data.TrialHandler(trial_order, 1, method='sequential',
- dataTypes=['event', 'shift', 'interval', 'difficulty',
- 'response', 'rt', 'jnd', 'full_jnd', 'correct'])
- exp.addLoop(trials)
- ###
- # ADAPTIVE DIFFICULTY TEST
- ###
- # Set up for loudness calibration
- standard_tone = sound.Sound('stimuli/tones/tone%s.wav' % tone_name)
- text.setText('Which was higher?')
- text.draw()
- win.flip()
- event.waitKeys(keyList=['space'], clearEvents=True)
- for intensity, condition in adaptive_stairs:
- # Pre-trial delay; load tones and randomize order while waiting
- win.flip()
- pretime = core.StaticPeriod(screenHz=frame_rate, win=win)
- pretime.start(pretrial_delay)
- shift = condition['shift']
- if intensity == 0:
- probe_tone = sound.Sound('stimuli/tones/tone%s.wav' % tone_name)
- else:
- probe_tone = sound.Sound('stimuli/tones/tone%s%s%d.wav' % (tone_name, shift, intensity))
- pretime.complete()
- # Stimulus presentation
- standard_tone.play()
- core.wait(0.5)
- probe_tone.play()
- # Ask for participant response
- text.setText('Which was higher?')
- text.draw()
- win.flip()
- response = event.waitKeys(keyList=['1', '2'], clearEvents=True)
- # Score correctness, and automatically reverse direction if we reach 0 intensity
- if intensity == 0:
- correctness = False
- else:
- correctness = ('2' in response and shift == '+') or ('1' in response and shift == '-')
- adaptive_stairs.addResponse(correctness)
- exp.nextEntry()
- # Set the JND to the average across the final N reversals of all staircases
- text.setText('Thinking...')
- text.draw()
- win.flip()
- reversals = []
- for staircase in adaptive_stairs.staircases:
- reversals += staircase.reversalIntensities[-reversals_to_use:]
- JND = np.mean(reversals)
- # Generate tone sequences based on the individual's JND
- generate_sequences(standard_freq, tone_name, JND, difficulties + [practice_difficulty], standard_ioi, intervals,
- base_intervals=5, mod_intervals=1, sr=44100,
- tone_dir='stimuli/tones/', out_dir='stimuli/S%s/' % info_dict['subject'])
- ###
- # MAIN TASK
- ###
- text.setText('Up or Down?')
- text.draw()
- win.flip()
- event.waitKeys(keyList=['space'], clearEvents=True)
- win.flip()
- # Loop through trials
- trial_number = 1 # Start on trial 1
- block_number = 0 # Start on block 0 (practice section)
- for trial in trials:
- ###
- # PRETRIAL
- ###
- # Load stimulus sequence for this trial during the pretrial delay
- pretime = core.StaticPeriod(screenHz=frame_rate, win=win)
- pretime.start(pretrial_delay)
- shift = trial.shift
- interval = trial.interval
- difficulty = trial.difficulty
- stimulus = sound.Sound('stimuli/S%s/sequence_%s%s%s_%i.wav' % (info_dict['subject'], tone_name, shift, difficulty, interval))
- text.setText('+')
- text.draw()
- pretime.complete()
- # Display fixation cross and play the simulus sequence
- win.flip()
- stimulus.play()
- # Wait for the sequence to end
- text.setText('Was the final tone higher or lower in pitch?')
- text.draw()
- core.wait(3)
- while not stimulus.status == constants.FINISHED:
- core.wait(.01)
- # Prompt for the participant's response and map up/down to +/-
- win.flip()
- response_period_start = core.getAbsTime()
- response = event.waitKeys(keyList=['up', 'down'], clearEvents=True)
- rt = core.getAbsTime() - response_period_start
- if 'up' in response:
- response = '+'
- elif 'down' in response:
- response = '-'
- else:
- response = None
- win.flip()
- # Save data
- trials.addData('shift_size', JND * difficulty)
- trials.addData('response', response)
- trials.addData('rt', rt)
- trials.addData('jnd', JND)
- trials.addData('correct', int(shift == response))
- exp.nextEntry()
- ###
- # END OF PRACTICE
- ###
- # If this was the final trial of the practice block (0), end the practice
- if block_number == 0 and trial_number == n_practice_trials_per_shift * len(shifts):
- text.setText('You have completed the practice trials!')
- text.draw()
- win.flip()
- event.waitKeys(keyList=['space'], clearEvents=True)
- block_number += 1
- trial_number = 0
- ###
- # POST-BLOCK BREAK
- ###
- # If this was the final trial in a block, start a break
- elif trial_number == trials_per_block and block_number != blocks:
- text.setText('You have completed section %i of %i!\nWhen you are ready to continue, press SPACEBAR to begin the next section.' % (block_number, blocks))
- text.draw()
- win.flip()
- event.waitKeys(keyList=['space'], clearEvents=True)
- block_number += 1
- trial_number = 0
- # If this was the final trial in the last block we have time for, stop presenting trials
- elif trial_number == trials_per_block and block_number == blocks:
- break
- # Move to next trial number
- trial_number += 1
- ###
- # POST-EXPERIMENT
- ###
- # After completing all trials, display the ending message
- text.setText('You have completed section %i of %i!\nThank you for participating! Please let the researcher know you have finished.' % (block_number, blocks))
- text.draw()
- win.flip()
- # Data should save automatically, but manually save a backup copy just in case
- exp.saveAsWideText('data/%s_%s.csv' % (experiment_name, info_dict['subject']))
- # Press any key to close the window, then exit
- event.waitKeys(clearEvents=True)
- win.close()
- core.quit()
experiment_ip_adaptive.py at commit 4c6706b, under CC-BY-4.0 · at the source
Overview
- Department of Psychology, Neuroscience and Behaviour, McMaster University,Hamilton, ON Canada
- McMaster Institute for Music and the Mind, Hamilton, ON Canada
- Rotman Research Institute, Baycrest Hospital,Toronto, ON Canada
Abstract
It has long been proposed that the brain integrates pitch and timing cues during auditory perception. If true, the pitch of a sound should influence its perceived timing, and its timing should influence its perceived pitch. Previous research has found that higher-pitched sounds tend to be perceived as faster than lower-pitched sounds, and in the present study we investigated whether sounds that arrive earlier or later than expected are similarly perceived as higher or lower in pitch. In Experiment 1, participants heard isochronous, repeating standard tones followed by a pitch-shifted probe, and indicated if the pitch increased or decreased. We observed a strong biasing effect of the probe’s timing on its perceived pitch, such that later probes were more likely to be perceived as lower than the standard. Correct, bias-conforming responses to mistimed probes were also significantly faster than responses to on-beat probes. In Experiment 2, we used an adaptive difficulty procedure to investigate whether this timing-induced bias strengthens under conditions of low discriminability. We did not find evidence that bias varies with the magnitude of pitch change or with individual differences in pitch sensitivity. In conjunction with past findings of pitch-induced illusory timing changes, our results support the hypothesis that pitch and time are perceptually integrated. We discuss this integration within a Bayesian predictive coding framework, as possibly learned from real-world correlations between pitch and timing that derive from latent properties of sound sources.
Reproduced under the paper's license (CC BY), from the paper cited above.
Repositories
Its files are read in the Code ↔ Paper reader above, with 14 matches between paragraphs and lines of code.
OSF hrj3t
Availability: 1 check, the latest on 28 September 2026: the link answers (HTTP 200)
- 28 September 2026: the link answers (HTTP 200)
12 files
- E1/
analysis/ , Jupyter, 351 linesAnalysis (IP).ipynb - E1/
analysis/ , Jupyter, 150 linesProcessing (IP).ipynb - E1/
analysis/ , R, 191 linesStats (IP).R - E1/
experiment.js , JavaScript, 257 lines - E1/
preparation/ , Jupyter, 127 linesTone_Generation (IP).ipynb - E1/
preparation/ , Jupyter, 91 linesTrial_Randomization (IP).ipynb - E2/
analysis/ , Jupyter, 243 linesAnalysis (IP-AD).ipynb - E2/
analysis/ , Jupyter, 341 linesCue Integration.ipynb - E2/
analysis/ , R, 128 linesMixedEffectE2.R - E2/
analysis/ , Jupyter, 151 linesProcessing (IP-AD).ipynb - E2/
experiment_ip_adaptive.p , Python, 381 linesy - README.md, Text, 42 lines
jpazdera/IllusoryPitch
4c6706b4423ec62a722ec46ddb766f11a1143444, 20 May 2026Availability: 1 check, the latest on 28 September 2026: the link answers
- 28 September 2026: the link answers
17 files
- E1/
analysis/ , Jupyter, 351 lines, 2 matchesAnalysis (IP).ipynb - E1/
analysis/ , Jupyter, 150 lines, 1 matchProcessing (IP).ipynb - E1/
analysis/ , R, 191 lines, 2 matchesStats (IP).R - E1/
analysis/ , Jupyter, 488 linesreview/ bias_analysis_E1.ipynb - E1/
analysis/ , Jupyter, 497 linesreview/ sensitivity_analysis_E1. ipynb - E1/
experiment.js , JavaScript, 257 lines - E1/
preparation/ , Jupyter, 127 lines, 1 matchTone_Generation (IP).ipynb - E1/
preparation/ , Jupyter, 91 linesTrial_Randomization (IP).ipynb - E2/
analysis/ , Jupyter, 243 linesAnalysis (IP-AD).ipynb - E2/
analysis/ , Jupyter, 341 lines, 2 matchesCue Integration.ipynb - E2/
analysis/ , R, 128 linesMixedEffectE2.R - E2/
analysis/ , Jupyter, 151 lines, 2 matchesProcessing (IP-AD).ipynb - E2/
analysis/ , Jupyter, 604 linesreview/ bias_analysis_E2.ipynb - E2/
analysis/ , Jupyter, 614 linesreview/ sensitivity_analysis_E2. ipynb - E2/
experiment_ip_adaptive.p , Python, 381 lines, 3 matchesy - E2/
preparation/ , Jupyter, 52 lines, 1 matchTone Generation (IP-AD).ipynb - README.md, Text, 42 lines
The paper's code and data availability statement is in the Data section.
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 2 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 27 scripts, each with its path and the digest of its content;
- 14 matches between paragraphs of the paper and lines of the code (method lexical-v1);
- neither the text of the paper nor the code itself.
Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.
Data
No dataset and no data link were found in the paper.
Data availability
We have made all data, code, and stimuli from both experiments publicly available on the Open Science Framework at https://
Reproduced under the paper's license (CC BY), from the paper cited above.
Versions
The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.
Version 2, 28 September 2026
- Funding: added Canadian Institute for Advanced Research; Canadian Institutes of Health Research: 153130, MOP153130; Natural Sciences and Engineering Research Council of Canada: rgpin-2019-05416, RGPIN-2019
Version 1, 28 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 3 authors, 7 keywords, 9 MeSH terms, 74 references.
Cite
This paper
Pazdera, J. K., Rinaldi, O. M., & Trainor, L. J. (2026). Timing-induced illusory percepts of pitch. Scientific reports, 16(1), 23288. https://
BibTeX
@article{pazdera2026timi
author = {Pazdera, Jesse K. and Rinaldi, Olive M. and Trainor, Laurel J.},
title = {{Timing-induced illusory percepts of pitch}},
journal = {Scientific reports},
year = {2026},
month = may,
volume = {16},
number = {1},
pages = {23288},
publisher = {Nature Publishing Group},
issn = {2045-2322},
doi = {10.1038/
url = {https://
pmid = {42168510},
pmcid = {PMC13402612}
}
RIS
TY - JOUR
AU - Pazdera, Jesse K.
AU - Rinaldi, Olive M.
AU - Trainor, Laurel J.
TI - Timing-induced illusory percepts of pitch
T2 - Scientific reports
J2 - Sci Rep
PY - 2026
DA - 2026/
VL - 16
IS - 1
SP - 23288
SN - 2045-2322
PB - Nature Publishing Group
DO - 10.1038/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1038/
"type": "article-journal",
"title": "Timing-induced illusory percepts of pitch",
"container-title": "Scientific reports",
"author": [
{
"family": "Pazdera",
"given": "Jesse K."
},
{
"family": "Rinaldi",
"given": "Olive M."
},
{
"family": "Trainor",
"given": "Laurel J."
}
],
"container-title-short":
"volume": "16",
"issue": "1",
"page": "23288",
"DOI": "10.1038/
"PMID": "42168510",
"PMCID": "PMC13402612",
"ISSN": "2045-2322",
"publisher": "Nature Publishing Group",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
5,
21
]
]
}
}
The tracing map gets a citation of its own once an author has validated it and it has a DOI.
Similar papers
The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.
- [1] doi:10.1038/s41598-026-41129-7 [code]
- Non-linear relationships between auditory mismatch responses and the inharmonicity of complex sounds.Journal: Scientific reportsIn common: PsychoPy, lmerTest, lme4, 6 other tools, cognitive, 3 references
- [2] doi:10.34133/csbj.0042 [code]
- Using Steady-State Visual Evoked Potentials to Characterize Wide-Ranging Retinopathy Linked to &
lt;i& gt;CRB1& lt;/ i& gt;: Implications for Clinical Trials. Journal: Computational and structural biotechnology journalIn common: PsychoPy, car, lmerTest, 7 other tools, 1 reference - [3] doi:10.7554/elife.107088 [code]
- Development of auditory and spontaneous movement responses to music over the first postnatal year.Journal: eLifeIn common: car, lme4, seaborn, 5 other tools, 3 references
- [4] doi:10.1038/s41467-026-73865-9 [code]
- Histamine shapes the neurocomputational dynamics of human learning.Journal: Nature communicationsIn common: PsychoPy, car, lmerTest, 7 other tools, cognitive
- [5] doi:10.1167/jov.26.8.4 [code]
- The neural processes of illusory occlusion in object recognition.Journal: Journal of visionIn common: PsychoPy, seaborn, tidyverse, 4 other tools, cognitive, 2 references
- [6] doi:10.1162/imag.a.105 [code]
- Right posterior theta reflects human parahippocampal phase resetting by salient cues during goal-directed navigationJournal: n/aIn common: car, lmerTest, lme4, 6 other tools, cognitive
- [7] doi:10.1523/eneuro.0076-26.2026 [code]
- Exogenously Driven Neural Reactivation of Spatially Matching Visual Working-Memory Contents.Journal: eNeuroIn common: PsychoPy, car, lme4, 5 other tools, cognitive
- [8] doi:10.1162/imag.a.1321 [code]
- Phase similarity between similar objects indicates representational merging across retrieval training but not sleep.Journal: Imaging neuroscience (Cambridge, Mass.)In common: car, lmerTest, lme4, 6 other tools, cognitive
- [9] doi:10.1038/s41467-026-74743-0 [code]
- Meta-analytic evidence for distinct neural correlates of conditioned versus verbally induced placebo analgesia.Journal: Nature communicationsIn common: lmerTest, lme4, seaborn, 4 other tools, 2 references
- [10] doi:10.1073/pnas.2603114123 [code]
- The human hippocampus can pattern separate memories by meaning.Journal: Proceedings of the National Academy of Sciences of the United States of AmericaIn common: PsychoPy, lmerTest, lme4, 5 other tools, cognitive
Contribute
The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.
Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 2 repositories of the authors' code, each at its verified commit and with its license, 27 scripts, and 14 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:530f940454233d03…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
Request its removal
To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).
Discussion, reproductions, activity
Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.
Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
