Skip to content

[v1.5.x] Add sound()#348

Draft
mcencini wants to merge 6 commits intoimr-framework:masterfrom
mcencini:sound
Draft

[v1.5.x] Add sound()#348
mcencini wants to merge 6 commits intoimr-framework:masterfrom
mcencini:sound

Conversation

@mcencini
Copy link
Collaborator

@mcencini mcencini commented Jan 22, 2026

This PR adds pypulseq.Sequence.sound() method. It relies on an additional optional dependency (sounddevice). Compared to upstream MATLAB counterpart, it accepts time_range instead of block_range argument, consistenly with other PyPulseq methods like plot() or waveforms_and_times().

Help Wanted: since I am developing on WSL2, audio forwarding to Windows host is not available and I could not test it actually plays the waveform as intended. I modified write_gre() script so it optionally plays the sound as well - it would be great if someone wanted to give it a try.

This PR does not rely on v1.5.1 specific features and is compatible with 1.5.0.

@mcencini mcencini marked this pull request as draft January 22, 2026 13:04
@mcencini mcencini mentioned this pull request Jan 22, 2026
8 tasks
@github-actions
Copy link

github-actions bot commented Jan 22, 2026

Coverage

Coverage Report
FileStmtsMissCoverMissing
/home/runner/.local/lib/python3.12/site-packages/pypulseq
   add_gradients.py1376056%44, 52, 58, 61, 75–86, 92, 125–128, 135–136, 155, 162, 167–263
   add_ramps.py36360%1–92
   align.py35489%41, 45, 69, 73
   calc_duration.py25196%37
   calc_ramp.py2202162%48–359
   calc_rf_bandwidth.py372824%45–81, 85–89
   check_timing.py962970%78, 82, 107, 180, 199, 232, 239, 249–293
   compress_shape.py30197%28
   convert.py40880%42, 48, 66, 72–73, 82, 88–89
   event_lib.py961485%6–9, 48–51, 70–71, 205–210
   make_adc.py981486%77, 80, 90–94, 97, 146, 149, 153, 159, 163, 202, 204, 206, 214
   make_adiabatic_pulse.py1323970%204–208, 228–232, 240–241, 264, 270, 339–358, 462–471, 509–517
   make_arbitrary_grad.py531572%71, 74, 77, 80, 96–98, 107, 109, 117–121, 130
   make_arbitrary_rf.py756316%95–179
   make_block_pulse.py48394%121–125, 128
   make_delay.py9189%27
   make_digital_output_pulse.py16288%42, 50
   make_extended_trapezoid.py561279%67, 70, 76, 82, 85, 88, 91, 94, 116, 134, 136, 139
   make_extended_trapezoid_area.py93397%52, 227, 230
   make_gauss_pulse.py732073%139–143, 146–170, 177, 180
   make_label.py22482%64, 66, 68, 75
   make_sigpy_pulse.py1193075%12–13, 121, 124, 128, 165–169, 173, 176–177, 180–181, 196, 203, 208, 220, 223, 248–258, 272, 275, 305–315
   make_sinc_pulse.py701086%102, 108, 136–140, 144, 147–148, 151–152, 174
   make_soft_delay.py26292%107, 125
   make_trapezoid.py111794%177, 190, 196, 214, 232, 237, 255
   make_trigger.py16288%47, 55
   opts.py66986%78, 83, 102, 142, 166–170
   points_to_waveform.py9189%27
   rotate.py691480%15, 55, 66–69, 85–90, 112, 119–120
   scale_grad.py30197%65
   sigpy_pulse_opts.py26773%34–41
   split_gradient.py393121%46–103
   split_gradient_at.py702761%63–90, 110, 114, 118–120, 154–156
   traj_to_grad.py13931%26–40
/home/runner/.local/lib/python3.12/site-packages/pypulseq/SAR
   SAR_calc.py5180%9
/home/runner/.local/lib/python3.12/site-packages/pypulseq/Sequence
   block.py4697983%63, 66, 74, 80, 95, 103, 109, 120, 123, 126, 134, 139, 148, 159, 167, 207, 209, 213, 225, 274, 278, 294, 319–345, 382–385, 421–429, 436, 466–470, 512, 518, 551, 587–594, 611, 621, 647, 685, 703, 706, 724, 738, 765, 844, 881, 905
   calc_grad_spectrum.py81766%68–190
   calc_pns.py403122%45–96
   ext_test_report.py1441192%61, 138, 149–150, 237–243
   install.py754244%31, 52, 69, 71, 112–131, 148, 181–184, 200–212, 254–278
   parula.py4250%19–86
   read_seq.py3943791%44–45, 110, 117, 130, 133–134, 138, 184, 228, 401, 422–439, 502, 505, 590, 614, 654, 696–700, 815, 826
   sequence.py63213179%10–13, 106–116, 137–150, 197, 262–265, 312, 339, 356, 404, 432, 459–464, 501, 517, 608, 636–645, 657, 679, 720–723, 777, 815, 826–827, 833, 844, 850, 852, 860, 895, 923–931, 1061, 1151, 1157, 1160, 1163, 1200, 1325–1338, 1368, 1396, 1418–1420, 1441, 1504, 1512, 1579, 1590–1603, 1672–1673, 1684–1702, 1726, 1756–1764, 1800, 1814–1824, 1839
   write_seq.py3621795%45, 69, 72–79, 313, 339, 342–349, 499
/home/runner/.local/lib/python3.12/site-packages/pypulseq/utils
   cumsum.py14193%17
   paper_plot.py63588%47–130
   safe_pns_prediction.py12611310%50–87, 102–189, 197–214, 222, 244–250, 279–286, 310–336, 344–383, 396–411, 415
   seq_plot.py37818052%20, 98, 130–131, 150, 167–169, 174–216, 226–233, 240–305, 309–315, 319–327, 349, 351, 354, 379–401, 446–447, 450–453, 485, 500–510, 519–521, 539–541, 543–544, 546–547, 580–592, 607–608, 624–641, 682–686
   seq_sound.py463622%12, 51–122
   tracing.py16662%33–34, 42, 54–55, 75
/home/runner/.local/lib/python3.12/site-packages/pypulseq/utils/siemens
   asc_to_hw.py58539%21–28, 48–106
   readasc.py48456%25–100
TOTAL5152164268% 

Tests Skipped Failures Errors Time
1396 21 💤 0 ❌ 0 🔥 4m 57s ⏱️

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant