Create VST plug-ins [closed] - plugins

Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.
We don’t allow questions seeking recommendations for books, tools, software libraries, and more. You can edit the question so it can be answered with facts and citations.
Closed 1 year ago.
Improve this question
I want to create a third-party plug-in for Serato (a software for DJs).
I searched in their site and I saw that Serato supports VST (VST2) plug-ins. So my question now is what should I read in order to create a VST plug-in?
Thank you in advance.

A good starting point would be the wikipedia site for VSTs, just to get the basics if you are not familiar with this technology, first you need to know the creators of the VSTs: Steinberg.
VST SDK is a set of C++ classes based around an underlying C API. The
SDK can be downloaded from their website.
Therefore I would recommend starting with something simple. Let’s review a few options:
JUCE
This technology is trending for a few reasons, like their homepage says:
With support for PC, Mac and Linux, JUCE is the perfect tool for
building powerful and complex applications. JUCE also supports the
development of plug-ins: VST, AU and AAX. Run your desktop
applications on mobile! One-click deployment to Android and iOS
(requires Android Studio and XCode) Adjust the user interface of your
application with the Projucer live coding engine Use the best audio
performance available on iOS and Android.
So the pros of this technology are the big community, multi-platform and that is free, at least for non-commercial developments (then if you want to sell it you have to pay). The cons would be that you need to have a little more than the basics of C++ to get started, fortunately there are a lot of tutorials on their page, youtube and the internet, the community is growing so if you have issues you can always ask.
SynthEdit and FL SynthMaker
If you don’t want to get into the code that fast you can start practicing with these, as they don’t require programming expertise, or only a few basics.
SynthEdit is a framework and a visual circuit design that allows you
to create your own synths with only drag & drop without programming.
Therefore giving you the flexibility of using your DSP algorithms
inside the modules.
This is cool if you want to start going quickly, this currently has a cost you can check on their official website.
FL SynthMaker, aka Flowstone, comes free with FL studio. It has a straightforward drag-and-drop graphical interface and a wide range of components. You can use it to code modules and DSP in Ruby and comes with loads of examples to get started quickly and its capacity to assist you in creating a prototype within a short time is a plus.
FLowstone is a programming application that is used to create virtual
instruments effects and computer control of external hardware without
the need to write basic code. The instruments and effects you create
in SynthMaker can be used in FL Studio as 'native' plugins and shared
with other FLowstone users.
MAX MSP
Max, also known as Max/MSP/Jitter, is a visual programming language for music and multimedia developed and maintained by San Francisco-based software company Cycling '74. Over its more than thirty-year history, composers, performers, software designers, researchers, and artists have used it to create recordings, performances, and installations.
The Max program is modular, with most routines existing as shared
libraries. An application programming interface (API) allows
third-party development of new routines (named external objects).
Thus, Max has a large user base of programmers unaffiliated with
Cycling '74 who enhance the software with commercial and
non-commercial extensions to the program. Because of this extensible
design, which simultaneously represents both the program's structure
and its graphical user interface (GUI), Max has been described as the
lingua franca for developing interactive music performance software.
SOUL
The SOUL project is creating a new language and infrastructure for
writing and deploying audio code. It aims to unlock improvements in
latency, performance, portability and ease-of-development that aren't
possible with the current mainstream techniques that are being used.
SOUL unlocks native-level speed, even when hosted from slower, safer
languages. The SOUL language makes audio coding more accessible and
less error-prone, enhancing productivity for both beginners and expert
professionals.
Maximilian
Is a cross-platform and multi-target audio synthesis and signal processing library. It was written in C++ and provides bindings to Javascript. It's compatible with native implementations for MacOS, Windows, Linux and iOS systems, and client-side browser-based applications. The main features are:
sample playback, recording and looping
support for WAV and OGG files.
a selection of oscillators and filters enveloping
multichannel mixing for 1, 2, 4 and 8 channel setups controller
mapping functions
effects including delay, distortion, chorus, flanging granular
synthesis, including time and pitch stretching atom synthesis
real-time music information retrieval functions: spectrum analysis,
spectral features, octave analysis, Bark scale analysis, and MFCCs
example projects for Windows and MacOS, using command line and
OpenFrameworks environments
example projects for Firefox and Chromium-based browsers using the
Web Audio API ScriptProcessorNode (deprecated!)
example projects for Chromium-based browsers using the Web Audio API
AudioWorklet (e.g. Chrome, Brave, Edge, Opera, Vivaldi)
Extras
A few months ago I found this community that is focused on audio programming. They also have a Youtube channel with hundreds of tutorials and a discord server where you can ask questions, and even show your projects or even get a job. If you are interested. It’s called the “The audio Programmer”
Hope this helps you get started. I know there are a lot of option out there and this might confuse you at the beginning but I hope this little guide helps you choose a good starting point depending on your needs and goals since every technology offers different things.

Related

Should I use jMonkeyEngine 3 (jME 3) or Unity 4.3 to teach game programming to my children? [closed]

Closed. This question is opinion-based. It is not currently accepting answers.
Want to improve this question? Update the question so it can be answered with facts and citations by editing this post.
Closed 9 years ago.
Improve this question
I'm looking to teach my kids programming, and it looks like I've narrowed it to two options:
jMonkeyEngine 3 (jME 3)
Unity 4.3
I couldn't find any "current" comparisons, and so I thought I'd ask:
Which is better jME3+ or Unity4.3+ for Teaching Programming vs Engine Benefits?
I'm not a game developer, but as a corporate & control systems developer I have experience in both C# and Java.
I'm currently leaning towards Unity4.3+ because:
From a Programming perspective, I think C# is a little cleaner than Java, though this means little if the Engine Coding & Object model encourage poor programming
Engine Benefits: Unity4.3+ will "supposedly" have upcoming support for both XBox One & PS4
Note: in fairness to jME, I will make note of this "pre-alpha state" iOS option for jME which is better than a marketing "supposed" perhaps: (http://hub.jmonkeyengine.org/wiki/doku.php/jme3:ios)
If they are equal in all other regards, which one has better Service integration?
Glad that you interesting in JME3.
I’m also working for a project that target making education programs (youngs and adults) in gaming enviroment.
If you going to let your children learn programming via game developing, it’s a good idea. But both JME3 and Unity are far more complicated to start with ( I assume your children are still young )… There are also few projects suitable for children to learn programming visually.
Greenfoot ww.java.com/en/java_in_action/alice.jsp
Alice ww.greenfoot.org/door
Kojo ww.kogics.net/sf:kojo
Those things (languages come with IDEs) have short learning curve and easy to get with, require minimum knowledge and suitable for children and starter. That’s the education side.
For the engine side. [This is my personal opinion]
I prefered JME.
I’m also left Unity ( did about 4-5 commercial games in unity my self) to go to JME. Before Unity, i also worked in Ogre, UDK, Torque and a lot other engines ( 10 more). I also worked with commercial engine in daytime job in C++, which code dirty as hell but run extremely smooth and cost millions dollar.
The reason is: Those engine tied you up with its limitation and pre-made sollutions. Of course that’s also half of the reason why you choose and engine at first. But when you hit that limitation, for example the license fee or the closed technologies. You will hate them as much as i did.
So that’s why i come to JME in a search of “complete” game developing and entertaining technology.
If you are an experienced Java and C#, in association with JME and Unity developer, i will name you a few things that can be *strong text*compared between the two:
License : free open source vs free / commercial
IDEs : Netbean – an open and extensible platform ( leading quality) vs MonoEdit (the most buggy IDE you can find on earth)
** The based technolgy:**
Graphics: OpenGL v2+ vs Modified renderer ( openGL compatiable v3+) Unity win in this one i suppose :( . It’s sad for a long term java developer like me seeing this. But we can improve the graphics from time to time i hope.
Data management: You choose ( H2, HyperTable, Neo4j …from Java world 100+ of those) VS Unity database
Data oganization: You choose (ES, OO, COD, data driven …) VS ES and data driven only.
Networks: You choose ( Java rocks in this one) VS Unity network ( high performance but never… ever defeat Java)
Cloud and distributed: You choose (Storm, Hadoop..) VS home grown "cloud techs”
Note that i still usually using Unity and JME3 at the same time, for my job and for my hobby. I used Unity 4 with fancy mecanim animation, sub stance material … at day, and using JME3 for research and improve it at night. IMO, JME3 is the game engine which worth to learn, and it will rocks and shine in the future!!!
Hope this help!
It's hard to make a comparison when I have never actually used Unity. I have seen demo's and it's interface however. But having used the jMonkeyengine for about 2 and a half years, I can say I am a happy customer :).
Unity probably has a bit more of everything: developers, users, bells and whistles, but there is a cost associated to that.
Similarities between the 2:
- Big communities (Unity is bigger)
- Many free tutorials
- Rapid development (here's a link to a couple ludum dares I've been involved with using jME http://www.ludumdare.com/compo/ludum-dare-28/comment-page-3/?action=preview&uid=16152, http://www.ludumdare.com/compo/ludum-dare-24/comment-page-1/?action=preview&uid=16152)
- Easy to distribute to Windows/Mac/Linux/Android
The jMonkeyEngine is completely free and all open source (New BSD License). So you can see all the inner workings of the engine, and even change it if you do not like something (of course you are welcome to commit the changes back :)). So you will learn a lot more by delving into the jME source code.
C# and Java is a debate that can go on for ages, but I don't think it should be a defining factor, they are very similar in nature. There doesn't exist a usable iOS version in jME, and I don't think there is any immediate plans for Xbox One and PS4, so Unity will win there.
JME is a bit more hardcore engine than Unity.
JME:
- strong community (english language mostly)
- OpenSource and free to use.
- has many cool tools. But Unity has much more i guess.
- Simple to compile and code with all platforms.
- Supports Linux. You can develop games in Linux OS.
Unity:
- Strong community (with many local communities and languages)
- Non free. But it has professional tools.
- Has javascript support. You can add scripts inside of the editor.
- Has really cool world editor. But coding is better in JME SDK.
I use JME. But it's hardcore in many cases.
It really depends on what you aim for.
The pro on unity is especially way to get assets into the engine (via the shop).
With jme3 you need to be able to at least partly work with blender/3dsmax or similar. Or use a graphic style where it does not matter (eg 2d or blockworld)
Also it has better state of the art features in terms of lighting and shadowing.
But you kinda need to pro license sooner or later, as even basic stuff as lod is tied to it
http://unity3d.com/unity/licenses and it is not that cheap.
The pro with jme3 is that it does not limit you. It is only a core engine but also not tailored for some use-cases.
As far as I understand Unity uses a kinda Entity-component system but without separate systems. (The components contain the logic)
In jme3 you are free to use whatever you want, and are encouraged to make a clean split between logic and graphic. You are free to use whatever programming type you prefer (eg ES,OO) As jme is jvm based you also have access to other jvm languages, eg for functional programming via scala.
So it depends on what your target(and budget) is, more about developing and their specifics, or more about making a own game.
Regarding the version controll,
JME3 works fine with git and svn and kind everything else. As there are no special files or logic tied to any of them.
I can't say I've ever used Unity but here are some things I love about JME3:
Completely free & open-source under BSD license
Awesome SDK based on awesome NetBeans
Deployment to Linux, Mac & Android (as well as windows) with 1 click, I have no idea if Unity can do this
Amazing active community, constantly creating new plugins and features (IOS deployment coming soon, possibly), they will also help you with any trouble you run into
Networking is awesome
Can use other Java libraries or features alongside
As far as features of the engine go, Unity probably has more. However, I highly recommend JME, it is a great engine. Somebody else said you need knowledge of blender, whereas with Unity they have an asset shop. While Blender knowledge is (very) useful, there are hundreds of websites online that sell or give away for free assets (for instance www.turbosquid.com).
I have to ask, is whomever you're teaching actually ready to program for a game engine?
If the first thing that has to be taught is a hello world script followed by learning what variables are, then both options do nothing but over-complicate what needs to be a simple learning environment.
Even if they have the basics of programming down, they should know what the basics of game programming are. They should know what a vector is and how matrix math works with some underlying understanding of how an engine operates.
I don't know about jME, but with Unity, this would be the point where they could actually write code that does something in which they can earnestly say they understand why (which should be the most important part of teaching someone). I describe Unity as the simplest, big boy toy out there. That still means they have to be ready for the big boy toys in the first place.
Oh, and stick with the free version of Unity. Most pro features are graphical elements like bloom lighting that don't effect a programmer's capabilities.

Best IDE for PLC ladder programming [closed]

Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.
Questions asking us to recommend or find a tool, library or favorite off-site resource are off-topic for Stack Overflow as they tend to attract opinionated answers and spam. Instead, describe the problem and what has been done so far to solve it.
Closed 8 years ago.
Improve this question
Recently I trying to learn Ladder Logic programming for PLCs, but I want to know if there is any IDE to create Ladder programs better that Step7 or cx-programmer? Is there any plugin for Visual Studio or Netbeans that I can use? Finally, is it better to work with PLCs under Linux or Microsoft Windows?
UPDATE 1 : After googling about this, I found out that Ladder programming is not depend on the PLC brand or its model, so I did not mentioned any brand in my question.
What is your goal? In almost all cases, your IDE is dictated by the PLC manufacturer, and your PLC brand is spec'd by the customer when they buy the machine. They spec the PLC because they need to have something that they can go online with for maintenance and troubleshooting. Since the software is proprietary and absurdly expensive, they don't want to get a new software license for every machine in the plant and have to relearn new software, while they are bleeding money of manufacturing downtime.
So if your goal is to enter the industry, you want to find out what plants in country tend to use. In North America it's usually Allen-Bradley a.k.a Rockwell Automation, which is programmed with RSLogix 5000 (edit: the recent versions of RSLogix 5000 have been rebranded as Studio 5000). In Europe, it's typically Seimens, but I have no experience with them.
PLC IDEs are almost always picked hardware first. With some obscure exceptions, you pick the hardware you want to run, and this determines the IDE. The IDEs are all proprietary and unique to each hardware platform. Rockwell Automation alone has three different IDEs to support their hardware lines, all licensed individually and very expensive.
If Omron is the most common in your area, it's a good idea to start with them. Once you get used to one type of PLC, learning more is really easy.
If you don't mind which PLC platform you're using, I really enjoyed my time with RSLogix. They have a free, training-level suite available here:
http://www.ab.com/linked/programmablecontrol/plc/micrologix/downloads.html
I prefer RSLogix 5000. It's one of the easiest to work with and has User Defined Types and Add On Instructions to help with reusability.
ABB has Control Builder (which is the product that I work on), AFAIK when somebody buys our AC800 controller they get the CB for free, at least the so called "Compact version" which is file based. The CB has ladder diagrams as well as all other 1131 languages plus some extensions like Function Diagrams.
Disclaimer Sorry if it sounded like an ad, just very passionate with what I work on.
I am primarily a high level language programmer, but have also done development on various PLC /PAC platforms, including Rockwell, Siemens, and Beckhoff.
If your goal is to merely get an introduction to ladder, nearly anything will due. You can download Beckhoffs TwinCAT software for free. It is only a 30-day license, but you can just continually reinstall every 30 days without issue. The great part of TwinCAT is that it runs on a Windows PC, so you can develop and test code directly on the PC and don't need actual Beckhoff hardware to play with. The ladder is a bit quirky, but the statement list portion is by far one of the more powerful. If you are a C-programmer you will feel very comfortable with Beckhoff, because they have duplicated a lot of C-like functions (e.g. memcpy and setcpy) into their libraries.
The Beckhoff platform is not all that widespread, but it would allow you to learn the principals of ladder and PLC/PAC programming.

What's the difference between an "engine" and a "framework"? [closed]

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 5 years ago.
Improve this question
I've heard these terms used seemingly interchangeably, so I'm a little unclear. Please cite examples.
These terms, and others, do seem very similar. They're named from a conceptual standpoint, and so could be defined as follows:
A "framework" is a "foundation" or "support structure" around which you build your actual application. The .NET Framework includes not only a foundation (the CLR) but a series of libraries that provide standardized functionality that you would otherwise have to implement yourself. Other frameworks or foundations provide more specific areas of support, such as in UI, data storage, client-server interaction, etc. Frameworks provide a relatively static, generic structure on and in which you build something specific and unique.
An "engine" is a self-contained, but externally-controllable, piece of code that encapsulates powerful logic designed to perform a specific type of work. Engines exist to do "heavy lifting", where you instruct it to perform some complex, abstract task, and it handles the specifics in a relatively efficient manner without further external guidance. SQL implementations, and other services that perform searching, are typically called "engines". There are also physics engines, graphics engines, etc., which all have in common the idea that you tell it "do this" in some generic manner, and it handles the details.
A framework is something like a set of libraries that are meant to be able to work together. It's meant so you don't need to go around implementing common algorithms, and data structures. You use those libraries (the framework) to arrange them in a way so the functionality they provide helps you solve a problem.
An engine is a system, you feed it with data and it does it's job.
It's worth noting that a library can have an "engine" and an engine can be built using a framework.
A framework is mostly a bunch of component interfaces, but it does not implement those components. The framework does implement some glue code to help tie the framework together, and it provides some utility implementation for things that you’re likely to need.
A game engine implements all of the components defined in the framework… or at least all of the components that the game engine developer feels is required in order to implement his game engine. In some cases, an engine might not need physics or networking, etc, and so the game engine developer may choose to leave these components out of his engine.
Source: Frameworks vs Engines.
AFAIK a framework is the structure on which you build your applications. It differs from libraries in that it has inversion of control (i.e. in libraries, you call a subroutine from your code and so you have control; but in frameworks, you bind your subroutines to the framework and it calls your subroutine as and when needed - so the control is with the framework).
An engine is a totally different concept - it's a hybrid between a framework and a library. Like a framework, it has control over the application. However unlike a framework, you don't bind your subroutines to the engine but use its built in API to perform certain tasks (which is like a library).
In summary, a framework is the structure of the application which you can extend and tailor by binding your subroutines to it. OTOH, an engine is the main application itself which you can simply instruct to do what you want it to, using its public API.
Thus, frameworks are more flexible. However, an engine is a working application - so it gets the job done faster because the programmer doesn't need to waste time re-inventing the wheel. He can simply instruct the engine what to do and the engine will handle the internal operations.
An engine "does" the job for you.
A simple multiplication program.
A framework "simplifies" the job for you.
Instead of writing code for converting string to int and then presenting to engine, you have another code which converts it for you. This simplification code is a framework.
Framework examples:
PureMVC (Flash)
Spring (Java)
Engine examples:
Gecko
Google Search
A survey of different types of each gives a clue...
Engines
Search engine, an information-retrieval system designed to find information on a computer system
Game engine, the core software component of a computer or video game
Layout engine, software that formats web content for display on a screen
Rendering engine, software or hardware which converts specifications for images into pixels
Ray-tracing engine, software which renders a scene by tracing simulated rays of light
Polymorphic engine or mutation engine, an early conceptual or mechanical calculating device
Difference engine, a mechanical calculator designed to tabulate polynomial functions
Analytical engine, a concept for a computer, designed by Charles Babbage
Frameworks
Artistic drawing, music composition, and mechanical CAD
Compilers for different programming languages and target machines.
Financial modeling applications
Earth system modeling applications
Decision support systems
Media playback and authoring
Web applications
Middleware

How to code sharing between Android and iOS

I'm moving away from strict Android development and wanting to create iPhone applications. My understanding is that I can code the backend of iOS applications in C/C++ and also that I can use the NDK to include C/C++ code in Android apps. My question however is how? I've googled quite a bit and I can't find any clear and concise answers.
When looking at sample code for the NDK, it seems that all the function names etc. are Android (or at least Java) specific and so I would not be able to use this C/C++ backend to develop an iPhone frontend?
I'd appreciate some clarification on this issue and if at all available some code to help me out? (even just a simple Hello World that reads a string from a C/C++ file and displays it in an iOS and Android app).
Thanks guys
Chris
Note that I almost exclusively work on "business/utility/productivity" applications; things that rely heavily on fairly standard UI elements and expect to integrate well with their platform. This answer reflects that. See Mitch Lindgren's comment to Shaggy Frog's answer for good comments for game developers, who have a completely different situation.
I believe #Shaggy Frog is incorrect here. If you have effective, tested code in C++, there is no reason not to share it between Android and iPhone, and I've worked on projects that do just that and it can be very successful. There are dangers that should be avoided, however.
Most critically, be careful of "lowest common denominator." Self-contained, algorithmic code, shares very well. Complex frameworks that manage threads, talk on the network, or otherwise interact with the OS are more challenging to do in a way that doesn't force you to break the paradigms of the platform and shoot for the LCD that works equally badly on all platforms. In particular, I recommend writing your networking code using the platform's frameworks. This often requires a "sandwich" approach where the top layer is platform-specific and the very bottom layer is platform-specific, and the middle is portable. This is a very good thing if designed carefully.
Thread management and timers should also be done using the platform's frameworks. In particular, Java uses threads heavily, while iOS typically relies on its runloop to avoid threads. When iOS does use threads, GCD is strongly preferred. Again, the solution here is to isolate the truly portable algorithms, and let platform-specific code manage how it gets called.
If you have a complex, existing framework that is heavily threaded and has a lot of network or UI code spread throughout it, then sharing it may be difficult, but my recommendation still would be to look for ways to refactor it rather than rewrite it.
As an iOS and Mac developer who works extensively with cross-platform code shared on Linux, Windows and Android, I can say that Android is by far the most annoying of the platforms to share with (Windows used to hold this distinction, but Android blew it away). Android has had the most cases where it is not wise to share code. But there are still many opportunities for code reuse and they should be pursued.
While the sentiment is sound (you are following the policy of Don't Repeat Yourself), it's only pragmatic if what you can share that code in an efficient manner. In this case, it's not really possible to have a "write once" approach to cross-platform development where the code for two platforms needs to be written in different languages (C/C++/Obj-C on iPhone, Java for Android).
You'll be better off writing two different codebases in this case (in two different languages). Word of advice: don't write your Java code like it's C++, or your C++ code like it's Java. I worked at a company a number of years ago who had a product they "ported" from Java to C++, and they didn't write the C++ code like it was C++, and it caused all sorts of problems, not to mention being hard to read.
Writing a shared code base is really practical in this situation. There is some overhead to setting up and keeping it organized, but the major benefits are these 1) reduce the amount of code by sharing common functionality 2) Sharing bug fixes to the common code base. I'm currently aware of two routes that I'm considering for a project - use the native c/c++ (gains in speed at the expense of losing garbage collection and setting targets per processor) or use monodroid/monotouch which provide c# bindings for each os's platform functionality (I'm uncertain of how mature this is.)
If I was writing a game using 3d I'd definitely use approach #1.
I posted this same answer to a similar question but I think it's relevant so...
I use BatteryTech for my platform-abstraction stuff and my project structure looks like this:
On my PC:
gamename - contains just the common code
gamename-android - holds mostly BatteryTech's android-specific code and Android config, builders point to gamename project for common code
gamename-win32 - Just for building out to Windows, uses code from gamename project
On my Mac:
gamename - contains just the common code
gamename-ios - The iPhone/iPad build, imports common code
gamename-osx - The OSX native build. imports common code.
And I use SVN to share between my PC and Mac. My only real problems are when I add classes to the common codebase in Windows and then update on the mac to pull them down from SVN. XCode doesn't have a way to automatically add them to the project without scripts, so I have to pull them in manually each time, which is a pain but isn't the end of the world.
All of this stuff comes with BatteryTech so it's easy to figure out once you get it.
Besides using C/C++ share so lib.
If to develop cross-platform apps like game, suggest use mono-based framework like Unity3D.
Else if to develop business apps which require native UI and want to share business logic code cross mobile platforms, I suggest use Lua embedded engine as client business logic center.
The client UI is still native and get best UI performance. i.e Java on Android and ObjectC on iOS etc.
The logic is shared with same Lua scripts for all platform.
So the Lua layer is similar as client services (compare to server side services).
-- Anderson Mao, 2013-03-28
Though I don't use these myself as most of the stuff I write won't port well, I would recommend using something like Appcelerator or Red Foundry to build basic applications that can then be created natively on either platform. In these cases, you're not writing objective-c or java, you use some kind of intermediary. Note that if you move outside the box they've confined you to, you'll need to write your own code closer to the metal.

What are some resources for getting started in operating system development? [closed]

Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.
Questions asking us to recommend or find a tool, library or favorite off-site resource are off-topic for Stack Overflow as they tend to attract opinionated answers and spam. Instead, describe the problem and what has been done so far to solve it.
Closed 8 years ago.
Improve this question
One thing I've always wanted to do is develop my very own operating system (not necessarily fancy like Linux or Windows, but better than a simple boot loader which I've already done).
I'm having a hard time finding resources/guides that take you past writing a simple "Hello World" OS.
I know lots of people will probably recommend I look at Linux or BSD; but the code base for systems like that is (presumably) so big that I wouldn't know where to start.
Any suggestions?
Update: To make it easier for people who land on this post through Google here are some OS development resources:
Writing Your Own Operating System (Thanks Adam)
Linux From Scratch (Thanks John)
SharpOS (C# Operating System) (Thanks lomaxx)
Minix3 and Minix2 (Thanks Mike)
OS Dev Wiki and Forums (Thanks Steve)
BonaFide (Thanks Steve)
Bran (Thanks Steve)
Roll your own toy UNIX-clone OS (Thanks Steve)
Broken Thorn OS Development Series
Other resources:
I found a nice resource named MikeOS, "MikeOS is a learning tool to demonstrate how simple OSes work. It uses 16-bit real mode for BIOS access, so that it doesn't need complex drivers"
Updated 11/14/08
I found some resources at Freebyte's Guide to...Free and non-free Operating Systems that links to kits such as OSKit and ExOS library. These seem super useful in getting started in OS development.
Updated 2/23/09
Ric Tokyo recommended nanoos in this question. Nanoos is an OS written in C++.
Updated 3/9/09
Dinah provided some useful Stack Overflow discussion of aspiring OS developers: Roadblocks in creating a custom operating system discusses what pitfalls you might encounter while developing an OS
and OS Development is a more general discussion.
Updated 7/9/09
LB provided a link to the Pintos Project, an education OS designed for students learning OS development.
Updated 7/27/09 (Still going strong!)
I stumbled upon an online OS course from Berkley featuring 23 lectures.
TomOS is a fork of MikeOS that includes a little memory manager and mouse support. As MikeOS, it is designed to be an educational project. It is written in NASM assembler.
Updated 8/4/09
I found the slides and other materials to go along with the online Berkeley lectures listed above.
Updated 8/23/09
All questions tagged osdev on stackoverflow
OS/161 is an academic OS written in c that runs on a simulated hardware. This OS is similar in Nachos. Thanks Novelocrat!
tangurena recommends http://en.wikipedia.org/wiki/MicroC/OS-II, an OS designed for embedded systems. There is a companion book as well.
Linux Kernel Development by Robert Love is suggested by Anders. It is a "widely acclaimed insider's look at the Linux kernel."
Updated 9/18/2009
Thanks Tim S. Van Haren for telling us about Cosmos, an OS written entirely in c#.
tgiphil tells us about Managed Operating System Alliance (MOSA) Framework, "a set of tools, specifications and source code to foster development of managed operating systems based on the Common Intermediate Language."
Update 9/24/2009
Steve found a couple resources for development on windows using Visual Studio, check out BrokenThorn's guide setup with VS 2005 or OSDev's VS Section.
Updated 9/5/2012
kerneltrap.org is no longer available. The linux kernel v0.01 is available from kernel.org
Updated 12/21/2012
A basic OS development tutorial designed to be a semester's project. It guides you through to build an OS with basic components. Very good start for beginners. Related paper. Thanks Srujan!
Updated 11/15/2013
Writing a Simple Operating System From Scratch. Thanks James Moore!
Updated 12/8/2013
How to make a computer operating system Thanks ddtoni!
Updated 3/18/2014
ToAruOS an OS built mostly from scratch, including GUI
Updated Sept 12 2016
Writing your own Toy Operating System
Updated Dec 10 2016
Writing a Simple Operating System —from Scratch (thank you #Tyler C)
There are a lot of links after this brief overview of what is involved in writing an OS for the X86 platform.
The link that appears to be most promising (www.nondot.org/sabre/os/articles) is no longer available, so you'll need to poke through the Archive.org version to read it.
At the end of the day the bootloader takes the machine code of the kernel, puts it in memory, and jumps to it. You can put any machine code in the kernel that you want, but most C programs expect an OS so you'll need to tell your compiler that it won't have all that, or the bootloader has to create some of it.
The kernel then does all the heavy lifting, and I suspect it's the example kernel you want. But there's a long way to go between having a kernel that says, "Hello world" to having a kernel that loads a command interpretor, provides disk services, and loads and manages programs.
You might want to consider subscribing to ACM to get access to their older literature - there are lots of articles in the late 80's and early 90's in early computing magazines about how to create alternative OSs. There are likely books that are out of print from this era as well. You might be able to get the same information for free by looking up the indexes of those magazines (which are available on that site - click "index" near the magazine name) and then asking around for people with a copy.
Lastly, I know that usenet is dead (for so sayeth the prophets of internet doom) but you'll find that many of the craggy old experts from that era still live there. You should search google groups (they have dejanews's old repository) and I expect you'll find many people asking the same questions a decade or 1.5 ago that you're asking now. You may even run across Linus Torvalds' many queries for help as he was developing linux originally. If searches don't bring anything up, ask in the appropriate newsgroup (probably starts with comp.arch, but search for ones with OS in the name).
Minix is a lot smaller, and designed for learning purposes, and the book to go with it is a good one too.
Update: I guess Minix 3 is a bit of a different goal, but Minix 2 (and of course the first version) were for teaching purposes.
As someone who has written a real-time multi-tasking operating system from scratch...
keyboard debounce routine, keyboard driver, disk driver, video driver, file system, and finally a boot-loader - and that's just to launch it for the first time with nothing to do!
... I cannot emphasize enough how important it is to get familiar with the hardware! This is especially so if you really want to do it all yourself instead of just picking up a primitive system someone else has already laid out for you. For example, contact Intel and ask them for a CPU card for your type of CPU! This will lay it out for you - the "pin-outs", interrupts, opcodes, you name it!
Remember the hardware makes it all possible. Study the hardware. You won't regret it.
.
Write a microcontroller OS. I recommend an x86 based microcontroller. A modern OS is just huge. Learn the basics first.
I wish there was one place to get all of the info about developing your own OS. The closest to come to that is OS Dev Wiki and Forums. They offer a ton of good information regarding the setup, development, and device hardware information.
Also there are some great tutorials at BoneFide, I've used the getting started tutorial by Bran, and am now looking at a more recent one based on his called Roll your own toy UNIX-clone OS.
I second checking out: "Operating Systems : Design and Implementation"
And if you want to develop on Windows, check out jolson's blog post.
Edit:
For development on windows using Visual Studio, check out BrokenThorn's guide or OSDev's wiki.
An excellent resource is the material of the MIT course 6.828: Operating System Engineering.
XV6 - simple Unix-like teaching OS written in ANSI C for x86
http://pdos.csail.mit.edu/6.828/2012/xv6.html
XV6 source - as a printed booklet with line numbers
http://pdos.csail.mit.edu/6.828/2012/xv6/xv6-rev7.pdf
XV6 book - explains the main ideas of os design
http://pdos.csail.mit.edu/6.828/2012/xv6/book-rev7.pdf
The material is compact: 92 pages source and 96 pages commentary.
I like it more than the Minix book! It's a true gem!
you also might want to take a look at SharpOS which is an operating system that they're writing in c#.
There are good resources for operating system fundamentals in books. Since there isn't much call to create new OS's from scratch you won't find a ton of hobbyist type information on the internet.
I recommend the standard text book, "Modern Operating Systems" by Tanenbaum. You may also be able to find "Operating System Elements" by Calingaert useful - it's a thin overview of a book which give a rough sketch of what an OS is from a designer's standpoint.
If you have any interest in real time systems (and you should at least understand the differences and reasons for real time OS's) then I'd also recommend "MicroC/OS-II" by Labrosse.
Edit:
Can you specify what you mean by "more technical"? These books give pseudo code implementation details, but are you looking for an example OS, or code snippets for a particular machine/language?
-Adam
Just coming from another question. I'd like to mention Pintos... I remembered my OS course with Nachos and Pintos seems to be the same kind of thing that can run on x86.
I found Robert Love's Linux Kernel Development quite interesting. It tells you about how the different subsystems in the Linux kernel works in a very down-to-earth way. Since the source is available Linux is a prime candidate for something to hack on.
Here are some other Stack Overflow pages worth incorporating into this discussion:
Roadblocks in creating a custom operating system
Developing an operating system for the x86 architecture
My operating systems course in undergrad had us building a number of subsystems for OS/161, a simple, BSD-like kernel that provides some of the basics while leaving the freedom to explore various design space decisions in implementing higher-level services.
Start hacking away at Minix. It's a lot smaller than Linux (obviously) and it's designed with teaching purposes in mind (some, at least). Not Minix 3 though, that's a whole different story.
Already answer, but when I took Operating Systems in college we started with an early linux kernel and added simplistic modern features (basic file systems, virtual memory, multitasking, mutexes). Good fun. You get to skip some of the REALLY crazy low level assembly only stuff for mucking w/ protected mode and page tables while still learned some of the guts.
http://kerneltrap.org/node/14002
http://kerneltrap.org/files/linux-0.01.tar.bz2
I would like to include this repo How-to-Make-a-Computer-Operating-System by Samy Pesse. Is a work-in-progress. Very interesting.
You might want to look at linuxfromscratch.
Linux From Scratch (LFS) is a project
that provides you with step-by-step
instructions for building your own
custom Linux system, entirely from
source code.
A simple and basic OS development tutorial designed to be a semester's project. It guides you through to build an OS with basic components. Very good start for beginners. Related paper is here.
One reasonably simple OS to study would be µC/OS. The book has a floppy with the source on it.
http://en.wikipedia.org/wiki/MicroC/OS-II
Check out the Managed Operating System Alliance (MOSA) Project at www.mosa-project.org. They are designing an AOT/JIT compiler and fully managed operating system in C#. Some of the developers are from the inactive SharpOS project.
I've toyed with Cosmos, which is "an operating system project implemented completely in CIL compliant languages." It's written in C#, so that was right up my alley. For someone like myself who has never attempted to build an operating system, it was actually pretty cool to be able to get a "Hello World" operating system running in no time.
Check out this site: http://osix.net/modules/article/?id=359
As mentioned above, the OSDev Wiki is (by far) the best source for OS development. For those of you who speak German, the lowlevel.eu Wiki is also great. Something relatively unknown Incitatus OS, a simple kernel with a tiny set of userspace apps. It's great to use for getting into the complicated topic of OS development.
Movitz is a Lisp environment written in Common Lisp and running "on the metal". Unfortunately, some links on the Movitz main page deny access, but you can find instructions on how to download and compile the source code from the trac page. Also, a ready image can be found on the archive of this page.
IMHO this is utmost interesting, as it brings back the Lisp machine concept on the currently available hardware. It failed commercially, but this does not prove to me that the idea was bad.
The Unix haters handbook is a fun book that semi-seriously berates the concept of Unix and its derivatives. Many sections argument about how better the Lisp machine concept was.
Here's a paper called "Writing a Simple Operating System From Scratch". It covers writing a bootloader, entering x86-32 protected mode, and writing a basic kernel in C. It seems to do a good job at explaining everything in detail.
The x86 JS simulator and ARM simulator can also be very useful to understand how different pieces hardware works and make tests without exiting your favourite browser.
Intresting Question for the programmers. See it will take long long long time to build OS like Windows or Mac but if you want build a simple ones then you can try your best
You need to focus on Assembly Language,C and C++. You should be expert in these languages.
First read a good book on how OS works[Google it], then read all the info from Wiki OS
Search in youtube "How to create your own OS in Assembly Language" watch the video, Eg. Video
Download Linux OS source code and compile it yourself and try to modify the code yourself
Now you are an experienced OS editor now download Minix and QNX and start developing with them and get their docs from here Minix Doc and QNX Doc
Now you have gained the master degree(Not completely just a little more to go) in creating OS now distribute this knownledge to your freinds and with their help try to create an OS as powerful as Mac, Linux or Windows
When you have made a basic operating system it's actually hard to continue because there isn't many ressources on making GUIs or porting libraries. But i think taking a look at ToAruOS would help a lot!
The code under the surface of that OS is so damn simple! but at the same time he has ported things like cairo, python, (not yet but soon) sdl, made share memory and he has also made his own widget toolkit. It's all written in C.
Another interesting OS would be pedigreeOS. It's made by JamesM (the man behind jamesM's kernel tutorial. While it has more features than ToaruOS it's also bigger and more confusing.
But anyway these 2 OS will help you a lot especially ToAruOS.
When I started working on my basic operating systems I needed a basic guide like Stepping stones for a basic operating system. It helped me not loose my head.
That if you want to make it from absolutely nothing (pure assembly code)