function [nodes] = generateNodes(origNode_fname,newNode_pname,outfname)

if nargin < 3
    %outfname = 'NewOutputs\new_nodes.txt';
    outfname = [];
    if nargin < 2
        %source location for header files for all of the new nodes
        newNode_pname = 'C:\Users\wea\Documents\Arduino\libraries\OpenAudio_ArduinoLibrary\';
        if nargin < 2
            %location of original node text from original index.html
            origNode_fname = 'ParsedInputs\nodes.txt';
        end
    end
end


addpath('functions\');

%% read existing node file and get the nodes
orig_nodes = parseNodeFile(origNode_fname);

% keep just a subset of the nodes
% nodes_keep = {'AudioInputI2S','AudioInputUSB',...
%     'AudioOutputI2S','AudioOutputUSB',...
%     'AudioPlaySdWav',...
%     'AudioPlayQueue','AudioRecordQueue',...
%     'AudioSynthWaveformSine','AudioSynthWaveform','AudioSynthToneSweep',...
%     'AudioSynthNoiseWhite','AudioSynthNoisePink',...
%     'AudioAnalyzePeak','AudioAnalyzeRMS',...
%     'AudioControlSGTL5000'};
%
% nodes_keep = {'AudioInputUSB',...
%     'AudioOutputUSB',...
%     'AudioPlaySdWav',...
%     'AudioPlayQueue','AudioRecordQueue',...
%     'AudioAnalyzePeak','AudioAnalyzeRMS'};

nodes_keep = {
    'AudioControlSGTL5000',...
    'AudioInputUSB',...
    'AudioOutputUSB',...
    };

%adjust node shortnames
for Inode=1:length(orig_nodes)
    node = orig_nodes(Inode);
    if strcmpi(node.type,'AudioInputUSB');
        node.shortName = 'usbAudioIn';
    elseif strcmpi(node.type,'AudioOutputUSB');
        node.shortName = 'usbAudioOut';
    end
    orig_nodes(Inode)=node;
end

%adjust node icons
for Inode=1:length(orig_nodes)
    node = orig_nodes(Inode);
    if strcmpi(node.type,'AudioControlSGTL5000')
        node.icon = 'debug.png';
    end
    orig_nodes(Inode)=node;
end

%keep just these
nodes=[];
for Ikeep=1:length(nodes_keep)
    for Iorig=1:length(orig_nodes)
            node = orig_nodes(Iorig);
        if strcmpi(node.type,nodes_keep{Ikeep})
            if isempty(nodes)
                nodes = node;
            else
                nodes(end+1) = node;
            end
        end
    end
end

%% add in new nodes

%To build text for the new nodes, use buildNewNodes.m.
%Then paste into XLSX to edit as desired.
%Then load the XLSX via the command below
if (0)
    [num,txt,raw]=xlsread('myNodes.xlsx');
    headings = raw(1,:);
    new_node_data = raw(2:end,:);
else
    %get info directly from underlying classes
    %source_pname = 'C:\Users\wea\Documents\Arduino\libraries\OpenAudio_ArduinoLibrary\';
    [headings, new_node_data]=buildNewNodes(newNode_pname);
end

%build new node data elements
template = nodes(1);
new_nodes=[];
for Inode = 1:size(new_node_data,1)
    node = template;
    for Iheading = 1:length(headings)
        node.(headings{Iheading}) = new_node_data{Inode,Iheading};
    end
    
    if isempty(nodes)
        nodes = node;
    else
        nodes(end+1) = node;
    end
end
clear new_node_data

%remove some undesired nodes
remove_names = {'AudioControlSGTL5000_Extended'};
Ikeep = ones(size(nodes));
for Irem=1:length(remove_names)
    for Inode = 1:length(Ikeep)
        if strcmpi(nodes(Inode).type,remove_names{Irem})
            Ikeep(Inode)=0;
        end
    end
end
Ikeep = find(Ikeep);
nodes = nodes(Ikeep);

%% put some of the nodes into a particular desired order
first_second = {};
first_second(end+1,:) ={'tlv320aic3206' 'sgtl5000'};
first_second(end+1,:) ={'inputI2S' 'usbAudioIn'};
first_second(end+1,:) ={'outputI2S' 'usbAudioOut'};
first_second(end+1,:) ={'i2sAudioIn' 'usbAudioIn'};
first_second(end+1,:) ={'i2sAudioOut' 'usbAudioOut'};

for Iswap = 1:length(first_second);
    all_names = {nodes(:).shortName};
    I = find(strcmpi(all_names,first_second{Iswap,1}));
    J = find(strcmpi(all_names,first_second{Iswap,2}));
    if ~isempty(I) & ~isempty(J)
        first_node = nodes(I); second_node = nodes(J);
        nodes(min([I(1) J(1)])) = first_node;  %this comes first
        nodes(max([I(1) J(1)])) = second_node;  %this comes second
    end
end

%% write new nodes
if ~isempty(outfname)
    writeNodeText(nodes,outfname)
end