void MultipannerNode::strategyChanged() { int newStrategy = getProperty(Lav_PANNER_STRATEGY).getIntValue(); int newOutputSize=2; bool hookHrtf = false, hookAmplitude = false; switch(newStrategy) { case Lav_PANNING_STRATEGY_HRTF: hookHrtf = true; break; case Lav_PANNING_STRATEGY_STEREO: std::dynamic_pointer_cast<AmplitudePannerNode>(amplitude_panner)->configureStandardChannelMap(2); hookAmplitude = true; break; case Lav_PANNING_STRATEGY_SURROUND40: std::dynamic_pointer_cast<AmplitudePannerNode>(amplitude_panner)->configureStandardChannelMap(4); hookAmplitude = true; newOutputSize = 4; break; case Lav_PANNING_STRATEGY_SURROUND51: std::dynamic_pointer_cast<AmplitudePannerNode>(amplitude_panner)->configureStandardChannelMap(6); hookAmplitude = true; newOutputSize=6; break; case Lav_PANNING_STRATEGY_SURROUND71: std::dynamic_pointer_cast<AmplitudePannerNode>(amplitude_panner)->configureStandardChannelMap(8); hookAmplitude=true; newOutputSize=8; break; } if(hookAmplitude) { getOutputConnection(0)->reconfigure(0, newOutputSize); setOutputNode(amplitude_panner); current_panner = amplitude_panner; } if(hookHrtf) { getOutputConnection(0)->reconfigure(0, 2); setOutputNode(hrtf_panner); current_panner = hrtf_panner; } }
EnvironmentNode::EnvironmentNode(std::shared_ptr<Simulation> simulation, std::shared_ptr<HrtfData> hrtf): SubgraphNode(Lav_OBJTYPE_ENVIRONMENT_NODE, simulation) { this->hrtf = hrtf; int channels = getProperty(Lav_ENVIRONMENT_OUTPUT_CHANNELS).getIntValue(); output = createGainNode(simulation); output->resize(channels, channels); output->appendInputConnection(0, channels); output->appendOutputConnection(0, channels); appendOutputConnection(0, channels); setOutputNode(output); environment_info.world_to_listener_transform = glm::lookAt( glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, -1.0f), glm::vec3(0.0f, 1.0f, 0.0f)); }
PannerBankNode::PannerBankNode(std::shared_ptr<Simulation> sim, int pannerCount, std::shared_ptr<HrtfData> hrtf): SubgraphNode(Lav_OBJTYPE_PANNER_BANK_NODE, sim) { if(pannerCount < 2) ERROR(Lav_ERROR_RANGE, "Must use at least 2 panners."); input_gain = createGainNode(simulation); output_gain =createGainNode(simulation); input_gain->resize(pannerCount, pannerCount); for(int i = 0; i < pannerCount; i++) { input_gain->appendInputConnection(i, 1); input_gain->appendOutputConnection(i, 1); } output_gain->resize(2, 2); output_gain->appendInputConnection(0, 2); output_gain->appendOutputConnection(0, 2); setInputNode(input_gain); setOutputNode(output_gain); for(int i = 0; i < pannerCount; i++) { panners.push_back(createMultipannerNode(simulation, hrtf)); input_gain->connect(i, panners[i], 0); panners[i]->connect(0, output_gain, 0); } appendOutputConnection(0, 2); }
void NeuralNetwork::calculate() { // 中間層の計算 for(int m = 0; m < middle_nodes.size(); ++m) { Node middle = middle_nodes.at(m); middle.value = 0; vector<Edge> edges = getBeforeEdges(middle.id); for(int i = 0; i < input_nodes.size(); ++i) { Edge e = edges.at(i); middle.value += e.weight * input_nodes.at(i).value; } middle.value = sigmoid(middle.value); setMiddleNode(middle.id, middle.value); } // 出力層の計算 for(int o = 0; o < output_nodes.size(); ++o) { Node output = output_nodes.at(o); output.value = 0; vector<Edge> edges = getAfterEdges(output.id); for(int m = 0; m < middle_nodes.size(); ++m) { Edge e = edges.at(m); output.value += e.weight * middle_nodes.at(m).value; } output.value = sigmoid(output.value); setOutputNode(output.id, output.value); } }