This article is something of a companion-piece to this one, which explains (briefly!) how to use Cygwin to get a piece of software -the Classical CD Tagger- written for Linux running happily on Windows. That short-form article assumed you knew what Cygwin was and how to use it to install necessary Linux software.
In this article, the end-result is the same: we want to be able to run the Classical CD Tagger within Windows, using Cygwin to provide the Linux-capabilities it needs. But I shall assume you've never really used Cygwin before and will thus describe things at length and use lots of screenshots to make things clear!
It's been possible for many, many years to run Unix-y programs on Windows by installing Cygwin. Cygwin is a Linux compatibility layer for Windows, much as Wine is a Windows compatibility layer for Linux. You install it, then you can download and compile all sorts of Linux-native programs and have them run 'within' the Cygwin environment, still inside your Windows operating system.
You might well ask: surely, there are lots of ways of running Linux on Windows? For example, install VirtualBox, define a virtual machine, install Ubuntu (or whatever distro floats your boat!): da-da! Linux on Windows!! Well, sort of. What you'd actually end up with is a complete Linux environment running on top of, but outside of, Windows. A file on your C: drive will be invisible to the Linux environment, because they are two completely separate, distinct environments. Running a VM on Windows also requires a lot of CPU and RAM.
What about the new(ish) Windows Subsystem for Linux (WSL)? Wouldn't that achieve the requirement? Well, it might -but there are already 2 distinct versions of WSL which makes recommending it problematic. Version 1 was very much like Cygwin: it intercepted Linux software's kernel calls in real time and translated them into something the Windows kernel could handle. That resulted in a lightweight, unified environment in which Linux and Windows really did seem to cohabit nicely… but version 2 is a very different beast and is, essentially, a virtual machine running Linux. It does so more transparently than, say, VirtualBox, but the result is basically the same: you still need lots of RAM and lots of CPU.
Cygwin, however, provides a thin, mostly transparent way of running Linux software on Windows, without major virtualization taking place. It's free, like WSL; it's lightweight, like WSL v1, but unlike VirtualBox; it gets the job done. So that's why I'll be showing you how to install Cygwin and get it to run CCDT now.
So, first visit the Cygwin download page. Click on the link that says, “Install Cygwin by running setup-x86_64.exe…”: there is also a link to a 32-bit version of Cygwin's setup.exe, but I've not used that and therefore haven't tested it. Stick to the 64-bit version (assuming you are running a 64-bit version of Windows, of course!)
Save the setup-x86_64.exe file somewhere on your Windows' hard drive (I'm going to store it in my Downloads folder for the purposes of what follows). In Windows Explorer, double-click the setup program when it's fully downloaded and confirm you want to run it, if asked. Depending on your Windows version, you may get a pop-up asking if you 'want to allow this app from an unknown publisher to make changes to your device': answer [Yes] if so.
A fairly standard installation wizard then appears:
Click [Next] to start things off. You are first asked where you will source Cygwin's software packages from: if this is your first time running Cygwin, you're going to be pulling everything from the Internet (so a fast Internet connection is very desirable at this point!). That 'from the Internet' option is the default option, so just check it's selected and then click [Next] once more.
Now you are asked where, on your local PC, you want to store all the software packages that Cygwin will download from the Internet. It will suggest a 'C:\Cygwin64' directory by default:
That option is fine to leave as-is, and the other option shown there -to install for all users, rather than just yourself- is probably also fine to leave selected, depending on what sort of computing environment you are using. If you want to stop your 3-year old experimenting in Linux software, maybe a different response would be in order, but… I'm sticking to the defaults you see here!
Next, you're asked where on your Windows hard drive you want these software packages installed. The default suggestion in this case is probably not such a good idea:
As you can see, it threatens to put everything into your standard Downloads directory. This isn't bad as such -but I tend to use that directory as a temporary holding area for things I will download, install then delete. Cygwin's packages aren't like that: they are what will make Linux software run on your Windows PC and, as such, need to be considered a permanent part of your PC's software 'furniture'. As such, I always change the suggested destination here to something Cygwin-specific, such as C:\cygwin\downloads. When you try clicking [Next] having done that, this happens:
That's the installer realising the altered downloads directory doesn't acutally exist, so it has to ask you if it's OK to create it. Go ahead and tell it to do so.
Now, you told Cygwin earlier to download its software from the Internet. It will now therefore ask you how it should connect to the Internet:
You can probably accept the default option here (to “use system proxy”), because that will either work if you are actually using a proxy server to connect to the Internet, or it will work because you don't use a proxy server at all! Provided your PC is able to connect to the Internet in a browser, say, then the 'System Proxy' option here will work fine for Cygwin's purposes too.
Now Cygwin will fetch a list of 'software mirrors' and offer it to you to select one from as the server you'll use to download the various software packages:
You could scan through this list carefully, if you like, looking for a server that is geographically close to you (to make the software download stage go quickly). Or you can just pick whatever server takes your fancy, if your Internet speeds are fast enough so that you don't need to worry about geographical proximity!
Once a server is selected and you click [Next], a quick download of a catalogue of software will take place and then you'll be presented with this:
This is where you select the Linux software packages you want installed on your Windows PC. There doesn't look like much to select from, but that's because they are all hiding underneath that 'All' item. Click the '+' sign next to that and the list will expand to show multiple software categories or groups:
You could then expand each of those categories in their turn, and so on. Alternatively, if you know what software you want to install, you can simply type its name (or part of the name) in the Search window and see what matches. For example, if I type cdpara, I get this:
…which tells you that there's a package called “cdparanoia” in the “audio” group of software. Currently, it's marked as “skip”, which means it's not going to be installed. Double-click that word 'skip', though, and the word will change to the latest version available… and is then implicitly marked as “will be installed when you tell me to”. Double-click it again for now, to revert it back to “skip”: we want to start the next bit of work with a clean slate!
To run CCDT, we need the following software prerequisites:
So, type each of those in turn into the 'Search' window, expand the categories displayed until you find the correct package and double-click it so that it displays the latest version of the package rather than the word 'skip'. If the word “keep” is displayed for any software package, it means that piece of software has already been installed for some reason, and there's no need to re-install it, so just skip that package.
Here's me selecting xclip, for example:
Notice that we don't want any of the 'debug' or 'devel' type packages; just the xclip package itself. The flac selection is similar:
With those packages selected, click [Next] and you'll see that Cygwin is smart enough to work out that if you want package X, you also need to install packages A, B, C and D as they are the necessary prerequisites for the one package you actually care about! For example:
Remember, too, that this is the first time you've installed any part of Cygwin, so it has to install its 'base' packages if it's to work at all. In any event, you're about to download rather more software than you just selected to install! Click [Next] again when you're ready: the software download will begin:
Be patient: everything depends on the speed of your Internet connection! Eventually, however, all the software will be downloaded and saved on disk, at which point you'll be prompted with this:
I suggest you leave both options checked on for now. Just click [Finish], and you'll see a new program launch icon appear on your desktop. You'll also find a new item in the Start menu, under 'C', for 'Cygwin'. Use either to launch the Cygwin environment.
Double-clicking the desktop icon or clicking through the Start menu will eventually cause the Cygwin environment to launch: it will probably be a bit disappointing to look at:
Well, it's a command line environment, after all! You can customise the look-and-feel of it a bit, by clicking on the Cygwin icon in the top-left of the title bar and then selecting 'Options':
You can see I've elected to use the built-in 'Dracula' theme. I've also clicked on the 'Window' item on the left and set my default size to 132 columns and 34 rows: the default 80 x 24 is a bit small for my tastes. Click around and make yourself comfortable with your new Cygwin environment!
To illustrate how transparent it is, type the following commands:
cd /cygdrive/c ls
You should see output similar to this:
$ ls '$GetCurrent' cygwin Intel 'Program Files (x86)' 'System Volume Information' '$Recycle.Bin' cygwin64 pagefile.sys ProgramData Users bootmgr 'Documents and Settings' PerfLogs Recovery Windows BOOTNXT hiberfil.sys 'Program Files' swapfile.sys Windows10Upgrade
Does any of that look familiar? How about opening Windows Explorer and pointing it at your C: drive:
Notice how all the directories Explorer knows about were the ones listed by the Cygwin 'ls' command. Sure, Cygwin shows some 'weird' entries such as '$Recyle.Bin' which Explorer doesn't display usually, but all the main suspects are listed by both: 'Program Files', 'Windows10Upgrade' and so on. In other words, the environments are actually the same: what exists on Windows is visible to Cygwin. The reverse is also true.
There is just one (quite nasty!) issue that needs fixing before you can reliably let Cygwin interact with your Windows file system: Cygwin tries to use a Linux-like security model for files on a hard disk that is different from that which Windows uses natively. The incompatibilities between the two can cause problems, such as files becoming inaccessible to Windows when accessbile from Cygwin (or vice versa). In the worst case, it can appear to corrupt the metadata in your music files to the point of wiping it all out!
So, to stop that happening, you should configure Cygwin to not use its own security model when mounting the directory that contains your music files. To do that, start with typing the following command at the Cygwin command prompt:
That creates a 'cygwin' folder called /music which will be the point where you access your Windows-stored music files. Next:
The default entry you see in this file will read as follows:
none /cygdrive cygdrive binary,posix=0,user 0 0
You need to add an additional line after that which reads something like:
d:\music\flac\classical /music ntfs binary,noacl,posix=0,user 0 0
This says, in order, “here's where my music files are physically stored as far as Windows is concerned; here's where I want you to access them via Cygwin; the physical source is formatted with the NTFS file system; there are assorted mount options”. Obviously, if you actually store your music files on X:/here-they-are/come-and-find-them, you will need to edit the first part of that text entry to match. It is, however, a good idea to mount your music files at /music, regardless of where, physically, they happen to be stored on disk.
Note that Cygwin does not respond well to directory paths that contain spaces -so, it's best to avoid them if at all possible.
Also note the all-important presence of noacl in the mount options in that previous example: this switches off Cygwin's Linux approach to security. It will only take full effect once every process using Cygwin has been stopped and re-started: the best way of ensuring that happens is to reboot your Windows PC altogether.
Once your PC comes back from that reboot, you are good to go with Cygwin! You will also find all your music files mounted correctly at /music (if you used that specific mount point in the previous example).
Start by issuing these commands in a Cygwin command prompt:
cd touch testfile.txt
Those are commands to 'go to my Cygwin home directory' and to create an empty text file, called “testfile.txt”. We can check the file exists in Cygwin:
$ ls -l total 0 -rw-r--r-- 1 hjr None 0 Aug 8 18:51 testfile.txt
Can we see this new file in Windows? Sure -but it's not exactly where you think it is! In Cygwin, you can check where the file is said to exist:
$ pwd /home/hjr
That 'prints the working directory' and shows Cygwin thinks we're in “/home/hjr” -a very Linux-y home folder name! But physically, as far as Windows is concerned, that maps to the download directory you selected during the Cygwin installation process. In my case, I said to store things in C:\Cygwin64… so let's check that in Explorer:
And sure enough, Windows can see the “testfile.txt” file perfectly fine. It also shows a bunch of hidden files which you don't ordinarily see when 'ls-ing' in Linux, but they're there in Cygwin's /home/hjr directory too:
$ ls -la total 25 drwxr-xr-x+ 1 hjr None 0 Aug 8 18:51 . drwxrwxrwt+ 1 hjr None 0 Aug 8 18:17 .. -rwxr-xr-x 1 hjr None 1494 Aug 8 18:13 .bash_profile -rwxr-xr-x 1 hjr None 5645 Aug 8 18:13 .bashrc -rwxr-xr-x 1 hjr None 1919 Aug 8 18:13 .inputrc -rw-r--r-- 1 hjr None 90 Aug 8 18:46 .minttyrc -rwxr-xr-x 1 hjr None 1236 Aug 8 18:13 .profile -rw-r--r-- 1 hjr None 0 Aug 8 18:51 testfile.txt
From this, we learn that c:\cygwin64 is regarded by Cygwin as / -the Linux-y root directory. Thus what Cygwin thinks is /home/hjr is physically found on the Windows side of things as c:\cygwin64\home\hjr. Put another way: any directory you think exists in Cygwin actually physically exists on the Windows box with “C:\cygwin64” pre-pended to it.
So now our path to using CCDT is clear: we download the file from this website in the usual way. We then move it to somewhere like c:\cygwin64\bin (which is therefore /bin to Cygwin). If we got all the pre-requisites right, the script should just run… so let's check if that's true!
Stepping through that in some detail, then. First, click this link to download CCDT to your Windows PC in the usual way. Store it where you usually store your downloads -which, generally, seems to mean your Downloads folder. Remember that, on Windows, that folder is actually c:\users\<your username>\Downloads.
Now, in your Cygwin environment (that is, within the terminal window that you saw earlier that displays the Cygwin logo in its top-left corner), issue this sequence of commands, one-by-one:
cd /bin cp /cygdrive/c/Users/hjr/Downloads/ccdt.sh . chmod +x ccdt.sh ln -s ccdt.sh ccdt
The first command positions us within the Cygwin /bin directory (where all executables are generally stored in Unix-y environments!). The second command copies the ccdt.sh script from the Windows Download directory where we originally stored it to our current location -i.e, the /bin directory itself. Since /bin is in the PATH for all Cygwin users, we'll be able to run it by merely typing its name: we won't need to type its full path too.
The third command is all-important: it makes the ccdt.sh shell script executable (i.e., capable of being run as a proper program).
The fourth and final command is a bit optional, but I'd strongly recommend it. The command creates a 'symbolic link' between the real ccdt.sh file and the name 'ccdt'. A symbolic link is basically a shortcut or alias: you type the one and you get the results of typing the other. In this case, the command makes it possible to invoke the ccdt.sh script by merely typing 'ccdt', without the “.sh” alias. I find it a more natural way of invoking a program -and, in any case, it saves you three keypresses every time you run the program, so it's worth it in my book!
Now, all we need are some flac music files for CCDT to process! Let's say you have ripped a CD and created some flac files using a Windows tool (such as Exact Audio Copy or dBpoweramp). Let's further assume that you've stored the resulting flac files in your Windows Music directory. The task therefore becomes: how do we run ccdt within Cygwin whilst processing files which are stored on the C: drive, outside of Cygwin's root folder?
It's quite easy. Just type this in your Cygwin command prompt window:
cd /cygdrive/c/Users/<your username>/Music
The /cygdrive/c bit tells Cygwin that you need to travel outside of its own root folder onto the 'real' Windows hard drive. If you had a D: drive or even an M: drive, you could equally well type “cd /cygdrive/d” or “cd /cygdrive/m”, for example
Once you are sitting in your Music directory, you can list the contents, to make sure there are some flac files there (otherwise CCDT itself will throw an error at you):
Once you confirm you are sitting in a directory full of flacs, you can then launch CCDT with the command (assuming you created the 'ccdt' symbolic link earlier):
Here's me doing all of that. My username is “hjr”, so my Windows Music directory is found at cygdrive/c/Users/hjr/Music:
Finally, I can launch ccdt:
You'll find that CCDT now runs almost exactly as it would on a native Linux operating system. There's just one exception: in Option 2, when you specify the name of the composition, you would expect, on a Linux PC, to be able to press Ctrl+Shift+V to paste in the current directory name as the composition name. This functionality doesn't, however, work on the Windows+Cygwin version.
Fortunately, there are a couple of workarounds. In the first place, the current directory name is still displayed at the top left of the screen when you take Option 2, so you could simply use your mouse to manually highlight and right-click+copy then right-click+paste that into the appropriate entry field when prompted.
But the rather subtler fix -which provides almost identical functionality as you'd get on Linux- is as follows:
Note that this Shift+Insert key combo only works if you've switched them on as a Cygwin shortcut. That means you need to click the Cygwin logo at the top-left of a running Cygwin terminal session, click Options and then click Keys:
The first checkbox shown in the 'Shortcuts' section there needs to be switched on, basically. Once you've set it on for one Cygwin session, it will remain switched on as an option for all future Cygwin sessions, so it's strictly a one-time set-and-forget affair.
Once you've set it to be on, then you can use Shift+Insert as a quick way to paste. If you've remembered to launch an xserver and set the DISPLAY variable before running CCDT (which, unfortunately, isn't a set-and-forget affair, but must be done every time you start a new Cygwin session), then your current directory name is auto-copied into the clipboard as CCDT starts… at which point, Shift+Insert can then paste it into the appropriate place once Option 2 has been taken.
Anyway: apart from that one small twist, where Ctrl+Shift+V becomes Shift+Insert, you can now run CCDT on Windows to tag up your audio files to the same high standard as you can on Linux.