3 Apr 2013Picked up a NAD 3020B for £20!

So a few months back, when I had the Quad 306 I kept my eye on eBay for a NAD, I missed my last one and I a massive fan of NAD. Managed to find one for £30 Buy it now, I think that the guy didn’t know what he had, so I snapped it up. When it arrived, it turns out that someone had repaired it was some dodgy power transistors and it had been dropped in the post cracking the facia so he refunded me a tenner  which was nice. That wasn’t really an issue, as I was planning to replace most of the electrolytic caps anyway replacing the transistors was going to be a 5 min job, ordered some high quality motorola transistors and picked up some new caps(apparently sonically the best 3055 & 2955).

Took the amp home with me from University to the workshop, upgraded the caps from 2200uf x4 to 4700uf x4 and replaced all the transistors picking out matched pairs. And it sounds great, adjusted the DC off-set, need to adjust the idle current too once I get the 1K carbon resistors in. Compared it to my fathers original 3020B and to my ears it sounds better, nicer at the higher volumes more stable and solid performance.  

Currently paired up with a pair of Sonab OA – 4 Type II speakers, they’re meant to be floor standing facing vertically but because of the space in the workshop being acoustically awful they’re on the desk at the moment. I’m going to try to pack in at least 100 hours of ‘burning-in’ on the new transistors the readjust the DC offset and idle current before it comes back to university.

On a side note, I managed to destroy one of my MS 812 drivers, I think they were getting tired from being used and abused as test speakers… But found a new pair for £15 delivered!

Attached is the 3020A service manual in PDF and the 3020B Schematics in a GIF format(below, as part of the gallery), if you are unsure which one you need, the 3020A has the main capacitors just below the Transformer, the 3020B has the caps by the heatsink.

NAD 3020 ServiceManual

Tags: , , , , ,

No Comments

29 Mar 2013NAD 90 Restoration – Recapping and cleaning.

So, this amplifier was gifted to me recently and I was instantly excited. I’m a fan a huge fan of NAD amps, and this one is an absolute stunner. I was instantly excited as it was already in a ‘working’ order and was ready to go.  As always the first thing I did before I plugged it in was opened it up, brushed, hoovered and sprayed all switches and dials. My initial reaction to this amplifier was that it is very delicate, it has a lot of detail however the output was almost entirely mid – top range with no bass. The meters didn’t work and there was a resistor that burnt out and a few caps had leaked. I had to replace them, the main reservoir caps and i’ll replace a few others in the process too! Luckily this amplifier arrived with a complete circuit diagram to replace the resistor that no-longer had a case.

First Step for me was to remove the old reservoir capacitors, I ordered some high quality F&T caps off eBay.  At first impressions this amplifier is built like a tank, it far exceeds their later stuff (like the 3020) in build quality. Caps arrived pretty quickly, I think I should have asked for dimensions first looks like they’re only just going to fit!

After the main caps were replaced, it was onto the power-amp section. I had to remove the pre-amp before as it was covering the back of the board, simple enough just needed to remove the three wire wound inputs and left the rainbow of wires at the other end attached. The board itself was unharmed from the burning of the resistor on the other side, was a nice surprise. De-soldering was simple enough, few of the caps were bad on the bottom and had to scrape glue/wax off, couldn’t see any other wear on the amp so moved on pretty quickly.

So it was finally time to test the amplifier, after replacing 10 capacitors, 2 bulbs, 1 resistor and 4 speaker terminals the bloody thing wouldn’t turn on! Turns out that the new bigger caps were preventing the power switch from moving backwards into where used to be a void. Time for plan B…

New Panasonic caps arrived 3 days later, fitted using the original harnesses and they were the same spec as the ones that came out (6,300 uf). Amplifier fires up and sounds better than before, more low end. I left the amp to get used to it’s new components for an hour or so whilst I had some tea. Overall the amp sounds better but the low end is lacking at the moment when the ‘bass’ dial is set at 0, sounds better when it’s moved to +3 where as before this made almost no difference. I’ve been testing it every day since, still stable and sounding the same, I wouldn’t mind having a look into the bias on the circuits but my meter I have at the moment won’t read low enough (time for a new meter I think). Gave her a good scrub and she’s looking beautiful, however I don’t think I can afford to keep it will be going on eBay soon (don’t worry, I’ll take the friend that gave me this out for drinks as a thank-you anyway!).

I scanned in the NAD 90 Schematics (Circuit diagram) for anyone that’s interested here (The PSD is available upon request, it’s not here because it’s 160MB!): NAD 90 Schematics

And the NAD 90 User Manual:NAD 90 User Manual

Tags: , , , , ,

1 Comment

29 Mar 2013Film it Yourself

This project was presented to me as multiple photoshop files to be converted into a website from the companies graphic designer. There was no need at the time for the use of a CMS, however there was a short deadline of two days, which was deliverable due to the simplistic structure of the code. The project wasn’t too difficult, the main hurdle was converting the high resolution images to a format that was suitable for the web, and converting the graphic designers work to a ‘flexible’ medium as it was designed with the idea of a fixed width.

Since the launch of the site, it has reached the top rank on Google!

Tags: , ,

No Comments

27 Mar 2013Java – Custom shortener with GUI

This task was something different to before, It required the implementation of a GUI which up-until this point i’d only used Python for GUIs. The task itself was focused on replacing words in sentences with abbreviations loaded from a text file worked into a command line application then implemented into the GUI itself.

We had a limited time to complete this task, whilst up for grabs were ‘bonus marks’ for implementing an extra feature, I went for taking text from the system clipboard.

There is still a few bugs I picked up upon during testing:

  • If multiple special characters are entered, they are interpreted and ‘organised’ – “Hello?!@?!@?!@” = “ lo!!!???@@@”.
  • Return carriages are removed as they were causing issue in testing.
  • IF the user enters a long string, the input box doesn’t increase in size; however this program was intended to interpret strings up to 140 characters in length.

For some reason my indentation is getting removed at the moment, I’ll have to address that later.

Shortener.java

This file does all the work, it imports the text file into a 2D array, splits the incoming string into words, checks each word against the array using a basic linear search method then returns the new string. Not the most scalable application, but it was for a small scale project.


import java.io.File;
import java.util.Scanner;

public class Shortener {
 private String abbreviationsArray [][] = null;
 private String errorMessage = "";
 private int characterCounter = 0;
 private String editedWord = "";
 private String [] tempSpecialCharacter = new String [2000000]; /*Sorry for the use of a Magic number, I don't see the reason for the array being bigger than 2000000 spaces for such a small project that has no intention of scaling (or in the case of the twitter example, longer than 140 chars.) Also it'll bloat my code out if I create a counter to rectify this*/
 private String [] specialCharacters = {"!","\\?","@","\\*","&","$","£","\n","\r"}; //If the user returns the carrage, at the moment it just removes this. I could change this but, again I can't see when the user is going to reutn the carrage in 140 characters.
 private int specialCounter = 0;

 public Shortener() {
 File inputFile = new File ("abbreviations.txt");
 loadAbbreviations(inputFile);
 }

 public Shortener( File inAbbreviationsFile ) { //This is mutable, if the user puts in their own file, this can work here!
 loadAbbreviations(inAbbreviationsFile); //Explained more in ShortenerUtility.java
 }

 //I've removed the Shortener in string as I wasn't using it...

 //Methods

 public String getErrorMessage(){
 return errorMessage;
 }

 public void loadDefaultAbbreviations(){
 File inputFile = new File ("abbreviations.txt");
 loadAbbreviations(inputFile);
 }

 public String[][] loadAbbreviations(File abbreviationsFile){
 int count = 0;
 int i = 0;
 String currentLine = "";
 try{
 Scanner countLines= new Scanner (abbreviationsFile);
 Scanner newAbbreviations = new Scanner (abbreviationsFile);

 while (countLines.hasNextLine()) {
 count++;
 countLines.nextLine();
 }

 abbreviationsArray = new String[count][2];

 while (newAbbreviations.hasNextLine()) {
 currentLine = newAbbreviations.nextLine();
 abbreviationsArray[i] = currentLine.split(",");
 i ++;
 }

 try{
 countLines.close();
 newAbbreviations.close();
 }

 catch (Exception error) {
 errorMessage = ("Exception: " + error.getMessage());
 }
 }
 catch (Exception error) {
 errorMessage = ("Exception: " + error.getMessage());
 }
 finally{
 i = 0; //Reset for next-time??!
 }
 return abbreviationsArray;
 }

 public String shortenWord( String inWord ) {
 inWord = inWord.toLowerCase();

 if (abbreviationsArray == null){ //If no custom abbreviaitons have been called, build the default array from the default text file.
 loadDefaultAbbreviations();
 }
 for(int x = 0; x < specialCharacters.length; x++){ //This check for special characters, however it does sort them at the moment.
 String removeThis = specialCharacters[x].replace("\\","");
 while(inWord.contains(removeThis)){
 inWord = inWord.replaceFirst(specialCharacters[x],"");
 tempSpecialCharacter[specialCounter] = specialCharacters[x].replace("\\","");
 specialCounter ++;
 }
 }

 for(int k = 0; k < abbreviationsArray.length; k++){
 boolean x = false;
 if (inWord.equals(abbreviationsArray[k][0])){
 editedWord = abbreviationsArray [k][1];
 x = true;
 if(x = true) break;
 }
 else{
 editedWord = inWord;
 }
 }

 for(int x = 0;x < tempSpecialCharacter.length; x++){
 if(tempSpecialCharacter[x] != null){
 editedWord += tempSpecialCharacter[x];
 }
 }
 return editedWord;
 }

 public String shortenMessage( String inMessage ) {
 String newString = "";
 String[] messageArray = inMessage.split(" ");
 for ( String word : messageArray) {
 newString += " ";
 newString += shortenWord(word);
 }
 return newString;
 }
}

ShortenerUtility.java

This is the command line application, pretty straight forward.

import java.io.File;

public class ShortenerUtility {
 private File inputFile = new File ("");
 private String shortenedMessage = "";

 public String ShortenerUtility(String inputLine){
 //inputFile = new File ("abbreviations1.txt"); //Uncomment this to check mutability.
 Shortener newShortenerInstance = new Shortener(inputFile);
 shortenedMessage = newShortenerInstance.shortenMessage(inputLine);
 return shortenedMessage;
 }
 public static void main(String[] args) {
 String toShortenString = "";
 for(int x = 0; x < args.length; x++){
 toShortenString += args[x];
 }
 ShortenerUtility newShortener = new ShortenerUtility();
 newShortener.ShortenerUtility(toShortenString);
 }

}

ShortenerFrame.java

This is the constructor for the GUI, where all the action happens when it comes to runtime. Java is supprsingly easy to work with GUIs compared to Python.

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import java.awt.GridLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.datatransfer.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.Toolkit;
import java.io.*;

public class ShortenerFrame extends JFrame implements ActionListener{

private static final int FRAME_WIDTH = 400;
 private static final int FRAME_HEIGHT = 260;

 private JPanel panel;
 private JLabel instructionLabel;
 private JTextArea inputArea;
 private JTextArea outputArea;
 private JButton shortenButton;
 private JButton copyButton;
 private JButton pasteButton;
 private ShortenerUtility newInstance = new ShortenerUtility();
 private Shortener newShortenerInstance = new Shortener();
 private String shortenedMessage = "";
 private String toShorten = "";
 private String fromClipboard = "";

 public ShortenerFrame() {
 super("Shortener Application");

setSize( FRAME_WIDTH, FRAME_HEIGHT );

 panel = new JPanel();
 GridLayout grid = new GridLayout( 0, 1 );
 panel.setLayout( grid );

 add( panel );

instructionLabel = new JLabel( "Enter text in the field below and click 'Shorten'" );
 panel.add( instructionLabel );

 inputArea = new JTextArea();
 panel.add( inputArea );
 inputArea.setLineWrap(true);
 inputArea.setWrapStyleWord(true);

 shortenButton = new JButton( "Shorten" );
 panel.add( shortenButton );

 outputArea = new JTextArea();
 panel.add( outputArea );
 outputArea.setLineWrap(true);
 outputArea.setWrapStyleWord(true);
 outputArea.setEditable(false);

 pasteButton = new JButton("Paste from system clipboard");
 panel.add(pasteButton);

 pasteButton.addActionListener(this);
 shortenButton.addActionListener(this);
 }

 public void actionPerformed( ActionEvent evt ) {
 if(evt.getSource().equals(shortenButton)){
 toShorten = inputArea.getText();
 if (!newShortenerInstance.getErrorMessage().equals("")){
 shortenedMessage = newShortenerInstance.getErrorMessage();
 }
 else{
 shortenedMessage = newInstance.ShortenerUtility(toShorten);
 }
 outputArea.setText( shortenedMessage );
 }
 else if(evt.getSource().equals(pasteButton)){
 try{
 Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
 fromClipboard = (String) c.getContents(null).getTransferData(DataFlavor.stringFlavor);
 }
 catch (Exception error) {
 inputArea.setText("Exception: " + error.getMessage());
 }
 finally{}
 inputArea.setText( fromClipboard );
 }
 }

}

ShortenerGUIApp.java

Simple new instance of the frame called by the main method.

import javax.swing.JFrame;

public class ShortenerGUIApp {
 public static void main( String[] args ) {
 JFrame frame = new ShortenerFrame();
 frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
 frame.setVisible( true );
 }
}

Tags: , ,

No Comments

25 Mar 2013Restoration of Panasonic SU-2700 Amplifier (also known as Technics SU Z1)

This beautiful little amp was bought off eBay a while ago now, I instantly took to it. It looks great, and surprisingly sounds great too!

I’ve never had any experience with any Panasonic / Technics amplifiers in the past, but I’m impressed with this one, offering upto and over 100w per channel at 8 ohms. It has excellent bass response, and a nice attention to detail.

This restoration was just replacing the main smoothing / reservoir capacitors initially, coupled with a good clean.

Well, for the moment this amplifier is put to the side as before it was re-capped there was some strange behaviour with odd voltages at the speaker terminals. This has got worse, now with the amplifier outputting 10V DC at each speaker terminal, after a quick look I can see some diodes are out, need to get a schematic to see what’s really going on…..

Tags: , ,

1 Comment