Giter Club home page Giter Club logo

sofatoolbox's People

Contributors

baumsource avatar david-ackermann avatar davircarvalho avatar f-brinkmann avatar felixperfler avatar germknoedlspeck avatar hagenw avatar isfmiho avatar paodoqueijo avatar petibub avatar whra avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

sofatoolbox's Issues

Clean up handling of Conventions

The conventions should be handled at a central place (maybe even in an extra repository, which would have the downside that a user would have to install two different software packages, which is not a good idea. Or we include also an automatic download of the Conventions.)

The following proposal uses only one repository for all things:

  1. Remove the current CDL folder.
  2. Replace it with a Conventions folder, which includes the up-to-date Convention definitions, maybe in the same format as it is currently stored in the conventions folder under API_MO
  3. API_MO and API_Cpp should then use the central Conventions folder as a source for getting the conventions information

MIT-Conversion fails

I'm using the "SOFAconvertMIT2SOFA" function to render a sofa object from the "full" folder with the IR saved in wav-files.
This works fine with the original "full folder" of the MIT but if I'm inserting my own IR into the folder structure I'm getting error messages.
Those differ slightly from case to case.

Case 1:
I replaced some IRs of the ones of the MIT with my own IRs (different length but same format, bit depth and sample rate).

Error Message:

Unable to perform assignment because the size of the left side is 1-by-1-by-449615 and the size of the right side is 1-by-512.

Error in SOFAconvertMIT2SOFA (line 49)
Obj.Data.IR(ii,idx(1),:) = audioread(fn)'; % data.IR must be [M R N]

Case 2:
I used just my own measured IRs. Those are the same files like in Case 1.

Error Message:

Error using audioread>readaudio (line 143)
The filename specified was not found in the MATLAB path.

Error in audioread (line 136)
[y, Fs] = readaudio (filename, range, datatype);

Error in SOFAconvertMIT2SOFA (line 49)
Obj.Data.IR(ii,idx(1),:) = audioread(fn)'; % data.IR must be [M R N]

Annotation: I used the right labeling of the files. The files of the MIT and mine are just differing in size and IR information and I don't see that the API is "interested" in the length or the frequency spectrum of my IRs.

It would really help if someone has got an explanation for those errors!
Please feel free to ask for more information, if you need any to help me on this.

I'm looking forward to your help!

Apparent elevation calculation might be broken

SOFAcalculateAPV calculated a wrong azimuth angle. I fixed it by disabling all the conversion to and back from horizontal-polar coordinate in order to calculate the apparent elevation.
This means the apparent elevation could be broken now and has to be checked again.

source missing for `sofa2json` test

the tests/s2j folder contains a number of binaries without source-code

  • sofa2json
  • libnetcdf_c++4.so.1.0.3

i'd suggest to:

  • remove all binaries
  • add the source of sofa2json
    • and build it when building libmysofa
  • drop the dependency on the no-longer-existing libnetcdfc++4 packge (to the docker image can be used without having to manually provide an outdated and unmaintained binary blob)

[help] demo_FreeFieldHRTF not working for different datasets

Hello,

I'm testing HRTF interpolation using the demo_FreeFieldHRTF script, and it works fine when using the thk dataset. However when I try it for the cipic dataset by replacing the line

IR=SOFAload('db://database/thk/HRIR_L2354.sofa');
with

IR=SOFAload('db://database/cipic/subject_003.sofa');

the intepolated magnitude spectra in the median plane doesn't resemble at all the reference plot. I did try using Lmax as the SH order, but no improvements - this might be a naive issue, but can you help me figure this out?

Load and Save .sofa files automaticly changes .sofa file ability to be recognized as a valid by steam Audio (Unity)

I need to create a HRIR that doesn't change the signal, but in the process of creating I ran into this problem:

When I load a .sofa file (from MIT) with SOFAload function and then save it again with SOFAsave the information that is there changes (regardless of level of compression I choose) - I can see by the size of the new file, and because Unity (specifically Steam Audio) can't read it, while before it could.

In attachment there is the original .sofa file from MIT and the file after being read and saved using the API (Matlab_edit sofa file). There is also a print of the code (which is pretty basic).

issue.zip

NETCDFsave does not recognize SourceUp and probably SourceView

When I try to save a file with the new convention which has SourceUp and SourceView in the .API.Dimensions it complains.
If I delete this two it saves them correctly.

Error using NETCDFsave
Error processing SourceUp
Error message: Unrecognized field name "SourceUp".

Error in SOFAsave (line 96)
NETCDFsave(filename,Obj,Compression);

Error in supdeq_helper (line 119)
SOFAsave(sprintf('KU100.sofa',FinalIRlength),Obj2,0);

SOFAcheckFilename fails with strings (instead of char)

SOFAcheckFilename('filename') works as expected. (although there is a problem with file names shorter than 7 characters due to the implmentation of checking for remote files ... this should be reworked as well.)

SOFAcheckFilename("filename") fails with "Filename must be a string.". This is due to strings and character vectors apparently being different things in Matlab. heavy eye rolling.

The function can be made work with strings in the following way. I didn't bother to make a PR (yet), since I don't know if you would want to make a proper rework of the function (i.e. not losing backwards compatibility towards Matlab versions before R2016b and being more error proof in general.

% filename = string?
if isstring(fn)
    fn = char(fn);
end
if ~ischar(fn)
    error('Filename must be a string.');
end

Failure during "SOFAsave"

Hallo,

I have troubles creating a sofa-file and would appriciate help on this.

The problem:
I have created an object with the function "SOFAconvertMIT2SOFA".
Now I want to safe this object as a sofa-file using the function "SOFAsave".
But everytime I try to do this I'm getting the following Error:

Dot indexing is not supported for variables of this type.

Error in SOFAsave (line 33)
ObjCheck = SOFAgetConventions(Obj.GLOBAL_SOFAConventions,'m');

My code:

>> sofa=SOFAconvertMIT2SOFA('C:\Users\felix\Desktop\SOFA API for Matlab and Octave 1.1.3\HRTFs\MIT KEMAR','normal');
>> SOFAsave('C:\Users\felix\Desktop\SOFA API for Matlab and Octave 1.1.3\HRTFs\MIT KEMAR\sofa.sofa','sofa')

Loading sofa file fails

Loading e.g. hrtf_ci1.sofa from ari (bte) fails:

 h = SOFAload('D:\temp\sofa\hrtf_ci1.sofa')
    file: 'C:\Program Files\MATLAB\R2018a\toolbox\matlab\imagesci\+netcdf\getVar.m'
    name: 'getVar'
    line: 136

    file: 'C:\Users\<user>\Documents\MATLAB\API_MO\netcdf\NETCDFload.m'
    name: 'NETCDFload'
    line: 104

    file: 'C:\Users\<user>\Documents\MATLAB\API_MO\SOFAload.m'
    name: 'SOFAload'
    line: 118

Error using SOFAload (line 123)
Error loading the file: D:\temp\sofa\hrtf_ci1.sofa

SOFAupdateDimensions yields error if EmitterDescription is defined

According to http://www.sofaconventions.org/mediawiki/index.php/MultiSpeakerBRIR, version 0.3 of MultiSpeakerBRIR uses SOFA 1.0 which reflects the standard AES69-2015. According to the AES Standard, "EmitterDescription", "ListenerDescription", ... are optional fields. However,

sofa = SOFAgetConventions('MultiSpeakerBRIR');
sofa.EmitterDescription = 'test';
SOFAupdateDimensions( sofa );

yields

Error using SOFAupdateDimensions (line 85)
EmitterDescription seems to be a user-defined variable without a dimension.

GeneralSOS convention missing

I noted that there is no GeneralSOS convention. It would be consistent to have it and fairly easy to generate, and it could easily be verified using sofar. Should we add it?

Implement SOFAresample

which would resample HRIRs/SRIRs to an other sampling rate and update the metadata accordingly.

Change license

As our API should be used by as many people as possible our current license is not really suitable.
If you are working on open source software, the biggest problem is that it is not compatible with GPL. If you are working in the industry, you are forced to use the same license for your product.

If we really want the latter I would propose to at least switch to a GPL compatible license, like GPL 2. Otherwise I would propose to switch to a more relax license, like the Apache 2.0 or BSD 3-clause, which is much shorter and easier to read.

SOFAplotHRTF - Octave compatiblity fix

Hello,

I use some of the features, primarily "SOFAplotHRTF" in the latest Octave 6.3 and there is an issue to get (Obj.SourcePosition_Type,'cartesian') support code to work.

The fix I use is replacing lines 131 and 132 from:
Obj.SourcePosition(ii,1)=rad2deg(Obj.SourcePosition(ii,1));
Obj.SourcePosition(ii,1)=npi2pi(Obj.SourcePosition(ii,1),'degrees'); % requires Mapping toolbox in Matlab
to
Obj.SourcePosition(ii,1)=npi2pi(Obj.SourcePosition(ii,1)); % https://github.com/alfoltranteam/octave-map/blob/master/src/npi2pi.m
Obj.SourcePosition(ii,1)=rad2deg(Obj.SourcePosition(ii,1));

npi2pi.m function may require Mapping toolbox, but there is an open source alternative from https://github.com/alfoltranteam/octave-map/blob/master/src/npi2pi.m which does not support 'degrees' mode. With this simple change the code should work both in Matlab and Octave irrespective of the Mapping toolbox.

Best Regrds,
Sergejs

SOFA v1.1.2 (branch v1) is incomplete compared to master

c09ffe2 and v1 was branched off the master version from May 4th. I suppose the included history.txt reflects the included changes over v1.1.1:
https://github.com/sofacoustics/API_MO/blob/c09ffe2247d93d758763faadac7c31b2925d8cb0/API_MO/history.txt#L15-L18

However, it is clear that some changes compared to the version in master seem to be missing:
https://github.com/sofacoustics/API_MO/blob/982faf5cd26cad552759b15c38422ec6fefaa5e6/API_MO/history.txt#L37-L41

The following commits seem to be related to v1.1.2, but I am not sure that is all of them:
569cee7
b78c969
cfc00aa
cfc00aa (maybe, something seems to have gone with this commit)

String support in Octave broken

Error in line 61 of demo_SOFAstrings: Comparison between Obj.Data.String1 and Obj2.Data.String1 fails. In Obj2, the strings are longer and end with a blank. This should not happen.

Listening to HRTF not working

I want to test a sofa file by listening to a test audio file through it.

For this I'm using the given code of the README.md. But I always get the following error:

Error using conv (line 28)
A and B must be vectors.

The code I used was the following:

>> apparentSourceVector(91, 1)
SOFAplotGeometry(hrtf, 91);
soundInput = audioread(wav);
soundOutput = [conv(squeeze(hrtf.Data.IR(91, 1, :)), soundInput) ...    
               conv(squeeze(hrtf.Data.IR(91, 2, :)), soundInput)];
sound(soundOutput, hrtf.Data.SamplingRate);

I tried several sofa-files, but this always comes up.

PS: If you've got any tips how I could test my file in a nother way, I'd be glad to get some input.

SOFAload: improve stability

Improve stability of function SOFAload, considering:

  • SOFAstart not executed yet
  • load binary files
  • load hidden files
  • load files starting with "~" or ".-", ...

[bug] SOFAconvertCIPIC2SOFA inverted channels

Hello,

I am playing around with the CIPIC dataset and noticed the results for the conversion with SOFAconvertCIPIC2SOFA.m results in HRIR for the ipsislateral ear having lower amplitude than the contralateral ear. The CIPIC HRTFs in sofaconventions.org also seem to have the same issue (assuming channel 1 is for left and 2 is for the right, as is described in all the other datasets).

Here is an example of such observation:

ir

The code used to plot the image above:

CIPIC = load([local '\hrir_final.mat']);
Obj=SOFAconvertCIPIC2SOFA(CIPIC);
idx = dsearchn(Obj.SourcePosition(:,[1,2]), [90, 0]);
ir = squeeze(Obj.Data.IR(idx,:,:));

plot(ir.')
legend('left', 'right')
title(['azim: ' num2str(Obj.SourcePosition(idx,1)),...
      '° elev: ' num2str(Obj.SourcePosition(idx,2)) '°']);

SOFAhrtf2dtf failing on HUTUBS data

Attempting to apply the function SOFAhrtf2dtf to data read from teh HUTUBS HRTF da fails, as the database apparently does not have does not have a field called "GLOBAL_Comment".
This may be solved by changing lie 137 from:
dtf.GLOBAL_Comment = [dtf.GLOBAL_Comment '. Directional transfer functions (DTFs) were generated by removing from the HRTFs the direction-independent log-amplitude spectrum for each ear.'];
to:
if isfield(dtf, 'GLOBAL_Comment')
dtf.GLOBAL_Comment = [dtf.GLOBAL_Comment '. Directional transfer functions (DTFs) were generated by removing from the HRTFs the direction-independent log-amplitude spectrum for each ear.'];
else
dtf.GLOBAL_Comment = 'Directional transfer functions (DTFs) were generated by removing from the HRTFs the direction-independent log-amplitude spectrum for each ear.';
end

Broken csv Conventions

The update of the csv-conventions contains errors. Here are the questions and issues in several cases the changes violate AES69:

GeneralFreeFieldDirectivity 1.0:

  • Data.Real: Dimensions must be mrn not MRN. Otherwise these dimensions are not defined.

GeneralFreeFieldDirectivity 1.1:

  • EmitterPosition: Dimensoins must be 'eC, eCM' not 'EC, ECM'. Otherwise these dimensions are not defined. Why was this field depend on E? The EmitterDescription has Dimensions 'IS, MS' This seems to be inconsistent
  • GLOBAL:EmitterDescriptions: I think so far we only have GLOBAL attributes but not GLOBAL variables. Do we want this? Is this intended by AES69 (Only GLOBAL attributes are mentiond so far)? Are global variables possible in NETCDF (Not sure, but I don't think so)? Why do we need it at all, we have already have the M-dependent EmitterDescription?

FreeFieldHRTF 1.0:

  • Data.Real must have Dimensions mrne instead of MRNE, otherwise these dimensions are not defined.

@petibub @isfmiho can we discuss future convention updates before pushing to master? sofar also uses the conventions files and pushing changes without any testing can break SOFAtoolbox and sofar.

encode table parameters with colors

encode parameters with colors in the tables of the conventions, consider inheritations, limitations, ... ?
any more ideas?

planned for SOFA 3.0

update copyright headers

  1. make sure that the order is authors --> boilerplate
  2. make sure that the correct function is in the header
  3. remove the year
  4. change the boilerplate from GPL to EUPL in files we have permission from the owner to change the license

Idea and implementation of General convention

  • The current General convention does not define the dimension E.
  • It is currently not general, e.g., Data_IR is restricted to be mrn but can not be mrne

I would suggest to drop the convention, because I do not see a clear way of defining it. This is why:

If the convention is general, the dimensions mrn must be allowed for Data_IR (or Data_Imag). In this case E must defined by another variable. The only chance I see would be EmitterPosition because all other variables referring to the emitter are optional. However the EmitterPosition can also be IC in which case E can not be defined and any toolbox validating the convention or SOFA files of that convention would crash.

Of course the dimension E could be specified by the user. But that would break the general idea of SOFA at least API_MO and sofar.

We would not loose much, if we removed General as long as we have General* with * referring to the data types FIR, FIR-E, TF, TF-E, and SOS (See #39).

SOFA file dosn't work in Decoder

I have created a sofa-file using the SOFAconvertMIT2SOFA function.
Now I want to use the rendered sofa-file with the IEM AdpativeBinauralDecoder (BETA) but the plugin gives me the following error:
" Weights generation failed. Error: Generic error. Failed to load HRTF."

Since other sofa-files work the problem probably is my generated file.

I'll paste my code bellow. I would be greatful, if someone could help me on this.

>> SOFAconvertMIT2SOFA('C:\Users\felix\Desktop\SOFA API for Matlab and Octave 1.1.3\HRTFs\MIT KEMAR','normal')

ans = 

  struct with fields:

               GLOBAL_Conventions: 'SOFA'
                   GLOBAL_Version: '1.0'
           GLOBAL_SOFAConventions: 'SimpleFreeFieldHRIR'
    GLOBAL_SOFAConventionsVersion: '1.0'
                   GLOBAL_APIName: 'ARI SOFA API for Matlab/Octave'
                GLOBAL_APIVersion: '1.1.3'
           GLOBAL_ApplicationName: ''
        GLOBAL_ApplicationVersion: ''
             GLOBAL_AuthorContact: ''
                   GLOBAL_Comment: ''
                  GLOBAL_DataType: 'FIR'
                   GLOBAL_History: 'Converted from the MIT format'
                   GLOBAL_License: 'No license provided, ask the author for permission'
              GLOBAL_Organization: ''
                GLOBAL_References: ''
                  GLOBAL_RoomType: 'free field'
                    GLOBAL_Origin: ''
               GLOBAL_DateCreated: '1999-11-16 20:01:52'
              GLOBAL_DateModified: ''
                     GLOBAL_Title: ''
                 ListenerPosition: [0 0 0]
                              API: [1×1 struct]
            ListenerPosition_Type: 'cartesian'
           ListenerPosition_Units: 'metre'
                 ReceiverPosition: [2×3 double]
            ReceiverPosition_Type: 'cartesian'
           ReceiverPosition_Units: 'metre'
                   SourcePosition: [710×3 double]
              SourcePosition_Type: 'spherical'
             SourcePosition_Units: 'degree, degree, metre'
                  EmitterPosition: [0 0 0]
             EmitterPosition_Type: 'cartesian'
            EmitterPosition_Units: 'metre'
              GLOBAL_DatabaseName: ''
         GLOBAL_ListenerShortName: 'KEMAR, normal pinna'
                       ListenerUp: [0 0 1]
                     ListenerView: [1 0 0]
                ListenerView_Type: 'cartesian'
               ListenerView_Units: 'metre'
                             Data: [1×1 struct]

>> OBJ=ans

OBJ = 

  struct with fields:

               GLOBAL_Conventions: 'SOFA'
                   GLOBAL_Version: '1.0'
           GLOBAL_SOFAConventions: 'SimpleFreeFieldHRIR'
    GLOBAL_SOFAConventionsVersion: '1.0'
                   GLOBAL_APIName: 'ARI SOFA API for Matlab/Octave'
                GLOBAL_APIVersion: '1.1.3'
           GLOBAL_ApplicationName: ''
        GLOBAL_ApplicationVersion: ''
             GLOBAL_AuthorContact: ''
                   GLOBAL_Comment: ''
                  GLOBAL_DataType: 'FIR'
                   GLOBAL_History: 'Converted from the MIT format'
                   GLOBAL_License: 'No license provided, ask the author for permission'
              GLOBAL_Organization: ''
                GLOBAL_References: ''
                  GLOBAL_RoomType: 'free field'
                    GLOBAL_Origin: ''
               GLOBAL_DateCreated: '1999-11-16 20:01:52'
              GLOBAL_DateModified: ''
                     GLOBAL_Title: ''
                 ListenerPosition: [0 0 0]
                              API: [1×1 struct]
            ListenerPosition_Type: 'cartesian'
           ListenerPosition_Units: 'metre'
                 ReceiverPosition: [2×3 double]
            ReceiverPosition_Type: 'cartesian'
           ReceiverPosition_Units: 'metre'
                   SourcePosition: [710×3 double]
              SourcePosition_Type: 'spherical'
             SourcePosition_Units: 'degree, degree, metre'
                  EmitterPosition: [0 0 0]
             EmitterPosition_Type: 'cartesian'
            EmitterPosition_Units: 'metre'
              GLOBAL_DatabaseName: ''
         GLOBAL_ListenerShortName: 'KEMAR, normal pinna'
                       ListenerUp: [0 0 1]
                     ListenerView: [1 0 0]
                ListenerView_Type: 'cartesian'
               ListenerView_Units: 'metre'
                             Data: [1×1 struct]

>> SOFAsave('C:\Users\felix\Desktop\SOFA API for Matlab and Octave 1.1.3\HRTFs\MIT KEMAR\heureka.sofa',OBJ)

ans = 

  struct with fields:

               GLOBAL_Conventions: 'SOFA'
                   GLOBAL_Version: '1.0'
           GLOBAL_SOFAConventions: 'SimpleFreeFieldHRIR'
    GLOBAL_SOFAConventionsVersion: '1.0'
                   GLOBAL_APIName: 'ARI SOFA API for Matlab/Octave'
                GLOBAL_APIVersion: '1.1.3'
           GLOBAL_ApplicationName: ''
        GLOBAL_ApplicationVersion: ''
             GLOBAL_AuthorContact: ''
                   GLOBAL_Comment: ''
                  GLOBAL_DataType: 'FIR'
                   GLOBAL_History: 'Converted from the MIT format'
                   GLOBAL_License: 'No license provided, ask the author for permission'
              GLOBAL_Organization: ''
                GLOBAL_References: ''
                  GLOBAL_RoomType: 'free field'
                    GLOBAL_Origin: ''
               GLOBAL_DateCreated: '1999-11-16 20:01:52'
              GLOBAL_DateModified: '2021-09-02 11:36:24'
                     GLOBAL_Title: ''
                 ListenerPosition: [0 0 0]
                              API: [1×1 struct]
            ListenerPosition_Type: 'cartesian'
           ListenerPosition_Units: 'metre'
                 ReceiverPosition: [2×3 double]
            ReceiverPosition_Type: 'cartesian'
           ReceiverPosition_Units: 'metre'
                   SourcePosition: [710×3 double]
              SourcePosition_Type: 'spherical'
             SourcePosition_Units: 'degree, degree, metre'
                  EmitterPosition: [0 0 0]
             EmitterPosition_Type: 'cartesian'
            EmitterPosition_Units: 'metre'
              GLOBAL_DatabaseName: ''
         GLOBAL_ListenerShortName: 'KEMAR, normal pinna'
                       ListenerUp: [0 0 1]
                     ListenerView: [1 0 0]
                ListenerView_Type: 'cartesian'
               ListenerView_Units: 'metre'
                             Data: [1×1 struct]

>>  

Loading of SOFA file fails

Hi,

I am having some issues, loading a SOFA file, that I have created myself, using python-sofa 0.2.0 attached in a zip archive.
I can load the file in Python, but using SOFA API for Matlab and Octave 1.0.4 throws an error, when I try to do the same.
I cannot exclude the possibility that the SOFA file itself is malformed, but the nature of the error puzzles me.
When trying to read the SOFA file in Matlab (R2018b), I see that while reading the attribute "ListenerPosition", "Type' holding the value 'cartesian', the function getAtt.m throws an error because the command in line 51:
xtype = netcdflib('inqAtt',ncid,varid,attname);
returns xtype = 12, and the subsequent switch case tests for integer values in the closed range [1:11].
As a result, the function is unable to return a valid funcstr, and instead it returns an error.

The error appears to me to be somewhat similar to the errors reported in the now closed issue 16

The attached testfile is based on another file, and comparing the properties for the Listener.Position.Type in Python shows that they are the same for the original file and for the decimate one, I have generated in Python.

Is there any simple tests/verifications that I can do to shed some more light on this issue?

Br,
Jacob Riiser

Converting from the "GeneralTF" convention to "SimpleFreeFieldHRIR" convention

Hi,

I used the Mesh2HRTF project for calculating HRTFs. It uses the SOFA matlab api to save the sofa file. But it uses the "GeneralTF" convention. The authors of Mesh2HRTF claimed in their paper on page 5 that the SOFA-API provides scripts for the conversion from the ‘General-TF’-Convention to the ‘SimpleFreeField-HRIR’-Convention. However, I am unable to locate such a script.

I am very new to the field and so would highly appreciate if you could help me with this conversion.

Regards,
Akshat Jain

Repair SOFAstart

SOFAstart does not restart, when executed again (in order to speed-up the execution). But, sometimes, it does not start, even on the first start of the Toolbox. This throws an error, especially when the conventions need to be compiled.
Improve the behavior of SOFAstart.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.