Created
November 30, 2022 00:13
-
-
Save Enkerli/b52fd99ae87df92dfd90c64acf473059 to your computer and use it in GitHub Desktop.
A Jupyter notebook using pandas to process my list of VST3, VST, and AudioUnit plugins (as produced by Tracktion Waveform). Doing a bit of data cleanup.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"id": "210bece6-267b-41d0-915c-1ae0a360d6e1", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>name</th>\n", | |
" <th>manufacturer</th>\n", | |
" <th>category</th>\n", | |
" <th>AU</th>\n", | |
" <th>VST</th>\n", | |
" <th>VST3</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>8</th>\n", | |
" <td>2B Shaped</td>\n", | |
" <td>2B Played Music</td>\n", | |
" <td>Effect</td>\n", | |
" <td>AudioUnit</td>\n", | |
" <td></td>\n", | |
" <td>VST3</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>5</th>\n", | |
" <td>2B Delayed Classic</td>\n", | |
" <td>2B Played Music</td>\n", | |
" <td>Effect</td>\n", | |
" <td>AudioUnit</td>\n", | |
" <td></td>\n", | |
" <td>VST3</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>6</th>\n", | |
" <td>2B Filtered</td>\n", | |
" <td>2B Played Music</td>\n", | |
" <td>Effect</td>\n", | |
" <td>AudioUnit</td>\n", | |
" <td></td>\n", | |
" <td></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>7</th>\n", | |
" <td>2B Reverbed</td>\n", | |
" <td>2B Played Music</td>\n", | |
" <td>Effect</td>\n", | |
" <td>AudioUnit</td>\n", | |
" <td></td>\n", | |
" <td>VST3</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1300</th>\n", | |
" <td>TickyClav</td>\n", | |
" <td>2getheraudio</td>\n", | |
" <td>Synth</td>\n", | |
" <td>AudioUnit</td>\n", | |
" <td></td>\n", | |
" <td></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>...</th>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>838</th>\n", | |
" <td>Orange Dreams</td>\n", | |
" <td>ZAK Sound</td>\n", | |
" <td>Synth</td>\n", | |
" <td>AudioUnit</td>\n", | |
" <td></td>\n", | |
" <td>VST3</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1033</th>\n", | |
" <td>Retro Keys VII</td>\n", | |
" <td>ZAK Sound</td>\n", | |
" <td>Instrument</td>\n", | |
" <td></td>\n", | |
" <td></td>\n", | |
" <td>VST3</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>377</th>\n", | |
" <td>Downtown Colors</td>\n", | |
" <td>ZAK Sound</td>\n", | |
" <td>Synth</td>\n", | |
" <td>AudioUnit</td>\n", | |
" <td></td>\n", | |
" <td></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1068</th>\n", | |
" <td>STFU</td>\n", | |
" <td>ZEEK</td>\n", | |
" <td>Effect</td>\n", | |
" <td>AudioUnit</td>\n", | |
" <td></td>\n", | |
" <td>VST3</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1545</th>\n", | |
" <td>vielklang2CM</td>\n", | |
" <td>zplane</td>\n", | |
" <td>Synth</td>\n", | |
" <td>AudioUnit</td>\n", | |
" <td></td>\n", | |
" <td></td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"<p>1546 rows × 6 columns</p>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" name manufacturer category AU VST VST3\n", | |
"8 2B Shaped 2B Played Music Effect AudioUnit VST3\n", | |
"5 2B Delayed Classic 2B Played Music Effect AudioUnit VST3\n", | |
"6 2B Filtered 2B Played Music Effect AudioUnit \n", | |
"7 2B Reverbed 2B Played Music Effect AudioUnit VST3\n", | |
"1300 TickyClav 2getheraudio Synth AudioUnit \n", | |
"... ... ... ... ... .. ...\n", | |
"838 Orange Dreams ZAK Sound Synth AudioUnit VST3\n", | |
"1033 Retro Keys VII ZAK Sound Instrument VST3\n", | |
"377 Downtown Colors ZAK Sound Synth AudioUnit \n", | |
"1068 STFU ZEEK Effect AudioUnit VST3\n", | |
"1545 vielklang2CM zplane Synth AudioUnit \n", | |
"\n", | |
"[1546 rows x 6 columns]" | |
] | |
}, | |
"execution_count": 1, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"import pandas as pd\n", | |
"import numpy as np\n", | |
"cols = ['uniqueId', 'name', 'format', 'category', 'manufacturer']\n", | |
"plugs = pd.read_xml('knownPluginList64.xml')[cols]\n", | |
"plugs.set_index('uniqueId')\n", | |
"plugs['manufacturerlower']=plugs['manufacturer'].str.lower()\n", | |
"\n", | |
"# Combine rows on strict match\n", | |
"plugoutstrict=plugs.groupby(['name','manufacturerlower'],as_index=False).agg({'manufacturer':'first','format':list,'category':'first'})\n", | |
"plugoutstrict=plugoutstrict.join(pd.DataFrame(plugoutstrict.pop('format').tolist()))\n", | |
"plugoutstrict['AU']= np.where((plugoutstrict[0]=='AudioUnit')|(plugoutstrict[1]=='AudioUnit')|(plugoutstrict[2]=='AudioUnit')|(plugoutstrict[3]=='AudioUnit'), \"AudioUnit\", \"\")\n", | |
"plugoutstrict['VST']= np.where((plugoutstrict[0]=='VST')|(plugoutstrict[1]=='VST')|(plugoutstrict[2]=='VST')|(plugoutstrict[3]=='VST'), \"VST\", \"\")\n", | |
"plugoutstrict['VST3']= np.where((plugoutstrict[0]=='VST3')|(plugoutstrict[1]=='VST3')|(plugoutstrict[2]=='VST3')|(plugoutstrict[3]=='VST3'), \"VST3\", \"\")\n", | |
"plugoutstrict.sort_values('manufacturerlower',inplace=True)\n", | |
"plugoutstrict.drop(['manufacturerlower',0,1,2,3],axis=1, inplace=True)\n", | |
"plugoutstrict.to_csv(\"PluginsListStrict.csv\")\n", | |
"\n", | |
"# Cleanup\n", | |
"plugs.replace('Doubler2', 'Doublers', inplace=True)\n", | |
"plugs.replace('Doubler4', 'Doublers', inplace=True)\n", | |
"plugs.replace('kHs Stereo', 'kHs_Stereo', inplace=True)\n", | |
"plugs.replace('Paul Ferrand', 'Sfzt', inplace=True)\n", | |
"plugs.replace('Matt Tytel', 'Vital Audio', inplace=True)\n", | |
"plugs.replace('Mixed In Key LLC', 'Mixed In Key', inplace=True)\n", | |
"plugs.replace('iZotope, Inc.', 'iZotope', inplace=True)\n", | |
"plugs.replace('Plogue Art et Technologie, Inc', 'Plogue Art et Technologie', inplace=True)\n", | |
"plugs.replace('Voice-Changer', 'Voice Changer', inplace=True)\n", | |
"plugs.replace(to_replace=' \\(m\\)$', value='', regex=True, inplace=True)\n", | |
"plugs.replace(to_replace=' \\(s\\)$', value='', regex=True, inplace=True)\n", | |
"plugs.replace(to_replace=' \\(m->s\\)$', value='', regex=True, inplace=True)\n", | |
"plugs.replace(to_replace=' \\(0->2\\)$', value='', regex=True, inplace=True)\n", | |
"plugs.replace(to_replace=' Mono/Stereo$', value='', regex=True, inplace=True)\n", | |
"plugs.replace(to_replace=' Stereo$', value='', regex=True, inplace=True)\n", | |
"plugs.replace(to_replace=' Mono$', value='', regex=True, inplace=True)\n", | |
"plugs['name'] = np.where(plugs['name'] =='Wider', plugs['name'].str.cat(plugs['manufacturer'], sep=\" \"), plugs['name'])\n", | |
"plugs['name'] = np.where(plugs['name'] =='DeBreath', plugs['name'].str.cat(plugs['manufacturer'], sep=\" \"), plugs['name'])\n", | |
"plugs['name'] = np.where(plugs['name'] =='Surge', plugs['name'].str.cat(plugs['manufacturer'], sep=\" \"), plugs['name'])\n", | |
"plugs['name'] = np.where(plugs['name'] =='Fracture', plugs['name'].str.cat(plugs['manufacturer'], sep=\" \"), plugs['name'])\n", | |
"\n", | |
"# Combine cleaned up rows on name-only match\n", | |
"plugout=plugs.groupby('name',as_index=False).agg({'manufacturer':'first','manufacturerlower':'first','format':list,'category':'first'})\n", | |
"plugout=plugout.join(pd.DataFrame(plugout.pop('format').tolist()))\n", | |
"plugout['AU']= np.where((plugout[0]=='AudioUnit')|(plugout[1]=='AudioUnit')|(plugout[2]=='AudioUnit')|(plugout[3]=='AudioUnit')|(plugout[4]=='AudioUnit')|(plugout[5]=='AudioUnit')|(plugout[6]=='AudioUnit')|(plugout[7]=='AudioUnit')|(plugout[8]=='AudioUnit'), \"AudioUnit\", \"\")\n", | |
"plugout['VST']= np.where((plugout[0]=='VST')|(plugout[1]=='VST')|(plugout[2]=='VST')|(plugout[3]=='VST')|(plugout[4]=='VST')|(plugout[5]=='VST')|(plugout[6]=='VST')|(plugout[7]=='VST')|(plugout[8]=='VST'), \"VST\", \"\")\n", | |
"plugout['VST3']= np.where((plugout[0]=='VST3')|(plugout[1]=='VST3')|(plugout[2]=='VST3')|(plugout[3]=='VST3')|(plugout[4]=='VST3')|(plugout[5]=='VST3')|(plugout[6]=='VST3')|(plugout[7]=='VST3')|(plugout[8]=='VST3'), \"VST3\", \"\")\n", | |
"\n", | |
"# Prepare list\n", | |
"plugout.sort_values('manufacturerlower',inplace=True)\n", | |
"plugout.drop(['manufacturerlower',0,1,2,3,4,5,6,7,8],axis=1, inplace=True)\n", | |
"plugout.to_csv(\"PluginsList.csv\")\n", | |
"\n", | |
"# Find differences between strict match and name only\n", | |
"plugdif=pd.concat([plugoutstrict,plugout]).drop_duplicates(keep=False)\n", | |
"plugdif.to_csv(\"PluginsListDif.csv\")\n", | |
"\n", | |
"plugout" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "84213abe-1759-4cc2-9e74-195b20f89953", | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3 (ipykernel)", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.10.8" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 5 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment