{"id":1227,"date":"2026-03-03T16:01:49","date_gmt":"2026-03-03T15:01:49","guid":{"rendered":"https:\/\/www.reeltoreel.nl\/blog\/?p=1227"},"modified":"2026-06-02T20:56:10","modified_gmt":"2026-06-02T18:56:10","slug":"hp8903a-audio-analyzer-and-python-creating-a-new-app","status":"publish","type":"post","link":"https:\/\/www.reeltoreel.nl\/blog\/?p=1227","title":{"rendered":"HP8903A Audio Analyzer and python: creating a new app"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">I&#8217;ve been working on a way to control my HP8903A Audio Analyzer directly from my PC. This precision instrument is a fantastic tool for audio measurements \u2014 think frequency response plots, THD+N distortion analysis, and more \u2014 making it ideal for testing tape machines and other vintage audio equipment.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a3fbdffe6d61&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a3fbdffe6d61\" class=\"wp-block-image size-large is-resized wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"683\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.reeltoreel.nl\/blog\/wp-content\/uploads\/2026\/03\/image-1024x683.png\" alt=\"\" class=\"wp-image-1228\" style=\"aspect-ratio:1.4992846924177397;width:608px;height:auto\" srcset=\"https:\/\/www.reeltoreel.nl\/blog\/wp-content\/uploads\/2026\/03\/image-1024x683.png 1024w, https:\/\/www.reeltoreel.nl\/blog\/wp-content\/uploads\/2026\/03\/image-150x100.png 150w, https:\/\/www.reeltoreel.nl\/blog\/wp-content\/uploads\/2026\/03\/image-300x200.png 300w, https:\/\/www.reeltoreel.nl\/blog\/wp-content\/uploads\/2026\/03\/image-624x416.png 624w, https:\/\/www.reeltoreel.nl\/blog\/wp-content\/uploads\/2026\/03\/image-1.png 1280w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"894\" height=\"825\" src=\"https:\/\/www.reeltoreel.nl\/blog\/wp-content\/uploads\/2026\/03\/image-2-1.png\" alt=\"\" class=\"wp-image-1229\" style=\"aspect-ratio:1.0836521559301002;width:288px;height:auto\" srcset=\"https:\/\/www.reeltoreel.nl\/blog\/wp-content\/uploads\/2026\/03\/image-2-1.png 894w, https:\/\/www.reeltoreel.nl\/blog\/wp-content\/uploads\/2026\/03\/image-2-150x138.png 150w, https:\/\/www.reeltoreel.nl\/blog\/wp-content\/uploads\/2026\/03\/image-2-300x277.png 300w, https:\/\/www.reeltoreel.nl\/blog\/wp-content\/uploads\/2026\/03\/image-2-624x576.png 624w\" sizes=\"auto, (max-width: 894px) 100vw, 894px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">I also have the necessary GPIB-to-USB interface from National Instruments (NI-488.2), which handles the communication between the analyzer and the computer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There is already excellent software available for this purpose, written by Peter Millett. You can find it on his website at <a href=\"http:\/\/www.pmillett.com\/hp_8903_software.htm\">http:\/\/www.pmillett.com\/hp_8903_software.htm<\/a>. Peter was kind enough to share his source code with me, which turned out to be invaluable during development.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">However, his software had a few limitations that didn&#8217;t work for my setup:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>It is a Windows-only application that requires a specific HP runtime environment.<\/li>\n\n\n\n<li>It was written in an HP proprietary programming environment that is difficult or impossible to install on modern versions of Windows \u2014 and since it is commercial software, extending or updating it would require a financial investment.<\/li>\n\n\n\n<li>I work exclusively on Linux and don&#8217;t have a Windows machine available.<\/li>\n\n\n\n<li>I wanted a fully open-source solution that others could possibly freely build upon.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">So, with some help from AI, I set out to rewrite the application in Python. The result closely replicates all the functionality of Peter Millett&#8217;s original software, while adding cross-platform support and a modern interface built with Qt6 and pyqtgraph, running on openSUSE Tumbleweed with Plasma 6.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The application is still technically a work in progress, but it is 95\u201399% complete and currently running flawlessly. Only a few small refinements remain.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s a screenshot of the current interface:<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a3fbdffee83a&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a3fbdffee83a\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2050\" height=\"1170\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.reeltoreel.nl\/blog\/wp-content\/uploads\/2026\/03\/Screenshot_20260305_125301.png\" alt=\"HP8903A Audio Analyzer metingen\" class=\"wp-image-1257\" srcset=\"https:\/\/www.reeltoreel.nl\/blog\/wp-content\/uploads\/2026\/03\/Screenshot_20260305_125301.png 2050w, https:\/\/www.reeltoreel.nl\/blog\/wp-content\/uploads\/2026\/03\/Screenshot_20260305_125301-300x171.png 300w, https:\/\/www.reeltoreel.nl\/blog\/wp-content\/uploads\/2026\/03\/Screenshot_20260305_125301-1024x584.png 1024w, https:\/\/www.reeltoreel.nl\/blog\/wp-content\/uploads\/2026\/03\/Screenshot_20260305_125301-150x86.png 150w, https:\/\/www.reeltoreel.nl\/blog\/wp-content\/uploads\/2026\/03\/Screenshot_20260305_125301-1536x877.png 1536w, https:\/\/www.reeltoreel.nl\/blog\/wp-content\/uploads\/2026\/03\/Screenshot_20260305_125301-2048x1169.png 2048w, https:\/\/www.reeltoreel.nl\/blog\/wp-content\/uploads\/2026\/03\/Screenshot_20260305_125301-624x356.png 624w\" sizes=\"auto, (max-width: 2050px) 100vw, 2050px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The app supports four core measurement modes:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Frequency Response <\/strong>\u2014 sweep the input frequency and plot the output level across the audio band<\/li>\n\n\n\n<li><strong>THD+N distortion<\/strong> \u2014 measure total harmonic distortion plus noise at a given frequency and level<\/li>\n\n\n\n<li><strong>Voltage<\/strong> \u2014 read AC\/DC voltage at the analyzer&#8217;s input<\/li>\n\n\n\n<li><strong>Power<\/strong> \u2014 measure output power into a specified load<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Very happy with the result, and it works very nice! <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><mark style=\"background-color:#f99c9c\" class=\"has-inline-color has-dark-gray-color\">DISCLAIMER: This program is tailored for my situation. Even though it is made using 100% open source components I am not sure that it is very portable and that it works in your situation. Leave a reply (link is above post) if you are interested, but I do not have high hopes that it will run outside of my environment.<\/mark> <br \/>But you can always have a go. Please let me know if it has worked for you (especially Windows users), or if it didn&#8217;t work for you. Hopefully I can improve the code, or the setup process so that we can make it work everywhere.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I have created a Codeberg repository that you can clone here:<br \/><a href=\"https:\/\/codeberg.org\/pvdm\/hp8903a\">https:\/\/codeberg.org\/pvdm\/hp8903a<\/a><br \/>There are instructions on how to install the app on your system.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Next project: do the same for my Audio Precision Portable One Plus:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"608\" height=\"452\" src=\"https:\/\/www.reeltoreel.nl\/blog\/wp-content\/uploads\/2026\/03\/image-3-1.png\" alt=\"\" class=\"wp-image-1249\" srcset=\"https:\/\/www.reeltoreel.nl\/blog\/wp-content\/uploads\/2026\/03\/image-3-1.png 608w, https:\/\/www.reeltoreel.nl\/blog\/wp-content\/uploads\/2026\/03\/image-3-150x112.png 150w, https:\/\/www.reeltoreel.nl\/blog\/wp-content\/uploads\/2026\/03\/image-3-300x223.png 300w\" sizes=\"auto, (max-width: 608px) 100vw, 608px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I&#8217;ve been working on a way to control my HP8903A Audio Analyzer directly from my PC. This precision instrument is a fantastic tool for audio measurements \u2014 think frequency response plots, THD+N distortion analysis, and more \u2014 making it ideal for testing tape machines and other vintage audio equipment. I also have the necessary GPIB-to-USB [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[5,3,2],"tags":[],"class_list":["post-1227","post","type-post","status-publish","format-standard","hentry","category-audio","category-linux","category-tape"],"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.reeltoreel.nl\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1227","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.reeltoreel.nl\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.reeltoreel.nl\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.reeltoreel.nl\/blog\/index.php?rest_route=\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.reeltoreel.nl\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1227"}],"version-history":[{"count":29,"href":"https:\/\/www.reeltoreel.nl\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1227\/revisions"}],"predecessor-version":[{"id":1292,"href":"https:\/\/www.reeltoreel.nl\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1227\/revisions\/1292"}],"wp:attachment":[{"href":"https:\/\/www.reeltoreel.nl\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1227"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.reeltoreel.nl\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1227"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.reeltoreel.nl\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1227"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}